Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 10.01 · 18 мин
Начальный
DNSRoot ServersTLDsResolversNetworking

DNS-иерархия — root, TLD, authoritative, recursive resolvers

Когда ты вводишь в браузере github.com, происходит маленькое чудо: твой компьютер где-то узнаёт, что этому имени соответствует IP-адрес 140.82.114.4, и идёт по нему. Этот процесс называется DNS resolution (резолв DNS), и его обеспечивает одна из самых старых и важных систем интернета — DNS (Domain Name System).

DNS — это распределённая иерархическая база данных. Никто не хранит «полную таблицу» соответствий имён и IP-адресов. Информация разбросана по миллионам серверов по всему миру. Запросы маршрутизируются между ними по строгой иерархии. И вся эта махина обслуживает триллионы запросов в день, обычно за десятки миллисекунд.

В этом уроке разберём, как устроена иерархия: что такое root-серверы, как работают TLD, кто такие authoritative и recursive resolvers, и почему вся система не падает каждый день несмотря на её размеры.


Зачем нужен DNS

В сети есть IP-адреса (например, 140.82.114.4) — это то, чем оперируют сетевые протоколы. Но человеку запомнить десятки IP — невозможно. Поэтому изначально, ещё в 70-х в ARPANET, использовался файл HOSTS.TXT, где каждый администратор сети поддерживал список имён и адресов. Этот файл распространялся между всеми хостами.

С ростом сети это стало проблемой:

  1. Coordination cost. Все администраторы должны соглашаться на изменения. Реальная коллаборация невозможна на масштабе.
  2. Update propagation. Файл обновляется раз в неделю — изменения медленные.
  3. Single point of failure. Хост, на котором лежит мастер-копия, — bottleneck.
  4. Name conflicts. Кто решает, что mail — это твой сервер или мой?

В 1983 Пол Мокапетрис описал DNS — распределённую иерархическую систему, которая решает все эти проблемы. С тех пор она почти не менялась в архитектурном плане, только добавлялись расширения.


Иерархия — пирамида имён

DNS-имя — это последовательность меток (labels), разделённых точками. Например, www.github.com состоит из:

  • www — самая «глубокая» метка.
  • github — субдомен.
  • com — Top-Level Domain (TLD).
  • (после com есть невидимая точка — это root.)

Полное «техническое» имя — www.github.com. (с точкой в конце), это FQDN (Fully Qualified Domain Name). Точка в конце — это root-зона. Обычно её опускают для удобства.

DNS-иерархия -- пирамида от root до конкретных имён
root (.)Корневая зона. Управляется ICANN. 13 логических root-серверов (a.root-servers.net до m.root-servers.net), каждый -- anycast из сотен физических серверов. Знает только TLDs (.com, .org, .net, .ru, ...)
.comGeneric TLD. Управляется Verisign. Хранит NS-записи всех доменов .com (миллионы зон). Не знает www.github.com -- только адреса NS-серверов GitHub
.ruCountry code TLD (ccTLD) России. Управляется Координационным центром национального домена сети Интернет. Аналогично .com, но в национальной юрисдикции
.org, .net, ...Другие TLD. Сейчас существует ~1500 TLDs включая generic (.com, .net, .org), country-code (.ru, .uk, .de), и new gTLDs (.app, .dev, .ai)
github.comЗона github.com. Управляется владельцем (GitHub). Имеет authoritative-серверы (например, dns1.p08.nsone.net и др.), хранящие все записи zone'ы -- A, AAAA, MX, TXT, CNAME
example.ruЗона example.ru. Owned by регистрант, делегирована через .ru registry. Свои authoritative-серверы
www.github.comКонкретная запись внутри zone github.com. A: 140.82.114.4 (примерно). Запись принадлежит зоне github.com, обслуживается её authoritative-серверами
api.github.comДругая запись в той же zone. Может указывать на другой IP, другой backend

Ключевая идея: каждый уровень иерархии знает только следующий уровень. Root не знает www.github.com — он знает только, где живут TLD-серверы .com. TLD .com не знает www.github.com — он знает только NS-серверы для github.com. И только authoritative-серверы github.com знают конкретные записи.

Это даёт масштабируемость: ни один сервер не нагружается миллиардами имён. Распределение нагрузки между миллионами зон.


