Проводя собеседования, постоянно сталкиваюсь с тем что соискатели знают о DNS только то что он превращает имена доменов (например google.com) в IP адреса (173.194.32.165). А как это происходит, мало кто может объяснить. Даже те кто может, допускают массу неточностей.

В этой заметке я не буду рассказывать о ресурсных записях, сосредоточимся на процессе — как из DNS выгребаем IP адрес для домена.

  1. Когда вводим адрес сайта в браузер, например habrahabr.ru, он пытается выяснить IP адрес домена, используя системный вызов getaddrinfo, gethostbyname или подобный.

  2. Сначала смотрим в файле hosts соответствие домена IP адресу. Это исторический момент, еще с тех пор когда не было DNS — соответствия доменов IP адресам закачивались с централизованного сервера. Удобно при переносе сайта на другой хостинг в файле hosts указать новый IP для домена и протестировать работу сайта на новой площадке. Файл hosts это НЕ часть DNS. Если DNS это человек, то файл hosts это хвост.

  3. Если в фале hosts соответствий нет, направляется рекурсивный запрос DNS серверу, еще такой сервер часто называют резолвер (resolver). DNS серверы всегда указываются при настройке сети. Вот у этих серверов мы и спрашиваем - какой IP адрес у домена habrahabr.ru? Отправляя рекурсивный запрос, мы говорим DNS-серверу что ждем от него IP адрес, либо ошибку.

  4. Если 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, можно проверить у себя.

  5. Каждый 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
    

  6. Каждый из 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.

  7. Так были найдены серверы имен для домена, которые вернут 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

Спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (0)