Серверы, выполняющие поиск информации в DNS, призваны отвечать на запросы своих клиентов о тех или иных адресах. Ответы они ищут, опрашивая другие серверы DNS. То есть в рамках обеспечения работы сервиса доменных имен различные DNS-серверы обмениваются между собой информацией.
Серверы, опрашивающие DNS в поисках нужных адресов, называются рекурсивными резолверами (от англ. resolve – решать, решение, резолюция), или просто резолверами (также иногда используются термины «сопоставитель» и «рекурсор»).
С точки зрения пользователя и в сильно упрощенном виде алгоритм работы DNS-резолвера по поиску адресов сайтов можно описать следующим образом. Когда пользователь вводит в адресной строке браузера адрес сайта, например hat.nic.ru, компьютер выполняет запрос к тому или иному известному ему DNS-резолверу, спрашивая этот сервер о том, какой IP-адрес связан с «доменным адресом», указанным пользователем. В ответ сервер-резолвер DNS, проверив соответствие по своим внутренним таблицам или выполнив запрос к другим серверам, присылает искомый IP-адрес. Далее браузер устанавливает соединение с сайтом уже по IP-адресу.
По отношению к другим серверам DNS-резолвер выступает клиентом, так как отправляет запросы, на которые они отвечают с теми или иными данными. У резолвера есть и свои клиенты, для них он – сервер. Это операционные системы на компьютерах, обслуживаемых данным резолвером. Например, в сети интернет-провайдера обязательно существует резолвер, обслуживающий его клиентов. Традиционно им является сервер, доступный изнутри сети по известному IP-адресу.
В ряде случаев работа DNS-резолвера, пытающегося выяснить IP-адрес, соответствующий заданному имени домена, начинается с запроса к одному из корневых серверов. Корневой сервер, конечно, не знает ответа для каждого из имен, существующих в Интернете, однако он может сообщить клиенту адреса тех серверов, которые располагают информацией об искомом имени, – и клиент обратится к следующим серверам с тем же запросом. В этом и состоит рекурсия. Ниже мы разберем процесс подробно.
Попробуем проследить за запросами на простом примере. Предположим, что требуется определить IP-адрес, соответствующий домену www.nic.ru.
Сразу нужно обговорить пару важных моментов. Во– первых, резолвер, занимающийся поиском имен, – это обычно специальная программа, работающая на том или ином компьютере. Как мы разобрались, резолвер обрабатывает запросы вида «А какой адрес у www.nic. ru?», поступающие от других программ и компьютеров. Резолвер может быть и локальным, то есть работающим на том же компьютере, где, например, запущен браузер. Во-вторых, наиболее важные из резолверов (кэширующие DNS-серверы) обслуживают множество разных запросов и имеют собственный кэш адресов (особую память), в котором в течение определенного времени сохраняются ранее полученные из DNS сведения об адресации внутри доменов. Наличие такого кэширования – важнейшая особенность DNS, делающая эту систему распределенной и устойчивой к большим нагрузкам.
Вернемся к нашему примеру: получив запрос о www. nic.ru резолвер прежде всего проверит свой кэш; если там не удастся найти ответа на вопрос об адресе узла с именем www.nic.ru, то рекурсивный резолвер начнет опрос глобальной DNS с запроса к одному из корневых серверов. Конечно, корневой сервер не знает ответа на вопрос о www.nic.ru, но он сообщит резолверу адреса тех серверов, которые отвечают за доменную зону .ru, благо они содержатся в корневой доменной зоне. Серверы .ru в свою очередь отправят резолвер к серверам, отвечающим за .nic.ru, и те наконец ответят о www.nic.ru, то есть об адресе узла, соответствующего домену третьего уровня www.nic.ru. Вот так рекурсивно работает DNS.
Надо заметить, что сейчас на подавляющем большинстве пользовательских компьютеров используются так называемые глупые (dumb или stub в англоязычной литературе) или, если выразиться более корректно, «простые» резолверы, которые не умеют выполнять сложные рекурсивные DNS-запросы, требующие обхода множества серверов имен. Они целиком полагаются на тот или иной известный им «умный» резолвер – кэширующий сервер DNS, – просто передавая свои запросы ему. Традиционно это сервер интернет-провайдера, обеспечивающего доступ к Сети. В такой конфигурации запросы к корневым серверам, а равно и к серверам, отвечающим за другие доменные зоны, выполняет сервер провайдера, делая за «глупого» всю сложную работу.
Беглое ознакомление с устройством глобальной DNS наводит на следующий вопрос: откуда только что подключенный к Интернету компьютер может узнать адреса корневых серверов? Обычно они задаются в специальных файлах, распространяемых в составе дистрибутивов операционных систем. А компьютер, программное обеспечение которого использует простой, «глупый» ре-золвер, может начать работать с глобальной DNS после того, как получит IP-адрес того или иного DNS-сервера. Этот IP-адрес указывается при начальной настройке операционной системы или при настройке сетевого соединения.
Здесь важно запомнить следующее: адреса корневых серверов требуются для работы полноценного рекурсивного резолвера, такой резолвер предоставляет интернет-провайдер (или другой сервис-провайдер); «глупый» резолвер, являющийся стандартным для большинства пользовательских компьютеров, нуждается в адресе хотя бы одного полноценного рекурсивного резолвера, которому он будет переправлять поступающие запросы.
Существуют автоматические методы настройки адресов DNS для пользовательских компьютеров, подключенных к локальной сети. Их подробное рассмотрение выходит за рамки книги. Ключевой момент тут простой: базовые адреса для работы DNS жестко задаются извне, но при этом никто не может помешать сделать нестандартные настройки, то есть, например, использовать какие-то другие корневые серверы. Именно здесь и коренится основа доменных войн (или так называемых войн DNS, приведших в конце 1990-х годов к серьезным изменениям в политике управления Сетью). Подробнее об этой основе и ее историческом значении рассказывается в главе 3.
Другой особенностью корневых серверов глобальной DNS является то, что изменение их IP-адресов (напомню, что именно по этим адресам компьютеры в Сети находят друг друга) – очень большая проблема. Действительно, использовать DNS для первичного поиска адресов корневых серверов не получится, так как именно с обращения к ним начинается работа с самой DNS. Сохраненные в исходных настройках той или иной операционной системы компьютера IP-адреса корневых серверов очень сложно будет поддерживать в актуальном состоянии, если они начнут часто изменяться.
Посудите сами: разнообразных классов/типов/линеек/ версий операционных систем в лучшем случае насчитываются как минимум сотни. Дистрибутивы (наборы файлов, служащие для установки операционной системы на компьютер) также бывают самыми разными и сохраняются в неизменном состоянии годами. Что уж говорить про уже настроенное программное обеспечение – оно также не всегда обновляется, а если и обновляется, то далеко не оперативно. В итоге получается, что изменить IP-адрес корневого сервера не так трудно, но вот отследить и скорректировать все директивные упоминания старого адреса – задача чрезвычайной сложности. Если такое произойдет, многие компьютеры продолжат обращаться по старому адресу корневого сервера и не смогут получить ответ. Впрочем, так как серверов несколько, возможна постепенная «миграция» адресов: не сумев установить соединение с одним из корневых серверов, компьютер, пытающийся работать с DNS, соединится с другим корневым сервером, адрес которого не изменялся, и получит возможность определить актуальные адреса всех 13, уже задействовав DNS.
На практике, однако, после изменения IP-адресов некоторых корневых серверов запросы по старым адресам продолжали фиксироваться еще долгие годы после «переезда». Эта особенность только подтверждает факт, что DNS в глобальном плане требует очень непростого управления и весьма чувствительна к изменениям. Одно неловкое движение – и случится неприятность: Интернет для всех рядовых пользователей «погаснет».
С DNS связано множество проблем безопасности, актуальных как для клиентских компьютеров, так и для всей Глобальной сети в целом. Например, особо продвинутые хакеры могут проводить атаки на серверы DNS с целью их перегрузки, вызывающей отказы в обслуживании. Подмена адресов в DNS может приводить к тому, что пользователи, набирающие в адресной строке привычное имя домена, ранее привязанного к одному сайту, будут соединяться с совсем другим сервером, например с сервером злоумышленников, представляющим собой поддельный интернет-магазин, собирающий данные о кредитных картах посетителей.