DNS (англ. Domain Name
System — система доменных имён) — компьютерная распределённая
система для получения
информации о доменах. Чаще всего используется
для получения IP-адреса по имени хоста (компьютера или устройства),
получения информации о маршрутизации
почты, обслуживающих узлах для протоколов
в домене (SRV-запись).
Распределённая
база данных DNS
поддерживается с помощью иерархии DNS-серверов, взаимодействующих по определённому протоколу.
Основой DNS является представление
об иерархической структуре доменного
имени и зонах.
Каждый сервер, отвечающий за имя, можетделегировать ответственность
за дальнейшую часть домена другому серверу
(с административной точки зрения — другой
организации или человеку), что позволяет
возложить ответственность за актуальность
информации на серверы различных организаций
(людей), отвечающих только за «свою» часть
доменного имени.
Начиная с 2010 года, в
систему DNS внедряются средства проверки
целостности передаваемых данных, называемые DNS
Security Extensions(DNSSEC). Передаваемые данные не
шифруются, но их достоверность проверяется
криптографическими способами.
Ключевые характеристики
DNS
DNS обладает следующими
характеристиками:
- Распределённость
администрирования. Ответственность за
разные части иерархической структуры
несут разные люди или организации.
- Распределённость
хранения информации. Каждый узел сети
в обязательном порядке должен хранить
только те данные, которые входят в его зону
ответственности и (возможно) адреса корневых
DNS-серверов.
- Кеширование информации. Узел может хранить
некоторое количество данных не из своей
зоны ответственности для уменьшения
нагрузки на сеть.
- Иерархическая
структура, в которой все узлы объединены
в дерево, и каждый узел может или
самостоятельно определять работу нижестоящих
узлов, или делегировать (передавать)
их другим узлам.
- Резервирование.
За хранение и обслуживание своих узлов
(зон) отвечают (обычно) несколько серверов,
разделённые как физически, так и логически,
что обеспечивает сохранность данных
и продолжение работы даже в случае сбоя
одного из узлов.
DNS важна для работы Интернета, ибо для соединения с узлом
необходима информация о его IP-адресе, а для людей проще запоминать
буквенные (обычно осмысленные) адреса,
чем последовательность цифр IP-адреса.
В некоторых случаях это позволяет использовать
виртуальные серверы, например, HTTP-серверы,
различая их по имени запроса. Первоначально
преобразование между доменными и IP-адресами
производилось с использованием специального текстового
файла hosts, который составлялся централизованно
и автоматически рассылался на каждую
из машин в своей локальной сети. С ростом
Сети возникла необходимость в эффективном,
автоматизированном механизме, которым
и стала DNS.
DNS была разработана Полом
Мокапетрисом в 1983
году; оригинальное
описание механизмов работы содержится
в RFC
882 и RFC 883. В 1987 публикация RFC
1034 и RFC 1035изменила спецификацию DNS
и отменила RFC
882 и RFC 883 как устаревшие.
Дополнительные возможности
- поддержка динамических
обновлений
- защита данных
(DNSSEC) и транзакций (TSIG)
- поддержка различных
типов информации (SRV-записи)
Терминология и
принципы работы
Ключевыми понятиями
DNS являются:
- Доме́н (англ. domain — область) — узел
в дереве имён, вместе со всеми подчинёнными
ему узлами (если таковые имеются), то есть
именованная ветвь или поддерево в
дереве имен. Структура доменного имени
отражает порядок следования узлов в иерархии;
доменное имя читается слева направо от
младших доменов к доменам высшего уровня
(в порядке повышения значимости), корневым
доменом всей системы является точка ('.'),
ниже идут домены первого уровня (географические
или тематические), затем — домены второго
уровня, третьего и т. д. (например, для
адреса ru.wikipedia.org домен первого уровня — org,
второго wikipedia, третьего ru). На практике точку в конце
имени часто опускают, но она бывает важна
в случаях разделения между относительными
доменами и FQDN (англ. Fully Qualifed Domain Name, полностью
определённое имя домена).
- Поддомен (англ. subdomain) — подчиненный
домен. (например, wikipedia.org — поддомен домена org,
а ru.wikipedia.org — домена wikipedia.org). Теоретически такое деление
может достигать глубины 127 уровней, а
каждая метка может содержать до 63 символов,
пока общая длина вместе с точками не достигнет
254 символов. Но на практикерегистраторы
доменных имён используют
более строгие ограничения. Например,
если у вас есть домен вида mydomain.ru, вы можете
создать для него различные поддомены
видаmysite1.mydomain.ru, mysite2.mydomain.ru и т.
д.
- Ресурсная
запись — единица
хранения и передачи информации в DNS. Каждая
ресурсная запись имеет имя (то есть
привязана к определенному Доменному
имени, узлу в дереве имен), тип и поле
данных, формат и содержание которого
зависит от типа.
- Зона — часть
дерева доменных имен (включая ресурсные
записи), размещаемая как единое целое
на некотором сервере доменных имен (DNS-сервере,
см. ниже), а чаще — одновременно на нескольких
серверах (см. ниже). Целью выделения части
дерева в отдельную зону является передача ответственности (см.
ниже) за соответствующий Домендругому
лицу или организации, так называемое Делегирование (см.
ниже). Как связная часть дерева, зона внутри
тоже представляет собой дерево. Если
рассматривать пространство имен DNS как
структуру из зон, а не отдельных узлов/имен,
тоже получается дерево; оправданно говорить
о родительских и дочерних зонах, о старших
и подчиненных. На практике, большинство
зон 0-го и 1-го уровня ('.', ru, com, …) состоят
из единственного узла, которому непосредственно
подчиняются дочерние зоны. В больших
корпоративных доменах (2-го и более уровней)
иногда встречается образование дополнительных
подчиненных уровней без выделения их
в дочерние зоны.
- Делегирование —
операция передачи ответственности за
часть дерева доменных имен другому лицу
или организации. За счет делегирования
в DNS обеспечивается распределенность
администрирования и хранения. Технически делегирование выражается
в выделении этой части дерева в отдельную зону,
и размещении этой зоны на DNS-сервере (см.
ниже), управляемом этим лицом или организацией.
При этом в родительскую зону включаются
«склеивающие» ресурсные
записи (NS и А), содержащие указатели
наDNS-сервера дочерней зоны, а вся остальная
информация, относящаяся к дочерней зоне,
хранится уже на DNS-серверах дочерней
зоны.
- DNS-сервер — специализированное ПО
для обслуживания DNS, а также компьютер,
на котором это ПО выполняется. DNS-сервер
может быть ответственным за некоторые
зоны и/или может перенаправлять запросы
вышестоящим серверам.
- DNS-клиент — специализированная библиотека
(или программа) для работы с DNS. В ряде
случаев DNS-сервер выступает в роли DNS-клиента.
- Авторитетность (англ. authoritative) — признак размещения
зоны на DNS-сервере. Ответы DNS-сервера могут
быть двух типов: авторитетные (когда
сервер заявляет, что сам отвечает за зону)
и неавторитетные (англ. Non-authoritative), когда сервер
обрабатывает запрос, и возвращает ответ
других серверов. В некоторых случаях
вместо передачи запроса дальше DNS-сервер
может вернуть уже известное ему (по запросам
ранее) значение (режим кеширования).
- DNS-запрос (англ. DNS query) — запрос от клиента
(или сервера) серверу. Запрос может быть рекурсивным или нерекурсивным (см. Рекурсия).
Система DNS содержит иерархию DNS-серверов,
соответствующую иерархии зон. Каждая зона поддерживается
как минимум одним авторитетным
сервером DNS (от англ. authoritative— авторитетный),
на котором расположена информация о домене.
Имя и IP-адрес не тождественны — один IP-адрес может иметь
множество имён, что позволяет поддерживать
на одном компьютере множество веб-сайтов (это называется виртуальный
хостинг). Обратное
тоже справедливо — одному имени может
быть сопоставлено множество IP-адресов:
это позволяет создавать балансировку
нагрузки.
Для повышения устойчивости
системы используется множество
серверов, содержащих идентичную информацию,
а в протоколе есть средства, позволяющие
поддерживать синхронность информации,
расположенной на разных серверах. Существует
13 корневых серверов, их адреса практически
не изменяются.[1]
Протокол DNS использует
для работы TCP- или UDP-порт 53 для ответов на запросы.
Традиционно запросы и ответы отправляются
в виде одной UDP датаграммы. TCP используется дляAXFR-запросов.
Рекурсия
Термином Рекурсия в
DNS обозначают алгоритм поведения DNS-сервера,
при котором сервер выполняет от имени
клиента полный поиск нужной информации
во всей системе DNS, при необходимости
обращаясь к другим DNS-серверам.
DNS-запрос может быть рекурсивным —
требующим полного поиска, — и нерекурсивным —
не требующим полного поиска.
Аналогично, DNS-сервер может
быть рекурсивным (умеющим выполнять
полный поиск) и нерекурсивным (не умеющим
выполнять полный поиск). Некоторые программы
DNS-серверов, например, BIND, можно сконфигурировать
так, чтобы запросы одних клиентов выполнялись рекурсивно,
а запросы других — нерекурсивно.
При ответе на нерекурсивный запрос,
а также — при неумении или запрете выполнять рекурсивные запросы,
— DNS-сервер либо возвращает данные о зоне,
за которую он ответствен, либо возвращает
адреса серверов, которые обладают большим
объёмом информации о запрошенной зоне,
чем отвечающий сервер, чаще всего — адреса
корневых серверов.
В случае рекурсивного запроса DNS-сервер опрашивает
серверы (в порядке убывания уровня зон
в имени), пока не найдёт ответ или не обнаружит,
что домен не существует. (На практике
поиск начинается с наиболее близких к
искомому DNS-серверов, если информация
о них есть в кеше и не устарела, сервер
может не запрашивать другие DNS-серверы.)
Рассмотрим на примере
работу всей системы.
Предположим, мы набрали
в браузере адрес ru.wikipedia.org. Браузер спрашивает у сервера
DNS: «какой IP-адрес у ru.wikipedia.org»? Однако, сервер DNS может
ничего не знать не только о запрошенном
имени, но даже обо всём домене wikipedia.org. В этом случае сервер обращается
к корневому
серверу — например,
198.41.0.4. Этот сервер сообщает — «У меня
нет информации о данном адресе, но я знаю,
что 204.74.112.1 является ответственным за
зону org.»
Тогда сервер DNS направляет свой запрос
к 204.74.112.1, но тот отвечает «У меня нет информации
о данном сервере, но я знаю, что 207.142.131.234
является ответственным за зону wikipedia.org.»
Наконец, тот же запрос отправляется к
третьему DNS-серверу и получает ответ —
IP-адрес, который и передаётся клиенту
— браузеру.
В данном случае при
разрешении имени, то есть в процессе
поиска IP по имени:
- браузер отправил
известному ему DNS-серверу рекурсивный запрос
— в ответ на такой тип запроса сервер
обязан вернуть «готовый результат», то
есть IP-адрес, либо сообщить об ошибке;
- DNS-сервер, получивший
запрос от браузера, последовательно отправлял нерекурсивные запросы,
на которые получал от других DNS-серверов
ответы, пока не получил ответ от сервера,
ответственного за запрошенную зону;
- остальные упоминавшиеся
DNS-серверы обрабатывали запросы нерекурсивно (и,
скорее всего, не стали бы обрабатывать
запросы рекурсивно, даже если бы такое
требование стояло в запросе).
Иногда допускается,
чтобы запрошенный сервер передавал рекурсивный запрос
«вышестоящему» DNS-серверу и дожидался
готового ответа.
При рекурсивной обработке
запросов все ответы проходят через DNS-сервер,
и он получает возможность кэшировать их. Повторный запрос на те
же имена обычно не идет дальше кэшасервера,
обращения к другим серверам не происходит
вообще. Допустимое время хранения ответов
в кэше приходит вместе с ответами (поле TTL ресурсной
записи).
Рекурсивные запросы
требуют больше ресурсов от сервера
(и создают больше трафика), так
что обычно принимаются от «известных»
владельцу сервера узлов (например,
провайдер предоставляет возможность
делать рекурсивные запросы только
своим клиентам, в корпоративной
сети рекурсивные запросы принимаются
только из локального сегмента). Нерекурсивные
запросы обычно принимаются ото всех узлов
сети (и содержательный ответ даётся только
на запросы о зоне, которая размещена на
узле, на DNS-запрос о других зонах обычно
возвращаются адреса других серверов).
Обратный DNS-запрос
DNS используется
в первую очередь для преобразования
символьных имён в IP-адреса, но
он также может выполнять обратный
процесс. Для этого используются
уже имеющиеся средства DNS. Дело
в том, что с записью DNS могут
быть сопоставлены различные
данные, в том числе и какое-либо
символьное имя. Существует специальный
домен in-addr.arpa, записи в котором используются
для преобразования IP-адресов в символьные
имена. Например, для получения DNS-имени
для адреса 11.22.33.44 можно запросить у DNS-сервера
запись44.33.22.11.in-addr.arpa, и тот вернёт соответствующее
символьное имя. Обратный порядок записи
частей IP-адреса объясняется тем, что в
IP-адресах старшие биты расположены в
начале, а в символьных DNS-именах старшие
(находящиеся ближе к корню) части расположены
в конце.
Записи DNS
Записи DNS, или Ресурсные
записи (англ. Resource Records, RR) — единицы
хранения и передачи информации в DNS. Каждая
ресурсная запись состоит из следующих
полей:
- имя (NAME) — доменное
имя, к которому привязана или которому
«принадлежит» данная ресурсная запись,
- TTL (Time To Live) —
допустимое время хранения данной ресурсной
записи в кэше неответственного DNS-сервера,
- тип (TYPE) ресурсной
записи — определяет формат и назначение
данной ресурсной записи,
- класс (CLASS) ресурсной
записи; теоретически считается,
что DNS может использоваться не только
с TCP/IP, но и с другими типами сетей,
код в поле класс определяет тип сети,
- длина поля данных
(RDLEN),
- поле
данных (RDATA), формат и содержание которого
зависит от типа записи.