usepoint
menu

DNS: телефонная книга интернета

Каждый день вы вводите в браузере доменные имена, но компьютеры понимают только цифры. Кто и как за миллисекунды переводит google.com в IP-адрес? Всё это делает DNS - распределённая система, без которой интернет бы не работал.

dns

Содержание:

До этого мы говорили как данные бегают по сети, что такое IP-адрес и как работает транспорт (TCP/UDP).

Теперь разберёмся с тем, что пользователь видит каждый день - доменные имена:

  • google.com
  • example.org
  • api.myproject.internal

Компьютеры общаются по IP-адресам, но людям удобнее работать с именами

Механизм, который связывает имя и IP-адрес, называется DNS.

Что такое DNS

Начнём с терминов.

Доменное имя - читаемый человеком текстовый адрес сервиса в сети.
Примеры:

  • example.com
  • ya.ru
  • api.myproject.local

IP-адрес - числовой адрес устройства в сети (мы уже разбирали: 203.0.113.42 и т.п.).

DNS (Domain Name System) - система, которая отвечает за то, чтобы по доменному имени найти соответствующий IP-адрес и вернуть его тому, кто спрашивает.

DNS можно представить как «телефонный справочник интернета», который по имени (example.com) говорит «у этого имени IP такой-то (93.184.216.34)».

Но это не один большой сервер, а распределённая система: множество DNS-серверов по всему миру, у каждого из которых своя зона ответственности. Они общаются друг с другом по определённым правилам.

Как выглядит DNS-запрос

DNS-запрос - это вопрос в стиле «Какой IP-адрес соответствует доменному имени example.com

Его отправляет либо операционная система, либо браузер/приложение через ОС.

Запрос содержит доменное имя (example.com), тип записи, которую мы ищем (например, IP-адрес) и дополнительные служебные поля.

Ответ содержит найденный IP-адрес (или несколько) и информацию о том, как долго можно хранить этот ответ (время жизни - TTL).

Немного про структуру доменных имён

Чтобы понимать, как распределена ответственность, надо разобрать, из чего состоит доменное имя.

Возьмём пример: www.shop.example.com.

Разбираем справа налево:

  • .com - зона верхнего уровня (top-level domain, TLD):
    • это общая зона для всех доменов, оканчивающихся на .com;
  • example.com - доменное имя второго уровня:
    • владелец этого домена может создавать внутри него свои поддомены;
  • shop.example.com - поддомен (subdomain):
    • часть пространства внутри example.com;
  • www.shop.example.com - ещё более вложенный поддомен.

Ответственность за разные «кусочки» делится между разными DNS-серверами - одни отвечают за .com, другие знают, кто отвечает за example.com, а третьи знают, какие IP-адреса у shop.example.com.

Типы DNS-серверов

Слово «DNS-сервер» - общее. На деле есть разные роли.

Разберём главные:

1) Рекурсивный резолвер (recursive resolver)

Это DNS-сервер, к которому обращается ваш компьютер.

Обычно это DNS-сервер вашего провайдера, публичный DNS (например, 8.8.8.8 от Google) или корпоративный DNS в вашей компании.

Рекурсивный значит, что «если я сам не знаю ответ, я пойду спрашивать других DNS-серверов, пока не найду окончательный ответ, и принесу его тебе».

Именно сюда идёт первый DNS-запрос от вашего устройства.

2) Авторитетный DNS-сервер (authoritative server)

Этот сервер официально отвечает за какой-то домен/зону (например, за example.com). Он хранит записи: какой IP у example.com, какой IP у www.example.com, кто ещё авторитетен для этой зоны и т.п.

Авторитетный значит «я - источник правды для этого домена.
Если кто-то будет спорить, правым считаюсь я».

3) Кэширующий сервер

Любой рекурсивный сервер по факту и есть кэширующий. Когда он один раз выяснил, что «example.com93.184.216.34», он запоминает (кеширует) этот ответ на некоторое время. Пока ответ не устарел, сервер не будет ходить по всем уровням снова, а будет отдавать ответ из кеша.

Это сильно снижает нагрузку на всю инфраструктуру DNS.

Как работает разрешение доменных имён (по шагам)

Теперь соберём всё в последовательную историю: что происходит, когда вы в браузере набираете example.com и нажимаете Enter.

Будем считать, что ОС и браузер ещё не знают IP этого домена и в локальном кеше пусто.

Шаг 0. Проверка локальных кэшей

Перед тем как лезть в сеть, система проверяет:

  1. Кеш браузера
    • Некоторые браузеры сами запоминают сопоставления «имя → IP» на короткое время.
  2. Кеш операционной системы
    • ОС хранит таблицу недавно разрешённых имён;
    • если имя ещё не «протухло», берём IP оттуда.

Если IP уже есть - DNS-запрос «наружу» не нужен.
Если нет - идём дальше.

Шаг 1. Обращение к рекурсивному DNS-серверу

ОС знает адрес рекурсивного DNS-сервера, обычно:

  • это IP роутера (домашняя/офисная сеть),
  • или DNS-провайдера,
  • или заданный вручную публичный DNS (8.8.8.8, 1.1.1.1 и т.п.).

ОС формирует DNS-запрос «Какой IP-адрес у example.com?» и отправляет его на этот DNS-сервер. Этот сервер - наш точка входа в DNS-мир.

