На этом занятии вы разберёте, зачем нужна система доменных имён (DNS), как устроен протокол DNS и какие типы записей используются для преобразования имён в адреса и для других задач. Материал опирается на прикладной уровень стека TCP/IP и связывает теорию с практикой: утилиты nslookup, dig, анализ пакетов в Wireshark и пошаговые действия за компьютером без сдачи файла.
На уровне интернет-протокола (IP) работа идёт с IP-адресами. Людям с ними работать неудобно: по адресу вроде 178.248.237.68 сложно понять, что это за сервер. Если указать имя habr.com, сразу ясно - сайт тематики IT.
Система доменных имён (Domain Name System, DNS) позволяет преобразовывать понятные человеку имена компьютеров в IP-адреса, с которыми работает сетевое оборудование. Дополнительно DNS даёт гибкость: один домен может соответствовать нескольким IP (балансировка), а при смене инфраструктуры меняют только записи DNS, а не ссылки у пользователей.
DNS находится на прикладном уровне в модели и стеке протоколов TCP/IP. Для взаимодействия с системой доменных имён можно использовать утилиту nslookup (name space lookup - поиск в пространстве имён): в командной строке указывают nslookup и доменное имя, для которого нужно получить IP-адрес.
Утилита nslookup есть в Windows, Linux и macOS. В Linux также часто используют host и dig - они выдают более подробную диагностическую информацию о запросах и ответах DNS.
Раньше использовали простой подход: соответствие «IP - имя» записывали в файл. В Linux это /etc/hosts, в Windows - тоже файл hosts по другому пути. В файле записывают IP-адрес и соответствующее ему имя сервера.
Недостатки такого подхода: файл быстро растёт, составить один файл для всего интернета с миллиардами устройств нереально, вносить изменения сложно, возможны конфликты имён. Для решения этих проблем была создана распределённая система доменных имён DNS.
DNS - это распределённая система: нет единого сервера, где описаны все имена; данные разнесены по большому количеству серверов в интернете. Система разделена на домены, и за каждый домен отвечает отдельная организация. Уникальность имён нужно обеспечивать только внутри одного домена.
Ещё одна особенность - надёжность: серверы DNS дублируются. Если один выйдет из строя, используются другие, и система продолжает работать.
Доменное имя состоит из частей, отделённых точкой. Например, для www.learn.example.com: com - домен верхнего уровня, example - домен второго уровня, learn - поддомен (или имя узла), www - имя хоста (часто веб-сервер). Могут быть домены третьего, четвёртого уровня - тогда компонентов больше.
Важная часть - корневой домен: самый первый домен, в который входят все домены верхнего уровня. В DNS он обозначается пустой строкой и на письме часто показывают точку в конце: www.example.com.
Доменные имена образуют иерархию в виде дерева. От корневого домена (пустая строка) идут домены верхнего уровня (TLD). Их делят на два вида: общие (gTLD) - по назначению: .com (коммерческие), .org (некоммерческие), .net (сетевые сервисы), .edu (образование), .gov (государство) и др.; и национальные (ccTLD) - по стране: .ru, .рф (Россия), .de (Германия), .uk (Великобритания). У каждой страны может быть один или несколько TLD.
Под TLD идут домены второго уровня (например yandex.ru, habr.com) - их регистрируют организации и частные лица. Внутри - поддомены и имена узлов (maps.yandex.ru, www.habr.com). Назначение: коммерческие сайты чаще в .com, российские - в .ru или .рф; образовательные и госструктуры используют .edu, .gov и национальные зоны. Дерево размещается на распределённых DNS-серверах: каждый сервер отвечает за свою зону (корень, .ru, yandex.ru и т.д.). Как клиент находит нужный сервер - описывает протокол DNS.
Устройство в сети (клиент DNS) хочет по доменному имени узнать IP-адрес. Оно обращается не ко всему дереву сразу, а к компоненту DNS resolver (резолвер, от англ. resolve - разрешать). Резолвер занимается разрешением имён: находит по имени соответствующий IP в дереве доменных имён и возвращает его клиенту.
Адрес резолвера клиент обычно получает автоматически при настройке сети (например по DHCP). Можно также указать любой доступный открытый DNS-сервер (Яндекс, Google, Cloudflare и др.).
Система доменных имён описана в документах RFC. В RFC 1034 - общие концепции DNS; в RFC 1035 - реализация и спецификация, в том числе протокол DNS. В RFC 2181 приведены уточнения к спецификации.
Протокол DNS, как и HTTP, работает по модели клиент - сервер: клиент отправляет запрос на сервер DNS, сервер возвращает ответ. На транспортном уровне DNS чаще всего использует UDP (запросы и ответы короткие), реже - TCP (большие сообщения или передача зон между серверами). Порт для обоих протоколов один - 53.
В итеративном режиме клиент отправляет запрос серверу; если сервер обслуживает нужную зону - возвращает ответ; если нет - возвращает адрес другого DNS-сервера, у которого есть более точная информация. Клиент сам обращается к следующему серверу и повторяет, пока не получит ответ.
В рекурсивном режиме сервер (резолвер), получив запрос от клиента, сам выполняет запросы к другим серверам в дереве доменных имён, находит нужный IP и возвращает его клиенту. Обычно клиенты используют именно рекурсивный режим, обращаясь к резолверу, а резолверы общаются с авторитетными серверами зон.
Часто выполняются запросы к одному и тому же доменному имени. Резолвер после получения IP сохраняет результат в кэше. При следующем запросе для того же имени он может отдать адрес из кэша, не обращаясь снова к распределённым серверам - это ускоряет работу и снижает нагрузку.
Из-за кэширования различают два типа ответов: авторитетный (получен от сервера, который обслуживает данную зону, данные из конфигурации) и неавторитетный (ответ из кэша другого сервера; данные могли устареть, но на практике редко). В выводе nslookup неавторитетный ответ часто помечают как «не заслуживающий доверия».
В отличие от HTTP, где данные часто передаются в текстовом виде, DNS использует бинарный формат. Пакет состоит из заголовка и тела. Размер заголовка и полей в нём фиксирован; отдельные поля в теле тоже имеют строго определённый формат.
Заголовок DNS имеет длину 12 байт и содержит: идентификатор (номер пакета, по нему связывают запрос и ответ), флаги (тип сообщения, коды операций и т.д.), количество запросов, ответов, записей об авторитетных серверах и дополнительных записях.
В теле сообщения DNS есть четыре секции: запросы (для какого имени ищем IP), ответы (сами данные - IP или другая информация), авторитетные серверы (указание, откуда получен ответ) и дополнительные записи (полезная информация, не входящая прямо в запрос).
Запрос DNS состоит из трёх частей: доменное имя, тип записи (например A - адрес IPv4) и класс записи. Сейчас используется практически только класс IN (Internet).
QR (1 бит): 0 - запрос, 1 - ответ. OPCODE: тип операции (0 - стандартный запрос). AA (Authoritative Answer): авторитетный ли ответ. TC (Truncated): было ли сообщение обрезано (если не поместилось в один пакет). RD (Recursion Desired): в запросе - просьба выполнять рекурсивно. RA (Recursion Available): в ответе - рекурсия доступна. Бит Z зарезервирован. RCODE - код результата (0 - успех, иначе - ошибка).
В ответе DNS повторяются имя, тип и класс, затем идут поля, специфичные для ответа: TTL (Time To Live) - время в секундах, на которое полученные данные можно сохранять в кэше; длина данных и сами данные (например 4 байта для IPv4-адреса).
Короткий TTL заставляет чаще обновлять кэш (удобно при частых сменах IP); длинный TTL снижает нагрузку на авторитетные серверы. Типичные значения - от десятков секунд до нескольких часов.
Система DNS хранит не только «имя - IPv4». Запись типа A - IPv4-адрес узла. Запись типа AAAA (или «четыре A») - IPv6-адрес. Запись типа CNAME (Canonical Name) - псевдоним: одно имя указывает на другое (например www.example.com - псевдоним для example.com). При смене IP меняют только одну A-запись, а CNAME продолжает указывать на неё.
Запись MX (Mail Exchange) задаёт адрес почтового сервера для домена. У одного домена может быть несколько MX с разным приоритетом (число в записи): сначала пытаются отправить почту на сервер с меньшим приоритетом, при недоступности - на следующий.
Запись NS (Name Server) указывает DNS-серверы, которые обслуживают данную зону. Чтобы знать, куда обращаться за зоной, нужны и имена этих серверов, и их IP - для этого используют «приклеенные» A-записи в родительской зоне (glue records).
DNS решает и обратную задачу: по IP-адресу определить доменное имя. Для этого используют специальную зону in-addr.arpa (для IPv4). Компоненты IP записывают в обратном порядке: например 8.8.5.5 - как 5.5.8.8.in-addr.arpa. Записи в таких зонах имеют тип PTR (Pointer).
Название arpa - наследие сети ARPANET, предка интернета; в стеке TCP/IP иногда встречаются отсылки к этому имени.
Чтобы DNS не «останавливал интернет», каждую зону обслуживают несколько серверов (минимум два), часто в разных сетях. Если один не отвечает, клиент может обратиться к другому. Данные в классическом DNS передаются в открытом виде, поэтому возможны перехват и подмена - уязвимость к атакам вроде отравления кэша (подмена ответа и сохранение ложного IP в кэше).
Для повышения безопасности разработаны DNSSEC (подпись данных) и передача запросов по защищённым каналам - DoH (DNS over HTTPS) и DoT (DNS over TLS).
Распределением имён занимаются регистраторы. У корневого домена один координатор - ICANN (Internet Corporation for Assigned Names and Numbers). Регистраторы доменов верхнего уровня получают аккредитацию; для одной зоны может быть несколько регистраторов. Они регистрируют домены второго уровня (например в .ru и .рф).
В России администратором зон .ru и .рф является Координационный центр национального домена сети Интернет (cctld.ru). Он не регистрирует домены напрямую, а аккредитует множество регистраторов: REG.RU, RU-CENTER, «Домены.РУ», «Резолв», Timeweb и другие. Регистрация домена - платная услуга; заказать домен можно у любого аккредитованного регистратора. Список актуальных регистраторов публикуется на сайте Координационного центра.
Выберите правильную последовательность этапов при разрешении доменного имени (рекурсивный режим).
Выберите правильное назначение для каждого типа.
Какой порт по умолчанию используется для DNS (и для TCP, и для UDP)?
Выберите верные утверждения (можно несколько).
Для доступа к практике нужно набрать не менее 80% (минимум 7 из 8 правильных ответов).
1. Что позволяет получить система DNS?
2. Какой транспортный протокол чаще всего используется для DNS?
3. Что такое DNS resolver?
4. Запись типа A в DNS содержит:
5. Авторитетный ответ DNS - это ответ:
6. Для обратного преобразования IP в имя используется зона:
7. TTL в ответе DNS задаёт:
8. Утилита для запроса DNS из командной строки в Windows/Linux:
Выполните пошаговые действия за компьютером: терминал (nslookup, dig), при необходимости - Wireshark с фильтром DNS. Файл для сдачи не требуется - достаточно выполнить шаги и при необходимости ответить на контрольные вопросы для самопроверки.
nslookup habr.comВ выводе найдите строку с адресом (Address) - это IP, соответствующий домену habr.com. Запишите его для самопроверки.
nslookup habr.com 8.8.8.8 (второй аргумент - адрес DNS-сервера Google).Убедитесь, что ответ пришёл с сервера 8.8.8.8. Сравните полученный IP с предыдущим шагом - для одного имени он обычно совпадает.
nslookup -type=A yandex.ru (или другой домен по выбору).В ответе должны быть одна или несколько A-записей с IPv4-адресами для этого домена.
nslookup -type=CNAME www.yandex.ruЕсли у узла есть псевдоним (CNAME), в ответе будет указано каноническое имя. Если CNAME нет - сервер может вернуть пустой ответ или ошибку; попробуйте другой домен с www.
nslookup -type=MX gmail.comВ ответе будут перечислены почтовые серверы с приоритетами. Обратите внимание на числа приоритета (чем меньше - тем предпочтительнее).
dig habr.comВ выводе dig видны секции QUESTION, ANSWER, AUTHORITY и др. Найдите в ANSWER запись типа A и значение TTL. В Windows dig можно установить отдельно или использовать nslookup для тех же целей.
dig +short habr.com (только краткий ответ).Должен вывестись только IP-адрес (или список адресов) без лишних полей - удобно для скриптов.
dns и нажмите Enter.В другом окне выполните nslookup habr.com. В Wireshark должны появиться пакеты DNS - запрос и ответ. Остановите захват после появления пакетов.
Найдите в заголовке: Transaction ID, Flags (например Recursion desired), в теле - Queries: имя (Name), тип (Type A), класс (Class IN). В ответном пакете найдите Answers с полем Address (IP).
Ответьте себе (можно устно или в тетради):
Вы прошли теорию по системе доменных имён и протоколу DNS, типам записей (A, AAAA, CNAME, MX, NS, PTR), итеративному и рекурсивному режимам, формату пакета и кэшированию. На практике использовали nslookup и при возможности dig и Wireshark для просмотра DNS-запросов и ответов. Файл для сдачи не требуется - достаточно выполнить шаги и самопроверку.