Что такое DNS

Содержание
  1. Предпосылки появления DNS
  2. Файл hosts — как первый шаг к созданию DNS
  3. Работа DNS в сети интернет
    1. Терминология
    2. Подключение
    3. Рекурсия в DNS
  4. Ресурсные записи DNS
  5. Пример реальных записей DNS
  6. Выводы

DNS ≠ магазин компьютерной и бытовой техники

Domain Name Server — распределённая система хранения и обработки информации о доменных именах доменных зонах.

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

В этом гайде мы рассмотрим, как появился DNS и какие проблемы был призван решить. Узнаем, как компьютеры общались друг с другом до создания системы DNS, а также рассмотрим примеры работы и использования.

Предпосылки появления DNS

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

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

С увеличением количества компьютеров внутри сети ARPANET людям приходилось запоминать всё большее количество разнообразных комбинаций цифр (IP-адресов), чтобы связаться с тем или иным компьютером для отправки данных. Это могли быть данные об исследованиях, необходимые отделу компании, который находится в другой части страны, или любые другие данные, расположенные на расстоянии. К 1983 году таких компьютеров насчитывалось более 4 000, и запомнить большинство этих адресов уже не представлялось возможным. Вот и разработчики ARPANET подумали также, решив дать компьютерам уникальные имена для дальнейшего подключения к ним с использованием этих имён, а не IP-адресов.

Файл hosts — как первый шаг к созданию DNS

Для решения этой задачи разработчики решили использовать словарь, который связывал уникальное имя и IP-адрес каждого компьютера в сети. Таким словарём стал файл hosts.txt, который и отвечал за привязку IP-адреса к имени компьютера. Файл лежал на сервере Стэнфордского исследовательского института, и пользователи сети регулярно вручную скачивали этот файл на свои компьютеры, чтобы сохранять актуальность словаря, ведь новые компьютеры появлялись в сети почти каждый день.

Выглядел hosts.txt тогда (да и сейчас) таким образом:

192.168.10.36         MIKE-STRATE-PC
Сетевой (IP) адрес    Имя компьютера

При наличии такого файла на компьютере пользователя для связи с компьютером Майка, можно было не запоминать цифры, а использовать понятное латинское имя «MIKE-STRATE-PC».

Посмотрим, как выглядит файл и попробуем добавить туда новое имя, чтобы подключиться к компьютеру с использованием данного имени. Для этого отредактируем файл hosts. Вы можете найти его на своём компьютере по следующему адресу:

  • В Unix-системах: /etc/hosts
  • В Windows-системах: %Путь до папки Windows%/system32/drivers/etc/hosts

Компьютеру с IP-адресом 192.168.10.36, который находится внутри локальной сети мы указалия имя «MIKE-STRATE-PC». После чего можно воспользоваться командой ping, которая пошлёт специальный запрос на компьютер Майка и будет ждать от него ответа. Похоже на то, как вы стучитесь в дверь или звоните в звонок, чтобы узнать, «есть ли кто дома?» Такой запрос можно послать на любой комьютер.

По мере развития сети и «обрастания» её новыми клиентами, такой способ становился неудобным. Всем пользователям компьютеров было необходимо всё чаще скачивать свежую версию файла с сервера Стэнфордского исследовательского института, который обновлялся вручную несколько раз в неделю. Для добавлений же новых версий было необходимо связываться с институтом и просить их внести в файл новые значения.

В 1984 году Пол Мокапетрис (Paul Mockapetris) описал новую систему под названием DNS (Domain Name System / Система доменных имён), которая была призвана автоматизировать процессы соотнесения IP-адресов и имён компьютеров, а также процессы обновления имён у пользователей без необходимости ручного скачивания файла со стороннего сервера.

Работа DNS в сети интернет

В настоящее время интернет окружает нас повсюду — мы используем его в мобильных и настольных устройствах. Системы видеонаблюдения и даже чайники взаимодействуют друг с другом с помощью интернета, и для корректной связи с ними нужна система, с помощью которой пользователи смогут одним запросом в адресной строке подключиться к нужному сервису. Всё это ложится на плечи системы DNS, которая внутри себя хранит намного больше информации, чем просто IP-адрес и название устройств. Записи в DNS также отвечают за корректную отправку электронных писем, связывают друг с другом разные домены и доменные зоны.

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

dns, hierarchy

Рассмотрим работу DNS и её составных частей поближе.

Терминология

Основными компонентами DNS являются:

Домен (доменное имя) — символьное имя для обозначения сервера в сети интернет. Доменные имена являются иерархической структурой, в которой каждый уровень отделяется точкой. Основными уровнями являются:

  • Корневой домен. В урле он не используется, но всегда подразумевается. От него начинается построение всех урлов в сети интернет
  • Домены верхнего уровня. К ним относятся домены .ru, .com, .net, .su и так далее. Также этот домен называют доменом первого уровня.
  • Домен второго уровня (или основной домен). Это основное имя вашего сайта
  • Поддомены (домены третьего, четвёртого, пятого и т.д. уровня). Сюда входят все поддомены основного домена.

DNS-сервер — система, ответственная за хранение и поддержание в актуальном состоянии записей о своих дочерних доменах. Каждый DNS-сервер ответственен только за свою зону, то есть DNS-сервер домена .io знает о том, где расположен домен hexlet, DNS-сервер которого знает о расположении своих поддоменов.

Корневой DNS-сервер — система, знающая расположение (IP-адреса) DNS-серверов доменов верхнего уровня.

Ресурсная запись — единица информации DNS-сервера. Каждая ресурсная запись имеет несколько полей:

  • Имя (домен, к которому относится запись)
  • Тип
  • Параметры
  • Значение

Подключение

Необходимо понимать, что доменное имя — это всего лишь абстракция для людей. Сам компьютер и приложения (например, браузер) обращается к сервисам внутри сети интернет только по IP-адресам.

Рассмотрим процесс получения IP-адреса по доменному имени на примере домена ru.hexlet.io.

Возможны два варианта событий:

  1. Компьютер посылает запрос на известный ему DNS-сервер. Чаще всего им является DNS-сервер поставщика интернет-услуг (провайдера): какой IP-адрес у домена ru.hexlet.io?. DNS-сервер провайдера находит в своей базе информацию о том, что домен ru.hexlet.io расположен по IP-адресу 104.25.238.104 и возвращает значение нашему компьютеру. Этот процесс похож на то, как использовался файл hosts.txt.

  2. Ближайший известный DNS-сервер не имеет записи о том, по какому IP-адресу располагается домен ru.hexlet.io. В таком случае запускается цепочка процессов, благодаря которым наш компьютер получит IP-адрес домена:

    • Так как домен является иерархической структурой, и все DNS-сервера знают IP-адреса корневых DNS-серверов, то к ним и происходит запрос на получение IP-адреса домена.

    • Корневые DNS-сервера, в соответствии со своей зоной ответственности знают о том, где располагаются DNS-сервера доменов верхнего уровня. Эти адреса возвращаются DNS-серверу нашего провайдера, после чего на нужный DNS-сервер (в нашем случае на DNS-сервер домена .io) посылается запрос на получение IP-адреса домена ru.hexlet.

    • В соответствии со своей зоной ответственности DNS-сервер домена верхнего уровня возвращает IP-адрес DNS-сервера домена hexlet, на который посылается запрос на получение IP-адреса поддомена ru.

    • DNS-сервер возвращает IP-адреса поддомена ru, после чего DNS-сервер нашего провайдера возвращает полученный адрес на наш компьютер, который уже может обратиться к домену ru.hexlet.io по его IP-адресу.

Рекурсия в DNS

Можно заметить, что оба описанных выше варианта сильно различаются: в первом случае мы просто послали запрос и получили ответ, а во втором — возникла необходимость идти от самого корневого домена в процессе поиска нужной нам записи. Такой процесс является рекурсивным, потому что ближайший DNS-сервер непрерывно посылает запросы к другим DNS-серверам до тех пор, пока не получит необходимые ресурсные записи. Данный процесс можно визуализировать следующим образом:

dns, structure При запросах 1 и 2 ближайший сервер будет получать информацию о местонахождении DNS-серверов, которые входят в зону ответственности того сервера, на который был послан запрос. При запросе 3 будут получены необходимые ресурсные записи домена hexlet и его поддоменов.

Рекурсивный поиск — это достаточно долгая операция, которая к тому же сильно нагружает сеть и сами DNS-сервера. Именно для того, чтобы избавиться от рекурсии каждый DNS-сервер кеширует информацию о записях, которые получает, для быстрой отдачи этой информации пользователю.

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

Чаще всего в интернете DNS-сервера умеют посылать рекурсивные запросы, потому что в таком случае ответ можно закешировать, что в дальнейшем позволит снизить нагрузку как на сам сервер, так и на другие DNS-сервера. Время, на которое DNS-сервер кеширует информацию, указывается в ресурсной записи DNS, о которой сейчас пойдёт речь.

Ресурсные записи DNS

Современный интернет подразумевает не только получение IP-адреса по доменному имени, но и пересылку электронной почты, подключение дополнительных сервисов аналитики к сайту, настройку защищённого протокола HTTPS. Это чаще всего делается с помощью ресурсных записей DNS.

