Проводя собеседования, постоянно сталкиваюсь с тем что соискатели знают о DNS только то что он превращает имена доменов (например google.com) в IP адреса (173.194.32.165). А как это происходит, мало кто может объяснить. Даже те кто может, допускают массу неточностей.
В этой заметке я не буду рассказывать о ресурсных записях, сосредоточимся на процессе — как из DNS выгребаем IP адрес для домена.
Спасибо за внимание!
В этой заметке я не буду рассказывать о ресурсных записях, сосредоточимся на процессе — как из DNS выгребаем IP адрес для домена.
- Когда вводим адрес сайта в браузер, например habrahabr.ru, он пытается выяснить IP адрес домена, используя системный вызов getaddrinfo, gethostbyname или подобный.
- Сначала смотрим в файле hosts соответствие домена IP адресу. Это исторический момент, еще с тех пор когда не было DNS — соответствия доменов IP адресам закачивались с централизованного сервера. Удобно при переносе сайта на другой хостинг в файле hosts указать новый IP для домена и протестировать работу сайта на новой площадке. Файл hosts это НЕ часть DNS. Если DNS это человек, то файл hosts это хвост.
- Если в фале hosts соответствий нет, направляется рекурсивный запрос DNS серверу, еще такой сервер часто называют резолвер (resolver). DNS серверы всегда указываются при настройке сети. Вот у этих серверов мы и спрашиваем - какой IP адрес у домена habrahabr.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 знает где дальше искать информацию о домене второго уровня, в нашем случае habrahabr.ru. Серверы имен для домена настраиваются у регистратора домена, собственно, это позволяет делегировать домен, т.е. передавать управление зоной серверам имен. TLD DNS возвращает серверы имен для нашего домена, которые уже знают IP:
$ nslookup -q=ns habrahabr.ru. a.dns.ripn.net. Server: a.dns.ripn.net. Address: 193.232.128.6#53 Authoritative answers can be found from: HABRAHABR.RU nameserver = ns3.habradns.net. HABRAHABR.RU nameserver = ns1.habradns.net. HABRAHABR.RU nameserver = ns2.habradns.net.
- Так были найдены серверы имен для домена, которые вернут IP адрес. IP возвращается резолвером. Теперь браузер может установить соединение.
$ nslookup -q=a habrahabr.ru. ns1.habradns.net. Server: ns1.habradns.net. Address: 88.198.175.104#53 Name: habrahabr.ru Address: 178.248.237.68
Спасибо за внимание!
Поделиться с друзьями