Root-серверы — основа всего

Root-серверы (root-servers.net) — это начало всех DNS-резолвов. Их 13 логически, обозначены буквами от a до m. Например:

  • a.root-servers.net — управляется Verisign.
  • b.root-servers.net — USC ISI.
  • c.root-servers.net — Cogent Communications.
  • m.root-servers.net — WIDE Project (Япония).

Почему «логически 13»? Физически каждый «root-server» — это anycast-кластер из сотен серверов по всему миру. Запрос к одному IP-адресу приходит на ближайший физически сервер (благодаря BGP anycast). Так что каждый из 13 root-операторов держит десятки или сотни физических серверов.

Что хранят root-серверы: только NS-записи всех TLD. Это маленькая база (~1500 TLD * несколько NS на каждый = ~10 000 записей). Поэтому root-серверы могут отвечать молниеносно.

# Посмотри root-серверы и попроси у одного из них помощь:
dig +short . NS
# Список: a.root-servers.net через m.root-servers.net

# Спроси у root, кто отвечает за .com:
dig @a.root-servers.net com NS +noall +answer +authority
# Получишь NS-записи .com (Verisign): a.gtld-servers.net и т.д.

# Заметь: root не знает www.github.com -- он знает только TLD
dig @a.root-servers.net www.github.com +noall +authority
# Получишь NS для .com (через делегирование), не сам ответ

Root-серверы — критическая инфраструктура. Их потеря не означала бы немедленный конец интернета (DNS-кэши на recursive resolvers держат данные часами/днями), но повлекла бы крах в течение суток. Поэтому root-операторы очень параноидально относятся к надёжности и распределённости.

DNS и service discovery внутри Docker

TLD-серверы — генеральные регистраторы

Под root живут TLD-серверы. Они хранят NS-записи всех доменов в своём TLD. Категории TLD:

  • Generic TLD (gTLD): .com, .org, .net, .info, .biz, и сотни «new gTLD» (.app, .dev, .ai, etc.).
  • Country-code TLD (ccTLD): .ru, .uk, .de, .cn, .jp, etc.
  • Sponsored TLD (sTLD): .gov, .edu, .mil — особые правила регистрации.
  • Infrastructure TLD: .arpa — для технических нужд (in-addr.arpa для reverse DNS).

Управление:

  • .com, .net — Verisign.
  • .org — Public Interest Registry.
  • .ru — Координационный центр национального домена.
  • Каждый ccTLD — управляется в своей стране.

Когда ты регистрируешь домен example.com через регистратора (Namecheap, GoDaddy), регистратор обращается к registry (Verisign для .com) и добавляет NS-записи: «authoritative-серверы для example.comns1.namecheap.com и ns2.namecheap.com». После этого .com-серверы знают, куда направить запросы про example.com.

# Посмотри NS-серверы для github.com на TLD-уровне:
dig @a.gtld-servers.net github.com NS +noall +authority
# Ты увидишь NS-серверы GitHub: ns-421.awsdns-52.com, ns-1707.awsdns-21.co.uk, etc.

# А теперь спроси у одного из них напрямую:
dig @ns-421.awsdns-52.com www.github.com A +noall +answer
# Получишь A-запись -- реальный IP сервера

Authoritative servers — конечная истина

Authoritative DNS-серверы — это серверы, которые владеют конкретной зоной и хранят её настоящие записи. Если ты владелец example.com, ты настраиваешь свои NS-записи на свои authoritative-серверы (или серверы DNS-провайдера — AWS Route 53, Cloudflare, Google Cloud DNS).

Authoritative-сервер для зоны знает:

  • A-записи (IPv4): www.example.com -> 1.2.3.4.
  • AAAA-записи (IPv6).
  • MX-записи (mail exchangers).
  • TXT-записи (произвольные текстовые, для SPF, DKIM, верификации).
  • CNAME-записи (псевдонимы).
  • NS-записи (делегирование субдоменов).
  • … и другие типы.

Когда recursive resolver приходит за ответом и получает «настоящий» ответ от authoritative-сервера, в DNS-ответе устанавливается флаг AA (Authoritative Answer).

