- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF142:DrBrown3
Материал из Linuxformat.
Содержание |
Настройка DNS-сервера
- Там, где задача настройки DNS-сервера становится выполнимой.
В прошлом номере я описал архитектуру DNS, ее иерархическое пространство имен и пошаговый процесс запроса. Мы поговорили о типах записей и обсудили настройку клиента для разрешения имен. В этой статье я сосредоточусь на серверной части DNS.
Для начала – несколько терминов. DNS (Domain Name System – система доменных имен) представляет собой описание архитектуры. BIND (Berkeley Internet Name Domain – доменное имя Интернет Беркли) – реализация DNS, используемая в Linux, а демон, представляющий сервис, носит имя named (произносите «нэйм-ди», не то опозоритесь среди знатоков Linux).
Типы DNS-серверов
Ролей, в которых может выступать DNS-сервер, три. Первая – первичный сервер [master], который содержит авторитативные данные для зоны. Эти данные хранятся в файле зоны, с которым мы ознакомимся позже. У каждой зоны, т. е. у каждой части пространства имен DNS, есть ровно один первичный сервер. Чтобы распределить нагрузку и избежать появления единственной точки отказа, у доменов обычно есть один или несколько вторичных серверов [slave]. Эти серверы получают данные для своей работы от первичного сервера при передаче зоны. Наконец, существуют только кэширующие DNS-серверы. На таком сервере не хранятся авторитативные данные для зон, но он перенаправляет запросы от своих клиентов и кэширует результаты. Со временем в кэше сервера накапливаются данные, используемые для разрешения последующих запросов. Роли не исключают друг друга. Один и тот же сервер может быть первичным для одних доменов, вторичным для других и кэширующим для остальных.
Давайте рассмотрим конфигурацию этого гибридного сервера. Файл настройки named – скорее всего /etc/named.conf или /etc/bind/named.conf, в зависимости от дистрибутива. В примере A показан такой файл. Как и следовало ожидать, проще всего настроить кэширующий сервер имен. Для этой статьи я установил Bind 9 и немного удивился тому, что он работает как кэширующий DNS-сервер без всяких дополнительных настроек! Однако стоит хотя бы сказать ему, где находятся его корневые серверы имен, с помощью так называемого файла «корневых подсказок» [root hints] (строки с 9 по 13). Также, если неподалекуесть еще несколько DNS-серверов, принадлежащих, вероятно, вашему провайдеру, ваш сервер может использовать их для перенаправления (строки с 4 по 6). Эти серверы должны стремиться выполнять рекурсивные запросы. Например, здесь нельзя указать корневой сервер имен.
Настроить первичный сервер для зоны чуть сложнее, потому что понадобится создать файл зоны. В таких файлах содержатся «исходные данные» DNS: записи A, записи NS, записи MX и т. д., о которых мы говорили в прошлом месяце. В этом примере мой сервер является первичным для домена example.com. В конфигурационном файле строки с 17 по 20 говорят моему DNS-серверу, что он является первичным для домена example.com, и сообщают ему о местоположении файла зоны. Сам файл зоны приведен в примере B на обороте, и сейчас мы по нему пройдемся. Учтите, что формат этих файлов задается стандартом IETF, определен ным в RFC 1035 – он не специфичен для Bind.
Пройдемся по файлу зоны
В первой строке задается значение по умолчанию для поля «время жизни» (TTL). Оно задается в секундах и равно 86400 (86400 секунд – один день; также можно было указать 24h или 1d). Время жизни – понятие, важное для DNS: каждый раз, когда у авторитативного DNS-сервера запрашивается запись ресурса, в его ответ включается поле «время жизни», которое определяет, как долго кэширующий DNS-сервер может хранить эту запись, прежде чем выйти в мир и получить свежую копию. И здесь приходится балансировать между двумя альтернативами. Большие значения TTL снижают трафик DNS (особенно загрузку серверов верхнего уровня) и увеличивают производительность. Маленькие значения TTL улучшают реакцию DNS на появление, исчезновение или изменение IP-адресов серверов.
Продолжим нашу прогулку по файлу зоны. Запись SOA (start of authority – начало полномочий) в строках со 2 по 7 означает, что сервер является авторитативным для зоны. Первая строка определяет первичный сервер для зоны и содержит адрес электронной почты ответственного лица (с точкой . вместо @). Запись SOA также включает ряд временных параметров, которые определяют, как часто вторичные серверы имен должны обновлять информацию с первичного и как долго они могут продолжать пользоваться данными своих копий, если не могут связаться с первичным сервером. Вдаваться в подробности мы здесь не будем.
Записи NS в строках 9 и 10 говорят, где находятся сервера имен для данного домена. @ в первом поле строки 9 – условное обозначение источника: зоны, к которой относится файл. В данном случае это example.com. Пустое поле в следующей строке означает «использовать то же значение, что в предыдущей строке», и такое сокращение часто используется в файлах зон. Вы также видите, что у домена есть два сервера имен: первичный, ns.example.com, который фактически находится в обслуживаемом зоной домене, и вторичный buddysite.somewhere.com, в каком-либо другом месте. (Если кто-то не понял, все эти данные вымышлены!)
Особые точки
Обратите особое внимание на точку . в конце имен. Не будь ее, Bind добавил бы к имени исходный домен. Скажем, если бы я опустил точку в конце строки 10, предполагаемое имя стало бы buddysite.somewhere.org.example.com, а это не то, чего я хотел. Это аналогично абсолютным и относительным путям в файловой системе, с той разницей, что пути записываются «от старшего к младшему» – самая важная часть идет в начале, а доменные имена – «от младшего к старшему». Так, путь var/log/messages без начального слэша будет интерпретироваться относительно текущего каталога.
Строки с 12 по 17 содержат записи типа A, которые связывают имена компьютеров с IP-адресами. В этих строках точки в конце имени опущены умышленно. Строка 15, например – запись типа A для venus.example.com. Обратите внимание, что в строке 17 мы определяем второй IP-адрес для earth.example.com, так как пустое первое поле наследует значение с предыдущей строки.
Наконец, в строках 19 и 20 задаются записи CNAME, выступающие в роли алиасов: они связывают имена ftp.example.com и www.example.com с так называемым каноническим именем mercury.example.com. Записи CNAME проще поддерживать: если IP-адрес компьютера изменился, нужно обновить только за-пись типа A для канонического имени.
После изменения файла зоны или файла named.conf нужно перезапустить демон. Команда зависит от дистрибутива и будет примерно такой:
# service bind9 restart
Признаюсь, раньше я никак не мог совладать с синтаксисом файлов зоны – всегда казалось, что гораздо проще все испортить, чем сделать все правильно. Чаще всего я забывал ставить точки после имен доменов и пропускал завершающие точки с запятой в named.conf. Вы бы могли сказать, что, полжизни занимаясь программированием на C, я должен был хотя бы не забывать о точках с запятой! Так или иначе, я завел привычку заглядывать в соответствующий файл журнала (скорее всего /var/log/messages или /var/log/syslog) после изменения настроек и перезапуска демона, чтобы убедиться, что Bind был запущен корректно или чтобы увидеть, где произошла ошибка.
В нашей текущей конфигурации есть работающий первичный DNS-сервер для домена example.com. Однако, чтобы быть ответственным жителем мира DNS, наш сервер должен также предоставить записи PTR для поддержки обратных запросов DNS – преобразований IP-адреса в полностью определенное имя домена (FQDN). Как я рассказывал в предыдущей статье, эти записи находятся в пространстве имен, корнем которого является in-addr.arpa. В случае с сетью 192.168.0.0/24 в нашем примере, источник этой зоны – 0.168.192.in-addr.arpa. Настройка этой зоны и ее конфигурационный файл во многом похожи на прямую зону, которую мы только что рассмотрели, хотя имена выглядят немного забавно.
Строки с 22 по 27 в файле named.conf (пример A) говорят моему DNS-серверу, что он является первичным для 0.168.192.in-addr.arpa, и задают файл зоны. Сам файл приведен в примере C. Как и в предыдущем файле зоны, в этом есть запись SOA и записи для серверов имен. Нам интересны последние четыре строки, где определяются записи PTR (pointer – указатель). Номеров строк я не добавлял: здесь пронумерованы сами имена записей. Помните, что если имя не заканчивается на точку ., к нему будет добавлено имя исходного домена. Так, например, в самой последней строке файла определена запись PTR для 4.0.168.192.in-addr.arpa; ей будет соответствовать компьютер с IP-адресом 192.168.0.4.
Где узнать больше
В этой статье я постарался сжато изложить основы, но есть несколько ключевых технологий DNS, о которых я не упомянул – в частности, работа со вторичными серверами и использование ими переносов зон и инкрементальных переносов зон для синхронизации с первичным сервером. Я также не рассказал о динамических обновлениях DNS, позволяющих добавлять и удалять записи ресурсов на лету – это важно для серверов, которые получают свой IP-адрес через DHCP. Я не рассказал подробно и о DNS-SEC, расширениях безопасности DNS, которые позволяют администраторам зоны подписывать данные зоны с помощью шифрования с открытым ключом, в доказательство истинности этих данных.
Если вы хотите узнать больше, искренне советую вам книгу “DNS and BIND” Албитца [Albitz] и Лю [Liu] издательства O’Reilly. Она была моим исчерпывающим руководством по DNS на протяжении многих лет. Также взгляните на прекрасную электронную книгу Рона Эйтчисона [Ron Aitchison] по адресу http://zytrax.com/books/dns или купите ее бумажную версию “Pro DNS and Bind”, опубликованную в издательстве Apress.
Советы по отладке
- Проверяйте корректность операций с клиента с помощью dig (об этом я рассказывал в прошлом месяце).
- Сообщения об ошибках при загрузке зоны можно найти в файлах /var/log/messages и /var/log/syslog.
- С помощью программы Rndc (она же Ndc) можно динамически изменять уровень вывода отладочной информации. Например, следующей командой задается уровень 3:
# rndc trace 3
А вот команда, выводящая кэш сервера в файл named_dump.db:
# rndc dumpdb -all
Файл появится в каталоге, заданном в параметре directory в named.conf.