Шаг 2. Кеш рекурсивного сервера

Первым делом рекурсивный сервер смотрит свой кеш:

  • если он недавно уже узнавал IP example.com, то он просто возвращает сохранённый результат;
  • если в кеше записи нет или она просрочена, то сервер начнёт искать ответ дальше «по цепочке» DNS.

Как сервер понимает, «просрочена» запись или нет?
Для этого в DNS-ответе есть TTL.

TTL (Time To Live) - время жизни DNS-записи в секундах. Это значение задаёт владелец домена на своём авторитетном сервере.

Шаг 3. Обращение к корневым серверам (root servers)

Если в кеше пусто, рекурсивный сервер начинает полноценное разрешение.

DNS устроен как иерархическое дерево. На вершине - корневые серверы (root DNS servers). Их немного, они распределены по миру и обслуживают зону . (корень). Они не знают IP всех доменов, но знают кто отвечает за зоны верхнего уровня: .com, .org, .ru и т.д.

Рекурсивный сервер обращается к корневому: «Мне нужен IP example.com. Подскажи, кто отвечает за зону .com?». Корневой сервер отвечает: «За .com отвечают вот такие TLD-серверы. Вот их адреса.»

Шаг 4. Обращение к серверам зоны верхнего уровня (TLD)

Теперь рекурсивный сервер идёт к одному из TLD-серверов для .com.

TLD-серверы - это DNS-серверы, которые отвечают за зону верхнего уровня: .com,.org,.ru и т.п.

Рекурсивный сервер спрашивает «Мне нужен IP example.com. Кто авторитетен для именно example.com?». TLD-сервер отвечает «Авторитетными DNS-серверами для example.com являются: ns1.provider.net, ns2.provider.net (и их IP)».

Шаг 5. Обращение к авторитетному серверу домена

Теперь рекурсивный сервер идёт к авторитетному DNS-серверу для example.com. Это тот сервер, где владелец домена (или его хостинг-провайдер) настроил запись «имя → IP».

Рекурсивный сервер спрашивает «Какой IP-адрес у example.com?
(Тип записи: A - IPv4 или AAAA - IPv6)»

Авторитетный сервер отвечает «example.com93.184.216.34,
TTL = 3600 секунд (1 час).»

Шаг 6. Кеширование и ответ клиенту

Получив ответ, рекурсивный сервер сохраняет запись в своём кеше (с TTL, который указал авторитетный сервер), чтобы при следующем запросе не ходить по цепочке заново. Затем он отправляет IP-адрес назад на ваш компьютер. Операционная система тоже может сохранить запись в своём локальном кеше, а браузер - в своём (в зависимости от настроек).

С этого момента, пока TTL не истёк, запросы к example.com чаще всего будут отрабатываться из кеша (либо на вашем компьютере, либо на DNS-сервере провайдера).

Типы DNS-записей (вкратце, без углубления)

Чтобы было понятно, что именно хранит авторитетный DNS-сервер, посмотрим на основные типы записей.

DNS-запись - это строка вида «для этого имени - такие-то данные».

Часто встречаются:

  • NS-запись
    • определяют DNS-серверы, которые являются авторитативными для данной зоны.
  • A-запись
    • сопоставляет доменное имя IPv4-адресу;
    • пример: example.com → 93.184.216.34.
  • AAAA-запись
    • то же самое, но для IPv6;
    • пример: example.com → 2001:db8::1234.
  • CNAME-запись (canonical name)
    • по сути «псевдоним» на другое доменное имя
    • пример: www.example.com → example.com, а уже example.com имеет свою A/AAAA-запись
  • MX-запись
    • указывает почтовые серверы для домена;
    • пример: example.com → mail.example.com (принимать почту).
  • TXT-запись
    • произвольный текст;
    • часто используется для подтверждения владения доменом, настроек SPF, DKIM и прочих штук для почты и безопасности.

Пока для общей картины нам важно, что DNS - это не только «имя → IP», но и другие сведения о домене. Но IP-записи (A/AAAA) - базовый случай.

Что важно знать про DNS с практической точки зрения

  1. DNS - это первый шаг почти любого сетевого общения по имени.
    Если DNS не работает, сайт может быть жив, сервер отвечает, но пользователи не могут до него «дозваться по имени». В браузере вы увидите “не удаётся найти адрес сервера”.
  2. DNS - частая причина «странных» проблем.
    Примеры: у одних пользователей сайт открывается, у других нет; часть запросов идёт на старый сервер, часть - на новый; из одного региона всё ок, из другого - нет.
    Чаще всего стоит проверить какие DNS-серверы использует пользователь, что у них лежит в кешах, какой TTL у записей домена.
  3. DNS - важная часть инфраструктуры и безопасности.
    Через DNS управляют какими именами пользуются сервисы, куда смотрят внутренние домены, как ходит почта, какие проверки безопасности включены.
    Компрометация DNS - это почти всегда тяжёлый инцидент: злоумышленник может «перекинуть» домен на свой IP и пользователи попадут на фальшивый сайт.
  4. При миграциях и релизах изменения в DNS - отдельная тема.
    В план миграции часто включают уменьшение TTL заранее, смену A/AAAA-записей и наблюдение за трафиком на новые и старые IP.