# Получи ответ от authoritative-сервера и посмотри на флаги:
dig @ns-421.awsdns-52.com www.github.com A
# В выводе строка ';; flags: qr aa rd ra'
# 'aa' -- Authoritative Answer
# Это значит ответ пришёл из 'первоисточника'

# Сравни с ответом от кэша:
dig www.github.com A
# Здесь aa нет -- ответ из cache resolver'а

Один домен может иметь несколько authoritative-серверов (обычно 2-4 NS-записей) для надёжности и распределения нагрузки. Они синхронизируются через zone transfers (AXFR/IXFR).


Recursive resolver — то, что ты вызываешь

Когда твой компьютер делает DNS-запрос, он не идёт сразу в root -> TLD -> authoritative. Он идёт к recursive resolver — DNS-серверу, который делает всю работу за тебя.

Самые известные recursive resolvers:

  • 8.8.8.8 и 8.8.4.4 — Google Public DNS.
  • 1.1.1.1 и 1.0.0.1 — Cloudflare DNS (с фокусом на privacy).
  • 9.9.9.9 — Quad9 (с малware-фильтрацией).
  • DNS-серверы твоего провайдера (обычно прописаны через DHCP).
  • DNS-серверы корпоративной сети (для внутренних имён).

Recursive resolver:

  1. Получает твой запрос.
  2. Смотрит в кэш — может, уже знает ответ.
  3. Если нет — рекурсивно ходит по иерархии: root -> TLD -> authoritative.
  4. Получает ответ, кэширует с TTL.
  5. Возвращает тебе.

Recursive resolver делает за тебя 90% работы. Без него ты бы сам должен был знать всю иерархию и проходить её.

Recursive resolver -- клиентский интерфейс к иерархии
Your laptop
Recursive resolver (8.8.8.8)
Иерархия
QUERY www.github.com A?(internal recursion)A 140.82.114.4ANSWER 140.82.114.4 TTL=300

Recursive vs iterative — разница важна

В DNS есть два режима запроса:

  • Recursive (RD=1, Recursion Desired): клиент просит resolver «сделай всю работу, верни мне готовый ответ». Так работает связь client -> recursive resolver.

  • Iterative: клиент сам ходит по иерархии, на каждом сервере спрашивая «куда дальше». Так recursive resolver ходит к authoritative-серверам (root, TLD, ans).

Когда 8.8.8.8 запрашивает у root «где www.github.com?», root не делает работу за него (root не делает recursion). Root отвечает «я не знаю, но вот NS-серверы для .com — спроси у них». Это iterative ответ.

Конечный пользователь обычно делает recursive запрос. Это удобнее: одна UDP-датаграмма, один ответ. Никакая клиентская программа не знает иерархии в деталях.

# Recursive запрос (RD=1 по дефолту):
dig www.github.com
# В выводе: ';; flags: qr rd ra'
# rd = Recursion Desired (мы попросили)
# ra = Recursion Available (сервер умеет)

# Iterative запрос (RD=0):
dig +norecurse www.github.com
# Если recursive resolver, может отказаться отвечать (REFUSED).
# Если authoritative -- ответит то, что знает в своих зонах

# Понаблюдаем за iterative resolution вручную:
dig +trace www.github.com
# Это последовательно покажет каждый шаг:
# (1) root отвечает кто .com
# (2) .com отвечает кто github.com
# (3) github.com authoritative отвечает A

Зачем такая сложность

Может показаться, что 4-уровневая иерархия (root -> TLD -> authoritative -> record) с двумя видами серверов (recursive и authoritative) — избыточно. Но это и есть гениальность дизайна:

  1. Distributed. Никто не хранит всю базу. Нагрузка распределена между миллионами серверов.
  2. Self-managing. Владелец example.com сам управляет своими записями, не нужно соглашений с глобальным админом.
  3. Scalable. Добавь новый TLD, новый домен — иерархия выдержит без изменений.
  4. Failure-isolated. Падение authoritative-сервера example.com влияет только на этот домен. Падение TLD .com влияет на .com (миллионы доменов), но всё ещё не на root и не на другие TLD.
  5. Caching-friendly. Каждый уровень кэшируется на recursive resolver’ах с TTL. На каждый запрос не нужно ходить через всю иерархию.

