Введение

Система доменных имён и протокол DNS

На этом занятии вы разберёте, зачем нужна система доменных имён (DNS), как устроен протокол DNS и какие типы записей используются для преобразования имён в адреса и для других задач. Материал опирается на прикладной уровень стека TCP/IP и связывает теорию с практикой: утилиты nslookup, dig, анализ пакетов в Wireshark и пошаговые действия за компьютером без сдачи файла.

Зачем нужна DNS

Почему не только IP-адреса

На уровне интернет-протокола (IP) работа идёт с IP-адресами. Людям с ними работать неудобно: по адресу вроде 178.248.237.68 сложно понять, что это за сервер. Если указать имя habr.com, сразу ясно - сайт тематики IT.

Система доменных имён (Domain Name System, DNS) позволяет преобразовывать понятные человеку имена компьютеров в IP-адреса, с которыми работает сетевое оборудование. Дополнительно DNS даёт гибкость: один домен может соответствовать нескольким IP (балансировка), а при смене инфраструктуры меняют только записи DNS, а не ссылки у пользователей.

Уровень и утилиты

DNS на прикладном уровне

DNS находится на прикладном уровне в модели и стеке протоколов TCP/IP. Для взаимодействия с системой доменных имён можно использовать утилиту nslookup (name space lookup - поиск в пространстве имён): в командной строке указывают nslookup и доменное имя, для которого нужно получить IP-адрес.

Утилита nslookup есть в Windows, Linux и macOS. В Linux также часто используют host и dig - они выдают более подробную диагностическую информацию о запросах и ответах DNS.

nslookup habr.com
Откуда раньше брали имена

Файл hosts и его ограничения

Раньше использовали простой подход: соответствие «IP - имя» записывали в файл. В Linux это /etc/hosts, в Windows - тоже файл hosts по другому пути. В файле записывают IP-адрес и соответствующее ему имя сервера.

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

Архитектура DNS

Распределённая система

DNS - это распределённая система: нет единого сервера, где описаны все имена; данные разнесены по большому количеству серверов в интернете. Система разделена на домены, и за каждый домен отвечает отдельная организация. Уникальность имён нужно обеспечивать только внутри одного домена.

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

Александр
То есть как только DNS падает - по именам зайти уже нельзя, только по IP?
Дмитрий
Да. Если DNS недоступен, по доменному имени подключиться не получится - только по IP-адресу, который вы уже знаете или сохранили. Поэтому при сбоях 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 и др.).

Стандарты DNS

RFC и протокол DNS

Система доменных имён описана в документах RFC. В RFC 1034 - общие концепции DNS; в RFC 1035 - реализация и спецификация, в том числе протокол DNS. В RFC 2181 приведены уточнения к спецификации.

Протокол DNS, как и HTTP, работает по модели клиент - сервер: клиент отправляет запрос на сервер DNS, сервер возвращает ответ. На транспортном уровне DNS чаще всего использует UDP (запросы и ответы короткие), реже - TCP (большие сообщения или передача зон между серверами). Порт для обоих протоколов один - 53.

Режимы работы DNS

Итеративный и рекурсивный режим работы с DNS-сервером

В итеративном режиме клиент отправляет запрос серверу; если сервер обслуживает нужную зону - возвращает ответ; если нет - возвращает адрес другого DNS-сервера, у которого есть более точная информация. Клиент сам обращается к следующему серверу и повторяет, пока не получит ответ.

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

Мария
То есть в домашних условиях мы всегда ходим в рекурсивный резолвер, а он уже сам бегает по дереву?
Дмитрий
Да. Домашний роутер или провайдер выдают адрес резолвера (часто по DHCP), а приложение шлёт запрос именно ему. Резолвер сам обращается к корню, потом к серверам зон и возвращает уже готовый IP.
Кэш DNS

Зачем кэшировать ответы

Часто выполняются запросы к одному и тому же доменному имени. Резолвер после получения IP сохраняет результат в кэше. При следующем запросе для того же имени он может отдать адрес из кэша, не обращаясь снова к распределённым серверам - это ускоряет работу и снижает нагрузку.

Из-за кэширования различают два типа ответов: авторитетный (получен от сервера, который обслуживает данную зону, данные из конфигурации) и неавторитетный (ответ из кэша другого сервера; данные могли устареть, но на практике редко). В выводе nslookup неавторитетный ответ часто помечают как «не заслуживающий доверия».

Формат пакета DNS

Заголовок и тело сообщения

В отличие от HTTP, где данные часто передаются в текстовом виде, DNS использует бинарный формат. Пакет состоит из заголовка и тела. Размер заголовка и полей в нём фиксирован; отдельные поля в теле тоже имеют строго определённый формат.

