DNS
Рекурсия, типы записей, кэш и TTL — то место, где ломается половина инцидентов.
Учить эту тему-
Что такое рекурсивный DNS?
juniorРекурсивный резолвер сам проходит цепочку root → TLD → authoritative и возвращает клиенту готовый IP. Клиент задаёт один вопрос и ждёт финальный ответ. Итеративный сервер вместо ответа отдал бы ссылку на следующий сервер в цепочке.
-
Как работает DNS?
juniorКлиент → локальный резолвер (/etc/resolv.conf) → root → TLD (.ru) → authoritative сервер зоны. Каждый ответ кэшируется на время TTL, поэтому повторные запросы быстрые. Резолвер собирает цепочку и отдаёт клиенту итоговый адрес.
Клиент спрашивает резолвер из своих настроек, тот идёт по цепочке: корневые серверы, серверы зоны верхнего уровня, авторитативный сервер домена. Ответ возвращается клиенту и кэшируется на время TTL.
Механика. Клиент задаёт один рекурсивный вопрос, всю цепочку проходит резолвер — это и называется рекурсией. Сами серверы между собой общаются итеративно: корневой не идёт никуда сам, он лишь отвечает «спроси у серверов зоны .ru». Кэш живёт на каждом шаге, поэтому смена записи расходится не мгновенно, а за время TTL, и именно поэтому TTL снижают заранее, до переезда.
Где ловят. Вопросом «почему после смены A-записи половина пользователей идёт на старый адрес». Причина не в DNS-сервере, а в кэшах: у резолвера провайдера, у операционной системы, у браузера, а иногда и в самом приложении, которое резолвит имя один раз при старте.
Разбор «почему так» открыт по подписке.
-
Какие типы DNS-записей существуют?
juniorA (IPv4), AAAA (IPv6), CNAME (alias на другое имя), MX (почтовый сервер), TXT (произвольный текст, SPF/DKIM), NS (серверы зоны), PTR (обратное преобразование IP в имя).
-
Что такое FQDN?
juniorFully Qualified Domain Name - полное имя с корневой точкой в конце: www.example.com. Однозначно задаёт позицию в дереве DNS, без достройки суффиксами. Относительное имя (www) резолвер дополняет search-доменом из конфига.
-
Что такое TTL в IP-пакете?
juniorСчётчик, уменьшается на 1 на каждом хопе. Когда доходит до 0, пакет отбрасывается, а отправителю летит ICMP Time Exceeded. Защита от вечного кружения пакетов по петле маршрутизации. На этом эффекте построен traceroute.
Счётчик хопов в заголовке IP. Каждый маршрутизатор уменьшает его на единицу, и при нуле пакет отбрасывается, а отправителю уходит ICMP Time Exceeded.
Механика. Это защита от вечного кружения пакета при петле маршрутизации: без счётчика ошибочная маршрутизация забила бы канал навсегда. На этом же построен traceroute: он шлёт пакеты с TTL 1, 2, 3 и так далее, и каждый следующий маршрутизатор сам сообщает о себе, отбрасывая пакет.
Где ловят. Путаницей с TTL в DNS. Там это время жизни записи в кэше в секундах, здесь — количество разрешённых переходов. Одно имя, разные сущности, и на собеседовании любят проверить, различаешь ли ты их.
Разбор «почему так» открыт по подписке.
-
Почему DNS использует UDP?
middleЗапрос и ответ обычно помещаются в один датаграмму, а UDP не тратит время на установку соединения: резолв укладывается в один round-trip вместо трёх. Серверу при этом не надо держать состояние на каждого клиента, что важно при десятках тысяч запросов в секунду. Старый лимит ответа в 512 байт снят расширением EDNS0, а если ответ всё равно не влезает, сервер выставляет флаг TC (truncated) и клиент переспрашивает по TCP — по TCP же идут зонные передачи (AXFR). Обратная сторона отсутствия соединения — лёгкость подмены ответов и амплификации, отсюда DNSSEC для подписи данных и DoT/DoH для шифрования запросов.
Потому что запрос и ответ обычно помещаются в одну датаграмму, а UDP не тратит время на установку соединения: резолв укладывается в один обмен вместо четырёх пакетов.
Механика. Классический ответ ограничен 512 байтами, современный с расширением EDNS0 — обычно 1232 байтами. Если ответ не влезает, сервер выставляет флаг усечения, и клиент повторяет запрос по TCP. По TCP же идут передачи зон между серверами. Отсутствие соединения даёт и обратную сторону: подделать ответ проще, поэтому появились случайные порты источника, DNSSEC, а следом DNS поверх TLS и HTTPS.
Где ловят. Уверенным «DNS всегда UDP». Правильнее: UDP по умолчанию, TCP как запасной путь при усечении и для служебных операций, и это поведение описано в стандарте, а не является оптимизацией конкретной реализации.
Разбор «почему так» открыт по подписке.
-
Как хост резолвит DNS по умолчанию?
middleПорядок источников задаёт строка `hosts:` в `/etc/nsswitch.conf`, обычно `files dns`: сначала `/etc/hosts`, потом DNS. Адреса серверов резолвер берёт из `/etc/resolv.conf`; на системах с systemd-resolved этот файл — заглушка с адресом 127.0.0.53, а реальные upstream-серверы показывает `resolvectl status`. К именам без точки применяются `search`-домены из resolv.conf, поэтому `ping app` может неожиданно уехать в `app.corp.local`. Отсюда классическое расхождение при отладке: `getent hosts имя` идёт полным путём через nsswitch и видит `/etc/hosts`, а `dig` бьёт прямо в DNS-сервер и файл игнорирует.