DNS сервер - как оно работает... |
||||
---|---|---|---|---|
Если посмотреть большинство более-менее популярных статей об устройстве Интернета, то про DNS там чаще всего будет сказано что-то типа "DNS сервер обеспечивает трансляцию имен сайтов в IP адреса". В принципе, это действительно является его основной задачей и для большинства пользователей (и даже компьютерщиков) этих знаний вполне достаточно. Но если вдруг вам придется отлаживать сеть, которой провайдер выделил какой-то блок "честных" адресов, или поднимать в локальной сети свой DNS сервер, то очень быстро всплывут всякие страшные слова: "зона", "трансфер", "форвардер", "in-addr.arpa" и другие... Поэтому в этой заметке мы попробуем чуть более подробно поговорить о работе DNS. Очень приблизительно можно сказать, что у каждого компьютера в Интернете есть два основных идентификатора: доменное имя (например, www.listsoft.ru) и IP адрес (например, 127.0.0.1). Приблизительность заключается в том, что во-первых IP адресов у компьютера может быть несколько (мало того, что у каждого интерфейса свой адрес, так еще и несколько адресов могут "висеть" на одном интерфейсе); во-вторых, имен тоже может быть несколько, причем они могут связываться как с одним, так и с несколькими IP адресами; в-третьих, у компьютера может и не быть доменного имени... Словом, ясно, что картина уже начинает запутываться... Как было сказано выше, основной задачей DNS сервера является трансляция доменных имен в IP адреса и обратно. На заре становления Интернет (когда он еще был ARPANET'ом) это решалось ведением длинных списков, включающих все компьютеры сети, причем копия такого списка должна была присутствовать на каждом компьютере. Понятно, что с ростом сети эта технология перестала удовлетворять кого бы то ни было - ведь эти файлы еще и синхронизировать надо было, не говоря об их размере... Некоторые "пережитки" этого метода можно обнаружить и сейчас: существует файл HOSTS (и в UNIX и в Windows), в котором можно прописывать адреса серверов с которыми вы регулярно работаете (кстати, именно его использование лежит в основе многих "ускорителей Интернета" - такие программы просто записывают адреса серверов, к которым вы обращаетесь в файл HOSTS и при следующем обращении данные берутся из него, не расходуя время на запрос к DNS серверу). На смену "однофайловой" схеме пришел DNS - иерархическая структура имен. Существует "корень дерева", с именем "." (точка). Т.к. корень един для всех доменов, то точка в конце имени обычно не ставится (но она используется в описаниях DNS - тут надо быть очень внимательным!). Ниже корня лежат домены первого уровня. Их не много - com, net, edu, org, mil, int, biz, info, gov (ничего не забыл?) и домены государств, например, ru. Еще ниже находятся домены второго уровня, например, listsoft.ru. Еще ниже - третьего и т.д. Иерархичность DNS серверов - штука довольно интересная, если проследить прохождение запроса. При установке (точнее, при настройке) клиенту указывается как минимум один DNS сервер (как правило их два) - его адрес выдается провайдером. Клиент посылает запрос этому серверу. Сервер, получив запрос, либо отвечает (если ответ ему известен), либо пересылает запрос на "вышестоящий" сервер (если он известен) или на корневой (каждому DNS серверу известны адреса корневых DNS серверов). Так выглядит "восходящая иерархия". Затем запрос начинает спускаться вниз - корневой сервер пересылает запрос серверу первого уровня, тот - серверу второго уровня и т.д. Таким образом, каждый DNS сервер работает как хороший компьютерщик: он всегда либо знает ответ, либо знает у кого спросить... Помимо "вертикальных связей" у серверов есть еще и "горизонтальные" отношения - "первичный - вторичный". Действительно, если предположить, что сервер, обслуживающий какой-то домен и работающий "без страховки" вдруг "упадет", то все машины, расположенные в этом домене окажутся недоступны! Именно поэтому, при регистрации домена второго уровня выдвигается требование указать минимум два сервера DNS, которые будут этот домен обслуживать. DNS сервера бывают рекурсивные и нерекурсивные. Первые всегда возвращают клиенту ответ - они самостоятельно отслеживают отсылки к другим DNS серверам и опрашивают их. Нерекурсивные сервера возвращают клиенту эти отсылки, так что клиент должен самостоятельно опрашивать указанный сервер. Рекурсивные сервера удобно использовать на низких уровнях, в частности, в локальных сетях. Дело в том, что они кэшируют все промежуточные ответы и при последующих запросах ответы будут возвращаться намного быстрее. Нерекурсивные сервера обычно стоят на верхних ступенях иерархии - т.к. они получают очень много запросов, то для кэширования ответов никаких ресурсов не хватит! Полезным свойством DNS является умение использовать "пересыльщиков" (forwarders). "Честный" DNS сервер самостоятельно опрашивает другие сервера и находит нужный ответ, но если ваша сеть подключена к Интернету по медленной (например, dial-up) линии, то этот процесс может занимать довольно много времени. Вместо этого можно перенаправлять все запросы, скажем, на сервер провайдера, а затем принимать его ответ. Использование "пересыльщиков" может оказаться интересным и для больших компаний с несколькими сетями: в каждой сети можно поставить относительно слабый DNS сервер, указав в качестве "пересыльщика" более мощную машину, подключенную по быстрой линии. При этом все ответы будут кэшироваться на этом мощном сервере, что ускорит разрешение имен для целой сети. Для каждого домена администратор ведет базу данных DNS. Эта база данных представляет из себя набор простых текстовых файлов, расположенных на основном (первичном) сервере DNS (вторичные сервера периодически копируют к себе эти файлы). В файлах конфигурации сервера указывается в каком именно файле содержатся описания каких зон и является ли сервер первичным или вторичным для этой зоны. Элементы базы DNS часто называют RR (сокращение от Resource Record). Базовый
формат записи выглядит как В записях можно использовать символы # и ; для комментариев, @ для обозначения текущего домена, () (скобки) для написания данных на нескольких строках. Кроме того, можно использовать метасимвол * в имени. Порядок записей не имеет значения за одним исключением: запись SOA должна идти первой. Дальнейшие записи считаются относящимися к той же зоне, пока не встретится новая запись SOA. Как правило, после записи зоны указывают записи DNS серверов, а остальные записи располагают по алфавиту, но это не обязательно. Теперь попробуем рассмотреть записи. Первой описываем зону: Сначала идет имя домена: mycompany.ru. (обратите внимание на точку в конце
имени). Вместо имени можно было (и чаще всего так и делают) поставить знак @.
Теперь опишем сервера имен, обслуживающие наш домен: mycompany.ru. IN NS
ns.mycompany.ru. Дальше идут записи A, описывающие ваши компьютеры и позволяющие преобразовать
имена в IP-адреса. Записи CNAME позволяют дать машинам удобные или значащие имена. Например
Записи MX нужны для того, чтобы указать куда пересылать почту. В этих записях
добавляется приоритет - чем он меньше, тем выше приоритет машины. Приоритеты
нужны для того, чтобы можно было задать несколько записей и перенаправить почту
на альтернативный сервер, если основной не работает. MX запись должна быть
указана для домена в целом и, возможно, для каждой машины в отдельности.
Сложного тут тоже ничего нет за одним исключением: очень часто встречается
неправильно использование метасимвола "*". Запись "*.mycompany.ru." означает не
"любая машина домена mycompany.ru", а "любая машина, которая еще не была
описана". Причем, даже если использовалась не MX, а, например, A запись, то
звездочка все равно не будет работать для этой машины. Более подробно почитать
об использовании метасимволов можно в RFC 1034,
раздел 4.3.3 В принципе, метасимволы нужны только для того, чтобы принимать
почту для сети, находящейся за бранмауэром и для того, чтобы пересылать почту в
сети, не подключенные к Интернет (например, работающие через UUCP). Так как
записи DNS меняются довольно редко, то имеет смысл прописать MX записи для всех
машин, описанных записями A. На этом создание файла зоны можно считать законченным. Но остается более увлекательное занятие: описание реверсной зоны. Если предыдущий файл позволяет определить IP-адрес по имени, то теперь надо сделать так, чтобы по IP-адресу можно было "вычислить" имя. Отсутствие реверсной зоны является довольно типичной ошибкой и может приводить к самым разным ошибкам - начиная от сбоев FTP серверов и кончая классификацией отправленных писем как спама. Для обратного преобразования используются записи PTR. Но не торопитесь их вписывать - тут есть одна хитрость: они пишутся в отдельном специальном домене верхнего уровня, с названием IN-ADDR.ARPA. Домен этот был создан для того, чтобы и для прямого и для обратного преобразования можно было использовать одни и те же программные модули. Дело в том, что "мнемонические" имена пишутся слева направо: www.listsoft.ru означает, что www находится в listsoft, а listsoft - в ru. IP-адреса пишутся наоборот: 195.242.9.4 означает, что машина 4 находится в подсети 9, которая является частью 195.242 И для сохранения "единого стиля" адресов для обратного преобразования используются имена вида 4.9.242.195.IN-ADDR.ARPA (обратите внимание, что IP-адрес записан в обратном порядке). Итак, мы создаем еще один файл зоны (для зоны, например,
0.168.192.IN-ADDR.ARPA), копируем в него запись SOA (а заодно и NS), после чего
начинаем писать Не забудьте еще задать обратное преобразование для 127.0.0.1 Обратите внимание на то, что право на ведение "прямого" домена не зависит от провайдера - его выдает организация, ведающая распределением имен в нужном вам домене. А вот пул IP-адресов находится в ведении провайдера и именно провайдер делегирует (или не делегирует) вам права на ведение реверсной зоны. В связи с тем, что зачастую клиентам выдается не целая сеть класса "C", а ее часть, то и реверсная зона находится на сервере провайдера. Так что вам придется наладить с ними взаимодействие в отношении обновления данных. Напоследок одно маленькое замечание. Исследование DNS является одним из первых этапов "изучения сети" при подготовке ее взлома. Чаще всего используется перенос зоны, при котором все записи зоны передаются на компьютер "исследователя" где он их может изучать в спокойной обстановке. Поэтому имеет смысл (помимо всего прочего) настроить бранмауэр на запрет TCP соединений по 53 порту с несанкционированных адресов (в запросах на определение имен используется UDP, а для переноса зоны - TCP). Для того, чтобы посмотреть что записано в DNS используется команда nslookup (она есть и в UNIX и в Windows). |