Заголовок DNS имеет длину 12 байт и содержит: идентификатор (номер пакета, по нему связывают запрос и ответ), флаги (тип сообщения, коды операций и т.д.), количество запросов, ответов, записей об авторитетных серверах и дополнительных записях.

Заголовок DNS (RFC 1035), 12 байт: • ID (2 байта) - идентификатор транзакции; в ответе совпадает с запросом для сопоставления пары. • Флаги (2 байта): QR (запрос/ответ), OPCODE, AA (авторитетный ответ), TC (обрезано), RD (рекурсия желательна), RA (рекурсия доступна), Z (зарезервировано), RCODE (код ответа: 0=OK и др.). • QDCOUNT (2 байта) - число запросов в секции Question. • ANCOUNT (2 байта) - число записей в секции Answer. • NSCOUNT (2 байта) - число записей в секции Authority (серверы имён). • ARCOUNT (2 байта) - число записей в секции Additional.
Секции тела DNS

Запросы, ответы, авторитетные серверы

В теле сообщения DNS есть четыре секции: запросы (для какого имени ищем IP), ответы (сами данные - IP или другая информация), авторитетные серверы (указание, откуда получен ответ) и дополнительные записи (полезная информация, не входящая прямо в запрос).

Запрос DNS состоит из трёх частей: доменное имя, тип записи (например A - адрес IPv4) и класс записи. Сейчас используется практически только класс IN (Internet).

Флаги в заголовке DNS

QR, AA, TC, RD, RA, RCODE

QR (1 бит): 0 - запрос, 1 - ответ. OPCODE: тип операции (0 - стандартный запрос). AA (Authoritative Answer): авторитетный ли ответ. TC (Truncated): было ли сообщение обрезано (если не поместилось в один пакет). RD (Recursion Desired): в запросе - просьба выполнять рекурсивно. RA (Recursion Available): в ответе - рекурсия доступна. Бит Z зарезервирован. RCODE - код результата (0 - успех, иначе - ошибка).

Ответ DNS и TTL

Время жизни записи

В ответе DNS повторяются имя, тип и класс, затем идут поля, специфичные для ответа: TTL (Time To Live) - время в секундах, на которое полученные данные можно сохранять в кэше; длина данных и сами данные (например 4 байта для IPv4-адреса).

Короткий TTL заставляет чаще обновлять кэш (удобно при частых сменах IP); длинный TTL снижает нагрузку на авторитетные серверы. Типичные значения - от десятков секунд до нескольких часов.

Типы записей DNS

A, AAAA, CNAME

Система DNS хранит не только «имя - IPv4». Запись типа A - IPv4-адрес узла. Запись типа AAAA (или «четыре A») - IPv6-адрес. Запись типа CNAME (Canonical Name) - псевдоним: одно имя указывает на другое (например www.example.com - псевдоним для example.com). При смене IP меняют только одну A-запись, а CNAME продолжает указывать на неё.

Типы записей: MX и NS

Почта и серверы имён

Запись MX (Mail Exchange) задаёт адрес почтового сервера для домена. У одного домена может быть несколько MX с разным приоритетом (число в записи): сначала пытаются отправить почту на сервер с меньшим приоритетом, при недоступности - на следующий.

Запись NS (Name Server) указывает DNS-серверы, которые обслуживают данную зону. Чтобы знать, куда обращаться за зоной, нужны и имена этих серверов, и их IP - для этого используют «приклеенные» A-записи в родительской зоне (glue records).

Обратная задача DNS

По IP найти имя - PTR и in-addr.arpa

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 не «останавливал интернет», каждую зону обслуживают несколько серверов (минимум два), часто в разных сетях. Если один не отвечает, клиент может обратиться к другому. Данные в классическом DNS передаются в открытом виде, поэтому возможны перехват и подмена - уязвимость к атакам вроде отравления кэша (подмена ответа и сохранение ложного IP в кэше).

Для повышения безопасности разработаны DNSSEC (подпись данных) и передача запросов по защищённым каналам - DoH (DNS over HTTPS) и DoT (DNS over TLS).

Дмитрий
В Wireshark фильтр dns покажет только DNS-пакеты - так проще искать нужный запрос.
Регистраторы доменов

Кто управляет доменами

Распределением имён занимаются регистраторы. У корневого домена один координатор - ICANN (Internet Corporation for Assigned Names and Numbers). Регистраторы доменов верхнего уровня получают аккредитацию; для одной зоны может быть несколько регистраторов. Они регистрируют домены второго уровня (например в .ru и .рф).