DNS работает уже больше 40 лет с этой архитектурой. Это один из самых удачных дизайнов в истории интернета.

CoreDNS в Kubernetes: internal service discovery

Попробуй сам

# 1. Прогуляйся по DNS-иерархии вручную:
dig +trace www.github.com
# Видишь каждый шаг: root -> .com -> github.com authoritative -> answer

# 2. Спроси root-сервер напрямую:
dig @a.root-servers.net . NS
# Получишь список root-серверов

# 3. Спроси TLD-сервер напрямую:
dig @a.gtld-servers.net github.com NS
# Получишь NS-серверы github.com

# 4. Спроси authoritative напрямую:
dig @ns-421.awsdns-52.com www.github.com A
# Получишь A-запись, флаг 'aa' стоит

# 5. Сравни ответы от разных recursive resolvers:
dig @8.8.8.8 www.github.com +short
dig @1.1.1.1 www.github.com +short
# Иногда отличаются -- DNS-провайдеры могут отдавать разные IP для CDN

# 6. Посмотри свой текущий resolver:
cat /etc/resolv.conf
# (или на macOS:)
scutil --dns | head -20

# 7. Сравни время ответа cached vs first hit:
dig +stats www.example.com
dig +stats www.example.com    # повторный запрос -- из cache, быстрее

Проверка знанийKnowledge check
Junior спрашивает: 'Я зарегистрировал домен. Что значит 'настройте NS-записи на наши серверы'? И как это связано с тем, что мой сайт начнёт открываться?'
ОтветAnswer
Когда ты регистрируешь домен (скажем, mycoolsite.com через GoDaddy), GoDaddy выступает регистратором -- посредником между тобой и registry (Verisign для .com). Регистратор записывает в registry .com одну важную вещь: NS-записи для твоего домена. NS-записи (Name Server) говорят: 'для зоны mycoolsite.com authoritative-серверы -- такие-то'. Например, после регистрации в .com появится: mycoolsite.com. NS ns1.namecheap.com. mycoolsite.com. NS ns2.namecheap.com. Когда любой recursive resolver в мире (8.8.8.8, 1.1.1.1, твой провайдерский) приходит к серверу .com и спрашивает 'кто отвечает за mycoolsite.com?' -- он получает эти NS-записи. И только потом идёт к ns1.namecheap.com спросить конкретные записи (A, MX, CNAME, и т.д.). Поэтому 'настройте NS-записи на наши серверы' означает: ты говоришь registry .com, что authoritative-серверы для твоего домена живут у конкретного DNS-провайдера. Этот провайдер (Cloudflare, AWS Route 53, Namecheap) у себя на серверах хранит детальные записи: куда указывает www, какие mail-серверы, есть ли поддомены. Связь с открытием сайта: 1. У тебя есть сервер с IP 1.2.3.4. Это твой реальный физический/виртуальный сервер. 2. У провайдера DNS на authoritative-серверах прописано: www.mycoolsite.com A 1.2.3.4 mycoolsite.com A 1.2.3.4 3. Когда пользователь вводит www.mycoolsite.com в браузер: (a) Браузер просит OS resolve этого имени. (b) OS обращается к настроенному recursive resolver (например, 8.8.8.8). (c) Resolver ходит: root -> .com -> ns1.namecheap.com -> получает A=1.2.3.4. (d) Resolver возвращает 1.2.3.4 браузеру. (e) Браузер открывает TCP-соединение на 1.2.3.4:443, делает HTTPS-запрос, получает контент. Без правильных NS-записей в registry .com, второй шаг провалится -- никто не знает, у кого спросить про твой домен. Сайт не откроется. Время на 'распространение' -- это TTL кэша на старые NS-записи. До смены NS старые resolvers всё ещё кэшируют 'ns_old.example.com' и идут к нему. После TTL они снова делают запрос к .com и получают новые NS. Поэтому смена DNS-провайдера может 'распространяться' до 48 часов (хотя обычно куда быстрее). Также важно: NS-записи в registry -- это первичное. Иногда ты выставляешь их в two места (у регистратора в админке и в DNS-провайдере) -- должны совпадать. Если разнятся, могут получаться странные эффекты ('lame delegation'), когда часть resolvers видит одно, часть другое.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5