Как на самом деле работает DNS?
Проводя собеседования, постоянно сталкиваюсь с тем что соискатели знают о DNS только то что он превращает имена доменов (например google.com) в IP адреса (173.194.32.165). А как это происходит, мало кто может объяснить. Даже те кто может, допускают массу неточностей.
Цель этой заметки - кратко по шагам показать как работает DNS. Без лонгридов, исторических справок и забавных случаев из жизни.
- Когда вводим адрес сайта в браузер, например justhost.ru, он начинает выяснять IP адрес домена, используя системный вызов getaddrinfo, gethostbyname или подобный.
- Сначала смотрим в файле hosts соответствие домена IP адресу. Это исторический момент, еще с тех пор когда не было DNS - соответствия доменов IP адресам закачивались с централизованного сервера. Удобно при переносе сайта на другой хостинг в файле hosts указать новый IP для домена и протестировать работу сайта на новой площадке. Файл hosts это НЕ часть DNS. Если DNS это человек, то файл hosts это хвост.
- Если в фале hosts соответствий нет, направляется рекурсивный запрос DNS серверу, еще такой сервер часто называют резолвер (resolver). DNS серверы всегда указываются при настройке сети. Вот у этих серверов мы и спрашиваем - какой IP адрес у домена justhost.ru? Отправляя рекурсивный запрос, мы говорим DNS-серверу что ждем от него IP адрес, либо ошибку.
- Если DNS-сервер ни чего не знает об этом домене, он спрашивает у root-серверов интернета - дайте мне информацию о зоне .ru! Стоп. Стоп. Что еще за root-серверы интернета?
$ nslookup -q=ns . Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: nameserver = a.root-servers.net. nameserver = b.root-servers.net. nameserver = c.root-servers.net. nameserver = d.root-servers.net. nameserver = e.root-servers.net. nameserver = f.root-servers.net. nameserver = g.root-servers.net. nameserver = h.root-servers.net. nameserver = i.root-servers.net. nameserver = j.root-servers.net. nameserver = k.root-servers.net. nameserver = l.root-servers.net. nameserver = m.root-servers.net.
Эти рутовые серверы и их IP хранятся в специальном кеше, который ставится вместе с установкой, например, bind. Секция zone "." в файле named.conf, можно проверить у себя. - Каждый root-сервер хранит информацию обо всех Top Level Domains (TLD), таких как .ru, .com и тд. Рутовый сервер ответил, что информацию о доменах в зоне .ru можно спросить у TLD DNS серверов, т.е. у серверов, которые обслуживают эту зону:
$ nslookup -q=ns ru. a.root-servers.net. Server: a.root-servers.net. Address: 198.41.0.4#53 Authoritative answers can be found from: ru nameserver = a.dns.ripn.net. ru nameserver = e.dns.ripn.net. ru nameserver = f.dns.ripn.net. ru nameserver = d.dns.ripn.net. ru nameserver = b.dns.ripn.net. a.dns.ripn.net internet address = 193.232.128.6 a.dns.ripn.net has AAAA address 2001:678:17::193:232:128:6 e.dns.ripn.net internet address = 193.232.142.17 e.dns.ripn.net has AAAA address 2001:678:15::193:232:142:17 f.dns.ripn.net internet address = 193.232.156.17 f.dns.ripn.net has AAAA address 2001:678:14::193:232:156:17 d.dns.ripn.net internet address = 194.190.124.17 d.dns.ripn.net has AAAA address 2001:678:18::194:190:124:17 b.dns.ripn.net internet address = 194.85.252.62 b.dns.ripn.net has AAAA address 2001:678:16::194:85:252:62
- Каждый из TLD DNS знает где дальше искать информацию о домене второго уровня, в нашем случае justhost.ru. Серверы имен для домена настраиваются у регистратора домена, собственно, это позволяет делегировать домен, т.е. передавать управление зоной серверам имен. TLD DNS возвращает серверы имен для нашего домена, которые уже знают IP:
$ nslookup -q=ns justhost.ru. a.dns.ripn.net. Server: a.dns.ripn.net. Address: 193.232.128.6#53 Authoritative answers can be found from: JUSTHOST.RU nameserver = ns2.justhost.RU. JUSTHOST.RU nameserver = ns1.justhost.RU. ns1.JUSTHOST.RU internet address = 46.17.46.200 ns2.JUSTHOST.RU internet address = 46.17.40.200
- Так были найдены серверы имен для домена, которые вернут IP адрес. IP возвращается резолвером. Теперь браузер может установить соединение.
$ nslookup -q=a justhost.ru. ns1.justhost.ru. Server: ns1.justhost.ru. Address: 46.17.46.200#53 Name: justhost.ru Address: 46.17.40.119