Рассмотрим, какие ресурсные записи используются, и на что они указывают. Основными ресурсными записями DNS являются:

A-запись — одна из самых важных записей. Именно эта запись указывает на IP-адрес сервера, который привязан к доменному имени.

MX-запись — указывает на сервер, который будет использован при отсылке доменной электронной почты.

NS-запись — указывает на DNS-сервер домена.

CNAME-запись — позволяет одному из поддоменов дублировать DNS-записи своего родителя. Делается это для того, чтобы перенаправить запрос с одного домена на другой (чаще всего для перенаправления домена с поддоменом www на домен без такого поддомена).

TXT-запись — в этой записи хранится текстовая информация о домене. Часто используется для подтверждения прав на владение доменом, посредством добавления определённой строки, которую присылает нам интернет-сервис.

Ресурсные записи почти всегда одинаковые, но для некоторых записей могут появляться другие поля, например в MX-записях также присутствует значение приоритета. В основном ресурсные записи имеют следующую структуру:

Имя записи   TTL   Класс   Тип записи  Значение

Разберём подробнее:

Имя записи — указывается домен, которому принадлежит данная ресурсная запись.

TTL (time to live / время жизни) — время в секундах, на которое будет закешировано значение ресурсной записи. Это необходимо для разгрузки DNS-серверов. Благодаря кешированию и возможна ситуация, что ближайший DNS-сервер знает IP-адрес запрашиваемого домена.

Класс — предполагалось, что DNS может работать не только в сети интернет, поэтому в записи указывается и её класс. На сегодняшний день поддерживается только одно значение — IN (Internet).

Тип — указывает тип ресурсной записи, основные из которых были разобраны выше.

Значение — непосредственно значение ресурсной записи. В зависимости от типа ресурсной записи значения могут быть представлены в разном виде.

Посмотрим, в каком виде эти записи хранятся на DNS-серверах на примере домена ya.ru. Для этого воспользуемся утилитой dig, которая получает все доступные ресурсные DNS-записи от DNS-сервера и выводит их пользователю.

Утилита dig является DNS-клиентом и входит в состав одного из самых распространённых DNS-серверов BING.

Пример реальных записей DNS

dns, output

Не пугайтесь такого длинного вывода. Уже сейчас можно понять почти всё, что тут указано. Разберём вывод каждой секции более детально.

Вывод состоит из нескольких частей:

  • Шапка
  • Секция запроса
  • Секция ответа
  • Служебная информация

Шапка запроса

; <<>> Net::DNS::Dig 0.12 <<>> -t any ya.ru.
;;
;; Got answer.
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52109
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

Здесь указывается проставленные флаги нашего запроса, количество запросов и ответов, а также другая служебная информация.

Секция запроса

;; QUESTION SECTION:
;ya.ru.   IN    ANY

В секции запроса указывается домен, к которому происходит обращение, класс записи и те записи, которые мы хотим получить. ANY указывает на то, что нужно вывести все доступные ресурсные записи, но если вы хотите поэкспериментировать с утилитой сами, то можете с помощью специального ключа получить вывод только конкретных записей, которые интересуют в настоящий момент.

Секция ответа

Секция ответа достаточно большая, поэтому для удобства разобьём её по типам ресурсных записей.

;; ANSWER SECTION:
ya.ru. 	7199	IN	NS	 ns1.yandex.ru.
ya.ru. 	7199	IN	NS	 ns2.yandex.ru.

ya.ru.	599	IN	A	 87.250.250.242
ya.ru.	599	IN	AAAA	 2A02:6B8:0:0:0:0:2:242

Как запись A, так и AAAA-запись указывают на IP-адрес, который привязан к нашему домену. A-запись указывает IP в формате IPv4, а запись AAAA — в формате IPv6.

ya.ru.	7199	IN	MX	 10 mx.yandex.ru.

MX-запись также имеет параметр приоритета. Так как серверов для отправки почты может быть несколько, то и записей может быть много, поэтому для определения основного сервера указывается приоритет записи. Чем меньше число, тем выше приоритет.

ya.ru.	3599	IN	SOA	 ns1.yandex.ru. sysadmin.yandex.ru. 2019021800 900 600 2592000 900

Запись SOA (Start of Authority) указывает на несколько различных параметров:

  1. Сервер с эталонной информацией о текущем домене
  2. Контактную информацию ответственного лица
  3. Различные параметры кеширования записей

Бывают и некоторые более специфичные ресурсные записи, о которых здесь не было речи, но это не значит, что они бесполезны. Полный перечень таких записей всегда можно найти в документации (например по DNS-серверу BING).

Выводы

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

Поделиться
Отправить