Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

DNS. Копаем глубоко

B!rd Feathery

Xakep, номер #069, стр. 069-026-3


DNS-серверы должны уметь выдерживать огромные нагрузки. Например, на серверы доменов первого уровня (типа RU) приходят десятки тысяч запросов в секунду. А на корневые (эти 13 серверов - популярнейшая мишень хакерских атак) - и того больше.

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

У каждого домена в его зонных данных обычно присутствует информация о DNS-серверах для каждого его поддомена. Такая структура позволяет DNS-клиентам опускаться по цепочке серверов от самого крупного к самому мелкому в поисках какого-либо узла. Посмотри, как можно было бы искать домен mail.yandex.ru. Сначала мы могли бы опросить корневой сервер, он переслал бы нас к одному из серверов домена RU. Тот, в свою очередь, отправил бы нас к серверам домена yandex.ru (ns1.yandex.ru, ns2.yandex.ru, ns3.yandex.ru), которые и дали бы нам адрес mail.yandex.ru (213.180.194.65).

Серверы бывают рекурсивными и нерекурсивными. Если нерекурсивный сервер располагает информацией о запрашиваемом имени, он дает соответствующий ответ. В противном случае такой сервер вернет клиенту отсылку на авторитетные серверы, которые знают (или должны знать) ответ. Клиент в этом случае должен уметь распознать ссылку на другой сервер и послать свой запрос ему. Такие пересылки могут происходить до тех пор, пока мы не найдем, наконец, нужный сервер. Рекурсивный сервер освобождает нас от обязанности скакать по серверам в поисках удовлетворяющего ответа. Он сообщает только реальные ответы либо говорит, что хост не может быть найден. Он сам найдет подходящий сервер, возьмет ответ у него и отошлет нам. Но за такие удобства приходится платить. Во-первых, процедура обработки запроса становится дольше, а во-вторых, в локальном кэше сервера накапливается туева хуча ответов промежуточных серверов.

Как это все работает

Все серверы, как минимум, должны знать адреса и имена корневых серверов, которые, в свою очередь, знают о доменах первого уровня RU, COM, NET, ORG и других. Сервер домена RU знает о существовании домена xakep.ru, сервер домена COM знает о домене livejournal.com. Каждая зона может делегировать (то есть передавать) полномочия по управлению своими поддоменами другим серверам.

Приведу реальный пример. Нам необходимо узнать адрес сервера img.yandex.ru (у Яндекса действительно есть отдельный сервер, оптимизированный для хранения картинок). Предположим, что в кэше нашего DNS-сервера никаких данных об img.yandex.ru нет. Наш локальный DNS-сервер обращается к корневому серверу. Корневой сервер отправляет нас к серверу зоны RU, в которой находится запрашиваемый адрес. Сервер зоны RU определяет по своей базе, что домен yandex.ru является делегированным и вся информация по его субдоменам хранится в DNS Яндекса (ns1.yandex.ru и другие), а не у него самого (как было бы в случае отсутствия делегирования), и отправляет нас к соответствующим серверам. И только после этого ns1.yandex.ru дает ответ, что адресом img.yandex.ru является 213.180.193.30.

Назад на стр. 069-026-2  Содержание  Вперед на стр. 069-026-4