В России администратором зон .ru и .рф является Координационный центр национального домена сети Интернет (cctld.ru). Он не регистрирует домены напрямую, а аккредитует множество регистраторов: REG.RU, RU-CENTER, «Домены.РУ», «Резолв», Timeweb и другие. Регистрация домена - платная услуга; заказать домен можно у любого аккредитованного регистратора. Список актуальных регистраторов публикуется на сайте Координационного центра.

Задание 1

Порядок этапов разрешения имени

Выберите правильную последовательность этапов при разрешении доменного имени (рекурсивный режим).

Задание 2

Сопоставьте тип записи DNS с назначением

Выберите правильное назначение для каждого типа.

A
CNAME
MX
NS
Задание 3

Протокол и порт DNS

Какой порт по умолчанию используется для DNS (и для TCP, и для UDP)?

Задание 4

Утверждения о DNS

Выберите верные утверждения (можно несколько).

Финальный допуск

Краткий тест (8 вопросов)

Для доступа к практике нужно набрать не менее 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 и анализ DNS

Выполните пошаговые действия за компьютером: терминал (nslookup, dig), при необходимости - Wireshark с фильтром DNS. Файл для сдачи не требуется - достаточно выполнить шаги и при необходимости ответить на контрольные вопросы для самопроверки.

Практика - Шаг 1

Откройте терминал

1Запустите терминал: Windows - cmd или PowerShell, macOS/Linux - Terminal.
Практика - Шаг 2

Узнайте IP-адрес по имени с помощью nslookup

2Выполните команду: nslookup habr.com

В выводе найдите строку с адресом (Address) - это IP, соответствующий домену habr.com. Запишите его для самопроверки.

Практика - Шаг 3

Обратитесь к конкретному DNS-серверу

3Выполните: nslookup habr.com 8.8.8.8 (второй аргумент - адрес DNS-сервера Google).

Убедитесь, что ответ пришёл с сервера 8.8.8.8. Сравните полученный IP с предыдущим шагом - для одного имени он обычно совпадает.

Практика - Шаг 4

Запросите запись типа A для другого домена

4Выполните: nslookup -type=A yandex.ru (или другой домен по выбору).

В ответе должны быть одна или несколько A-записей с IPv4-адресами для этого домена.

Практика - Шаг 5

Запросите запись CNAME (если есть)

5Выполните: nslookup -type=CNAME www.yandex.ru

Если у узла есть псевдоним (CNAME), в ответе будет указано каноническое имя. Если CNAME нет - сервер может вернуть пустой ответ или ошибку; попробуйте другой домен с www.

Практика - Шаг 6

Запросите MX-записи для домена

6Выполните: nslookup -type=MX gmail.com

В ответе будут перечислены почтовые серверы с приоритетами. Обратите внимание на числа приоритета (чем меньше - тем предпочтительнее).

Практика - Шаг 7

Утилита dig (Linux/macOS)

7Если у вас Linux или macOS, выполните: dig habr.com

В выводе dig видны секции QUESTION, ANSWER, AUTHORITY и др. Найдите в ANSWER запись типа A и значение TTL. В Windows dig можно установить отдельно или использовать nslookup для тех же целей.

Практика - Шаг 8

Краткий вывод dig

8Выполните: dig +short habr.com (только краткий ответ).

Должен вывестись только IP-адрес (или список адресов) без лишних полей - удобно для скриптов.

Практика - Шаг 9

Захват DNS в Wireshark (опционально)

9Запустите Wireshark, выберите активный интерфейс и начните захват. В фильтре введите dns и нажмите Enter.

В другом окне выполните nslookup habr.com. В Wireshark должны появиться пакеты DNS - запрос и ответ. Остановите захват после появления пакетов.

Практика - Шаг 10

Разбор пакета DNS в Wireshark

10В списке пакетов выберите DNS-запрос (обычно первый из пары). В среднем окне разверните дерево «Domain Name System (query)».

Найдите в заголовке: Transaction ID, Flags (например Recursion desired), в теле - Queries: имя (Name), тип (Type A), класс (Class IN). В ответном пакете найдите Answers с полем Address (IP).

Практика - Шаг 11

Контрольные вопросы для самопроверки

Ответьте себе (можно устно или в тетради):

  • Какой IP-адрес вы получили для habr.com в шаге 2?
  • Какой TTL был в ответе (если смотрели в dig или Wireshark)?
  • Чем отличается авторитетный ответ от неавторитетного в выводе nslookup?
Практика завершена

Итог занятия

Вы прошли теорию по системе доменных имён и протоколу DNS, типам записей (A, AAAA, CNAME, MX, NS, PTR), итеративному и рекурсивному режимам, формату пакета и кэшированию. На практике использовали nslookup и при возможности dig и Wireshark для просмотра DNS-запросов и ответов. Файл для сдачи не требуется - достаточно выполнить шаги и самопроверку.