- Настройка DNS-сервера BIND
- Материал из Xgu.ru
- Содержание
- [править] Инсталляция DNS-сервера BIND
- [править] Начальное конфигурирование DNS-сервера
- [править] Запуск DNS-сервера
- [править] Настройка DNS-сервера для работы в режиме авторитетного сервера
- [править] Настройка резолвера DNS
- [править] Клиенты DNS. Программа dig
- [править] Обратное преобразование имён
- [править] DNS и DHCP: Динамическое обновление
- [править] BIND в качестве DNS в AD
- DNS сервер BIND Дневник Максим Боголепов
- DNS сервер BIND
Настройка DNS-сервера BIND
Материал из Xgu.ru
|
Данная страница находится в разработке. Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной. |
Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.
Автор: Сергей Черепенин
Короткий URL: bind
На этой странице описывается процедура инсталляции и настройки DNS-сервера BIND для работы в режиме кэширующего и авторитетного сервера доменных имён.
Содержание
[править] Инсталляция DNS-сервера BIND
Установка сервера в Debian / Ubuntu:
[править] Начальное конфигурирование DNS-сервера
После установки сервера необходимо указать некоторые параметры для работы сервера. Это делается путем редактирования определенных директив в файле /etc/bind/named.conf.options:
Директива directory указывает на расположение в дереве каталогов временных файлов сервера.
Директива forwarders — на какие серверы пересылать запрос, если наш сервер сам не в состоянии определить имя или IP-адрес запроса клиентов.
Директива listen-on указывает на каких интерфейсах вести прослушивание 53 порта.
[править] Запуск DNS-сервера
После редактирования этого файла необходимо рестартовать сервер:
[править] Настройка DNS-сервера для работы в режиме авторитетного сервера
Далее необходимо указать в основном конфигурационном файле сервера /etc/bind/named.conf.local имена файлов, в которых мы далее опишем зоны для прямого и обратного преобразований. Добавляем следующие строки в этот файл:
Файл /etc/bind/db.unix.nt служит для описания зоны прямого преобразования, а файл /etc/bind/db.rev_unix.nt — для обратного
Содержание файла /etc/bind/db.unix.nt:
Содержание файла /etc/bind/db.rev_unix.nt:
Примечание: для быстрого описания всей зоны (254 хоста) можно дать команду в vim:
— для прямой зоны:
— для обратной зоны:
Другой вариант — использование директивы $GENERATE
для реверсной зоны и аналогично для прямой зоны
[править] Настройка резолвера DNS
Резолвер (resolver) — клиентская библиотека DNS, которая используется всеми программами Unix/Linux, которым нужен доступ к доменной системе имён.
Итак, прямое и обратное преобразование работает. На этом настройка DNS сервера завершена. Необходимо только указать операционной системе использовать только что сконфигурированный сервер. Делается это через файл /etc/resolv.conf:
[править] Клиенты DNS. Программа dig
Эти темы не раскрыты: Клиенты DNS. Программа dig
dig — программа, предназначенная для получения информации из DNS. Пришла на смену устаревшей программе nslookup.
Пример использования команды dig:
[править] Обратное преобразование имён
Эти темы не раскрыты: Обратное преобразование имён.
[править] DNS и DHCP: Динамическое обновление
Эти темы не раскрыты: Динамическое обновление.
[править] BIND в качестве DNS в AD
Эти темы не раскрыты: Динамическое обновление.
DNS сервер BIND Дневник Максим Боголепов
DNS сервер BIND
BIND является самой распространенной реализацией сервера DNS . Разработка ведется Internet Software Consortium ( ISC ) (замечание от Makc, организация стала называться Internet Systems Consortium). Лицензия собственная, позволяет использовать продукт бесплатно или за плату (контракт на поддержку). В комплекте с сервером BIND 9 поставляются утилиты DNS , клиентская библиотека DNS resolver, облегченная клиентская библиотека lightweight resolver и соответствующий ей демон lwresd, UDP /921 (по-моему, это очень вредная идея консорциума ISC , нарушающая принцип совместимости ПО). |
В статье описываются:
Формат файла настройки
Файл настройки BIND 9 обычно называется /etc/named.conf (можно изменить при установке). Формат файла зоны стандартен и приведен в описании архитектуры DNS . Утилита named-checkzone проверяет синтаксис файла зоны. В качестве параметра указываются имя зоны и имя файла. Утилита named-checkconf проверяет синтаксис файла настройки. В качестве параметра можно указать имя файла.
Комментарии в файле настройки могут записываться в стиле C, C++ или sh. Строки и идентификаторы, не являющиеся доменными именами, например, имена файлов, обязательно заключать в кавычки.
Во многих местах файла настройки используется такая синтаксическая конструкция, как список-шаблонов-адресов: список через точку с запятой шаблонов адресов, завершающийся точкой с запятой. Шаблон адреса – это либо IP-адрес, либо IP-адрес с указанием числа бит в маске адреса (например, 192.168.0.0/24), либо имя ACL (т.е. ссылка на ранее определенный утверждением acl список-шаблонов-адресов, либо список-шаблонов-адресов в фигурных скобках, либо ключевое слово key с последующим именем ключа (определяется утверждением key). Имена рекомендуется заключать в кавычки. Перед шаблоном адреса может стоять символ отрицания (восклицательный знак). Ключи попали в эту конструкцию, потому что они тоже определяют права доступа, хотя и не имеют отношения к адресам хостов. Исходный адрес сравнивается последовательно с элементами списка до первого успешного соответствия. Если перед этим элементом списка стоит символ отрицания, то процесс завершается и сравнение со всем списком-шаблонов-адресов считается неудачным. Предопределены следующие имена ACL :
- any – соответствует любой хост;
- none – не соответствует никакой хост;>
- localhost – соответствует IPv4 адрес любого интерфейса хоста;
- localnets – соответствует любой IPv4 адрес сети, к которой принадлежит любой интерфейс хоста.
Список-ключей – это список ключей через точку с запятой, завершающийся точкой с запятой.
Файл настройки состоит из утверждений, завершающихся точкой с запятой. Утверждение начинается с ключевого слова и может содержать блок предложений, заключенный в фигурные скобки. Предложение в блоке также завершается точкой с запятой, начинается с ключевого слова и может содержать блок. Утверждения обрабатываются последовательно. Предусматриваются следующие типы утверждений:
- acl имя-acl< список-шаблонов-адресов >; – (определяет именованный список-шаблонов-адресов);
- controls < inet ip-адрес [port порт- TCP ] allow < список-шаблонов-адресов > keys < список-ключей >; … >; – (каждое предложение inet определяет права доступа (адреса и ключи) к управляющему каналу rndc, открываемому по указанному адресу и номеру порта; номер порта по умолчанию – 953; вместо адреса можно указать символ “*“ – IPv4 адрес любого интерфейса хоста);
- include имя-файла; – (содержимое указанного файла включается в текст файла настройки; очень удобно для включения текста ключей из файла, защищенного от чтения посторонними; может использоваться внутри view);
- key идентификатор-ключа< algorithm hmac-md5; secret “секретная-строка-в-base-64”; >; – (определяет ключ для аутентификации и авторизации: rndc и TSIG определение ключа для TSIG можно описывать внутри утверждения view; использовать ключ можно в утверждениях server, controls и в списке-шаблонов-адресов);
- logging – (настройка журнализации; возможно только одно утверждение данного типа);
- lwres – (настройка сервера для выполнения функций демона lwresd);
- options – (глобальные опции и опции по умолчанию; возможно только одно утверждение данного типа);
- server ip-адрес-удаленного-сервера< опция; … >; (позволяет конкретизировать значения некоторых опций для конкретного сервера);
- trusted-keys – определение ключей DNSSEC ;
- view – описание вида (точки зрения) на доменное пространство, различным клиентам может быть представлено различное видение на пространство доменных имен;
- zone – описание зоны.
Утверждение options может содержать следующие предложения:
- version “строка”; – (по умолчанию – реальный номер версии; для отключения обработки надо использовать строку none, а лучше закрыть класс CHAOS из вида совсем, т.к. неизвестно о чем он ябедничает еще; сервер позволяет узнать номер версии с помощью запроса к встроенной псевдозоне bind класса CHAOS :
host -t txt -c CHAOS version.bind адрес-сервера - hostname hostname-string; – (по умолчанию – gethostname(); для отключения обработки надо использовать строку none, а лучше закрыть класс CHAOS из вида совсем, т.к. неизвестно о чем он ябедничает еще; сервер позволяет узнать имя конкретного хоста из группы anycast с помощью запроса к встроенной псевдозоне bind класса CHAOS (на моем сервере не заработало, попытка указать hostname приводит к сообщению о неизвестной опции):
host -t txt -c CHAOS hostname.bind адрес-сервера - directory имя-каталога; – (абсолютное имя рабочего каталога, все упоминаемые относительные имена файлов лежат в нем);
- key-directory имя-каталога; – (абсолютное имя каталога, в котором лежат публичные и частные ключи для безопасного изменения зон; отдельный каталог может потребоваться для увеличения безопасности);
- tkey-domain доменное-имя;
- tkey-dhkey имя-ключа этикетка-ключа;
- dump-file имя-файла; – (named_dump.db; имя файла, в который сбрасывается текущее состояние кеша доменных имен по команде rndc dumpdb);
- memstatistics-file path_name; – (не реализовано);
- pid-file имя-файла; – (/var/run/named.pid; в этот файл записывается номер процесса; можно указать none);
- statistics-file имя-файла; – (named.stats; к этому файлу добавляется статистика по команде rndc stats);
- zone-statistics yes/no; – (no; собирать статистику отдельно для каждой “своей” зоны);
- auth-nxdomain yes/no; – (no; всегда устанавливать бит AA в ответах NXDOMAIN , даже если сервер не является уполномоченным для данного домена; может потребоваться для совместимости);
- dialup dialup_option; – (позволяет уменьшить число дозвонов, если сервер находится на клиентском конце dialup-on-demand линии);
- has-old-clients yes/no; – (устарело; используйте auth-nxdomain yes и rfc2308-type1 no);
- host-statistics yes/no; – (не реализовано);
- minimal-responses yes/no; – (no; заполнять дополнительные секции в ответах только при крайней необходимости – отрицательный результат, делегирование; уменьшает нагрузку на сервер);
- notify yes/no/explicit; – (yes; посылать DNS NOTIFY при изменении зоны, для которой сервер уполномочен, серверам из NS и also-notifyexplicit – посылать только серверам из списка also-notify;
- recursion yes/no; – (yes; обслуживать рекурсивные запросы);
- rfc2308-type1 yes/no; – (не реализовано);
- forward – (only | first) ; (first; действует только при непустом списке forwarders; перенаправлять запросы, не имеющие ответов в кеше или своих зонах, серверам, указанным в списке forwarders; позволяет организовать общий кеш для нескольких серверов или доступ в Интернет через прокси; first – сначала делается запрос к серверам из списка, при неудаче производится собственный поиск; only – собственный поиск не производится;
можно настраивать отдельно для каждой зоны – см. утверждение zone); - forwarders < ip_addr [port ip_port]; … >; – (пусто; список IP-адресов и, возможно, номера портов серверов, которые будут обслуживать перенаправленные запросы; смотри forward);
- check-names ( master | slave | response )( warn | fail | ignore ); – (не реализовано, т.е. ignore?);
- allow-notify < список-шаблонов-адресов >; – (первичный сервер зоны; от кого наш сервер как вторичный уполномоченный сервер будет принимать извещения об изменениях зоны; можно настраивать отдельно для каждой зоны – см. утверждение zone);
- allow-query < список-шаблонов-адресов >; – (any; от кого принимать обычные запросы; можно настраивать отдельно для каждой зоны – см. утверждение zone);
- allow-transfer < список-шаблонов-адресов >; – (any; от кого принимать запросы на передачу зоны; можно настраивать отдельно для каждой зоны – см. утверждение zone);
- allow-recursion < список-шаблонов-адресов >; – (any; от кого принимать рекурсивные запросы; данные из кеша под запрет не попадают);
- allow-update-forwarding < список-шаблонов-адресов >; – (none; от каких хостов вторичный сервер будет принимать динамические изменения зоны для передачи их первичному уполномоченному серверу; авторы не советуют);
- allow-v6-synthesis < список-шаблонов-адресов >; – none; заморочки со “старыми” реализациями IPv6);
- blackhole < список-шаблонов-адресов >; – (none; с этих адресов запросы не принимаются и к ним запросы не посылаются);
- listen-on [ port ip_port ] ; (по умолчанию – все интерфейсы, порт 53; адрес и порт для приема запросов; может быть несколько таких предложений);
- listen-on-v6 [ port ip_port ] < список-шаблонов-адресов >; – (none; для IPv6);
- query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ] ; – (обратный адрес и номер порта для запросов к другим серверам; по умолчанию или * в качестве адреса – INADDR _ANY; по умолчанию или * в качестве номера порта – случайный непривилегированный порт; в TCP запросах всегда используется случайный непривилегированный порт);
- query-source-v6 … – (для IPv6);
- also-notify < ip_addrport ip_port; … ] >; – (по умолчанию – пустая строка; список адресов серверов, которым посылается DNS NOTIFY при изменении зоны, для которой сервер уполномочен, в дополнение к серверам из списка NS; см. предложение notify и утверждение zone);
- max-transfer-time-in число-минут; – (120; максимальное время приема зоны);
- max-transfer-time-out число-минут; – (120; максимальное время передачи зоны);
- max-transfer-idle-in число-минут; – (60; максимальное время отсутствия прогресса при приеме зоны);
- max-transfer-idle-out число-минут; – (60; максимальное время отсутствия прогресса при передаче зоны);
- serial-query-rate раз-в-секунду; – (20; максимальное число запросов SOA в секунду со стороны нашего сервера как вторичного уполномоченного сервера к соответствующим первичным серверам для определения необходимости приема зоны);
- transfer-format ( one-answer | many-answers ) ; – (many-answers; при выборе формата one-answer при передаче зоны используется отдельный пакет для каждой RR, many-answers – в каждый пакет упаковывается столько RR, сколько в него может поместиться; many-answers эффективнее, но не поддерживается BIND 4; см. утверждение server);
- transfers-in число; – (10; максимальное число одновременно принимаемых зон);
- transfers-out число; – (10; максимальное число одновременно передаваемых зон);
- transfers-per-ns число; – (2; максимальное число одновременно принимаемых зон с одного сервера; см. утверждение server);
- transfer-source ( ip4_addr | * ) [ port ip_port] ; – (по умолчанию – адрес интерфейса, “ближайшего” по мнению ОС к удаленному серверу; определяет локальный адрес при запросе передачи зоны от удаленного сервера; также определяет адрес и UDP порт для перенаправляемых динамических изменений и проверок изменения зоны на первичном сервере (запрос SOA ); именно этот адрес должен быть разрешен для передачи на удаленном сервере, так что рекомендуется задавать его явно; см. утверждения server и view);
- transfer-source-v6 … – (передача зоны осуществляется с помощью IPv6);
- notify-source ( ip4_addr | * ) [port ip_port] ; – (?; определяет локальный адрес и UDP порт при посылке DNS NOTIFY вторичным серверам; именно этот адрес должен быть указан при настройке вторичного сервера в предложении master или allow-notify; см. утверждения zone и view);
- notify-source-v6 … – (посылка DNS NOTIFY осуществляется с помощью IPv6);
- max-journal-size размер; – (unlimited; максимальный размер журнального файла – хранит динамические изменения ( RFC 2136, RFC 3007) описания зоны на первичном сервере или результат обновлений зоны в формате IXFR ( RFC 1995) на вторичном сервере; имя файла образуется из имени зоны добавлением суффикса .jnl; файл имеет двоичный формат; изменения отображаются на файл зоны с некоторым интервалом с целью уменьшения нагрузки на компьютер, поэтому файл зоны нельзя редактировать вручную; используется для восстановлении файла зоны при перезапуске);
- coresize размер; – (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -c; размер coredump; можно использовать масштабирующие коэффициенты K, M и G);
- datasize размер; – (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -d; максимальный размер сегмента данных, который ОС выделит процессу; рекомендуется использовать только для увеличения недостаточного значения по умолчанию; можно использовать масштабирующие коэффициенты K, M и G);
- files число; – (unlimited; максимальное число одновременно открытых файлов);
- stacksize размер; – (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -s; максимальный размер сегмента стека, который ОС выделит процессу; можно использовать масштабирующие коэффициенты K, M и G;
- cleaning-interval число-минут; – (60; период очистки кеша от RR с истекшим TTL );
- heartbeat-interval number; – (для dialup-ных зон);
- interface-interval число-минут; – (60; интервал сканирования списка активных интерфейсов; 0 – сканировать только при запуске; сервер перестает прослушивать опущенные интерфейсы и начинает прослушивать вновь появившиеся при условии, что они подходят под шаблон listen-on);
- statistics-interval number; – (не реализовано);
- topology < список-шаблонов-адресов >; – (не реализовано);
- sortlist < список-шаблонов-адресов >; – (предложение позволяет организовать сортировку RR по адресу в ответе клиенту в зависимости от адреса клиента; правильно настроенный клиент должен делать это сам, настраивать это на сервере – утомительно);
- rrset-order <[ class класс-записи ] [ type тип-записи ] [ name “доменное-имя” ] order ( fixed | random*> | *cyclic ) ; … >; – (по умолчанию: class – ANY , type – ANY , name – * ; предложение позволяет отсортировать RR в ответе клиенту в зависимости от класса, типа и значения доменного имени; fixed – не менять порядок записей; random – перемешивать записи в случайном порядке; cyclic – при каждом запросе первой ставится очередная запись; действует только последнее предложение rrset-order в списке; не реализовано; сервер возвращает RR в случайном порядке?);
- lame-ttl число-секунд; – (600; кешировать информацию о неверном делегировании зон (lame-server), чтобы уменьшить нагрузку на журнал; не более 1800; похоже, что кеширование не реализовано?);
- max-ncache-ttl число-секунд; – (10800; максимальное время хранения в кеше отрицательных ответов; не более 7 дней – 604800 секунд);
- max-cache-ttl число-секунд; – (604800; максимальное время хранения в кеше положительных ответов);
- sig-validity-interval число-дней; – (30; время окончания действия цифровых подписей, автоматически генерируемых при динамическом обновлении DNSSEC зоны; время начала действия подписи – за час до текущего времени; не более 3660 дней);
- min-roots number; – (не реализовано);
- provide-ixfr yes/no; – (yes; отвечает как первичный сервер на запросы на передачу обновленной зоны в формате изменений – IXFR ; данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server);
- request-ixfr yes/no; – (yes; запрашивает как вторичный сервер передачу обновлений зоны в формате изменений – IXFR ; если удаленный сервер не поддерживает IXFR , то автоматически происходит откат к протоколу AXFR , данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server);
- ixfr-from-differences yes/no; – (no; вычисление и запись в журнал разницы между старым и новым содержимым зоны для последующей передачи ее в формате IXFR );
- min-refresh-time число-секунд; – (ограничивает интервал обновления зоны, указанный в SOA ; см. утверждения view*> и *zone);
- max-refresh-time число-секунд; – (ограничивает интервал обновления зоны, указанный в SOA ; см. утверждения view*> и *zone);
- min-retry-time число-секунд; – (ограничивает интервал повтора попыток обновления зоны, указанный в SOA ; см. утверждения view и zone);
- max-retry-time число-секунд; – (ограничивает интервал повтора попыток обновления зоны, указанный в SOA ; см. утверждения view и zone);
- port ip_port; – (53; номер TCP и UDP портов, который сервер будет использовать для приема и передачи пакетов; применимо только для отладки);
- additional-from-auth yes/no; – (yes; можно отключать только при отключении обслуживания рекурсивных запросов; заполнять дополнительную секцию ответа, если эта информация есть в “своих” зонах);
- additional-from-cache yes/no; – (yes; можно отключать только при отключении обслуживания рекурсивных запросов; заполнять дополнительную секцию ответа, если эта информация есть в кеше);
- random-device path_name; – (/dev/random; устройство или файл в качестве источника случайных чисел);
- max-cache-size размер; – (unlimited; максимальный размер памяти, выделяемой под кеш; можно использовать масштабирующие коэффициенты K, M и G);
- tcp-clients число; – (100; максимальное число одновременно обслуживаемых TCP соединений);
- recursive-clients число; – (1000; максимальное число одновременно обслуживаемых запросов; каждый запрос требует 20 КБ памяти);
- match-mapped-addresses yes/no; – (для IPv6);
- root-delegation-only [exclude < “имя”; … > ]; – (корневые зоны и зоны первого уровня, кроме списка исключений (“DE”, “LV”, “US”, “ MUSEUM ”), должны только делегировать подзоны).
Утверждение server может использоваться на верхнем уровне файла настройки или быть вложено в утверждение view. Если утверждение view содержит хотя бы одно утверждение server, то для данного вида используются только они (глобальные утверждения server игнорируются), иначе глобальные утверждения server действуют и на данный вид. Утверждение server может содержать следующие предложения:
- bogus yes/no; – (no; не отправлять запросы данному серверу);
- provide-ixfr yes/no; – (позволяет изменить значение опции, заданной глобально или для данного вида);
- request-ixfr yes/no; – (позволяет изменить значение опции, заданной глобально или для данного вида);
- edns yes/no; – (yes; пытаться ли использовать EDNS ; ?);
- transfers число; – (позволяет изменить значение опции transfers-per-ns, заданной глобально);
- transfer-format ( one-answer | many-answers ) ; – (позволяет изменить значение опции, заданной глобально);
- keys < string; … > ; – (задает идентификатор ключа для подписи сообщения TSIG для данного сервера; ответ не обязан быть подписан этим ключом; реализован только один ключ на сервер).
Утверждение zone устанавливает опции, специфические для указанной зоны. Формат утверждения следующий:
Имя зоны – это доменное имя корневого узла зоны.
Тип зоны определяет роль, которую сервер будет исполнять для этой зоны:
- master – сервер является первичным уполномоченным сервером для данной зоны, т.е. загружает содержимое зоны из файла зоны, указанного опцией file;
- slave – сервер является вторичным уполномоченным сервером для данной зоны; содержимое зоны считывается от одного из серверов, указанных в опции masters; указание имени файла в опции file позволяет сохранять резервную копию зоны в файле;
- hint – позволяет задать с помощью опции file имя файла, содержащего описание корневой зоны; этот файл можно взять в Internic; сервер при загрузке обращается к одному из корневых серверов, перечисленных в этом файле, для получения текущего списка корневых серверов; полученный список используется в течении указанного TTL ; для класса IN имеется встроенный список предполагаемых корневых серверов;
- stub – использовался в предыдущих версиях BIND для упрощения настройки; использовать не рекомендуется;
- forward – позволяет задавать список серверов, к которым будут перенаправляться запросы, не имеющие ответа в кеше, отдельно для данной зоны (см. предложения forward и forwarders в утверждении options);
- delegation-only – эта зона может содержать только записи о делегировании подзон.
Опции зоны (большинство опций позволяют заменить глобальные значения, заданные в утверждении options или взятые по умолчанию; они имеют тот же самый синтаксис и семантику):
Утверждение view позволяет выдавать различные ответы на один и тот же запрос в зависимости от того, кто спрашивает. То есть вид доменного пространства будет зависеть от точки зрения. Берётся первый подходящий вид в зависимости от адреса клиента (match-clients) или сервера (match-destinations). Если не определено ни одного вида, то по умолчанию создаётся вид “default” в классе IN, в который попадают описания всех зон для всех клиентов. Если хотя бы один вид описывается явно, то все зоны должны быть внутри видов. Формат утверждения следующий:
Чтобы принять 2 вида зоны slave сервер должен иметь 2 адреса, на которые будут передаваться различные виды.
Похоже, что BIND 9 не обслуживает передачу зон, для которых он не является уполномоченным.
Ведение журналов, сбор статистики и отладка
Утверждение logging позволяет задать произвольное число способов записи в журнал с помощью предложений channel и привязать различные категории сообщений к каналам с помощью предложений category. Описано в документации мутно (особенно про отладку) и точно так же работает (например, rndc reload не отключает часть отладочной печати).
В предложении channel задается имя канала, способ записи (в файл с ограничением его размера (можно использовать масштабирующие коэффициенты K, M и G) и числа версий, syslog, stderr, null), фильтр (минимальный уровень серьезности сообщений для вывода через этот канал) и формат вывода (выводить ли в каждое сообщение имя категории, уровень серьезности и метку времени; по умолчанию – нет):
Версии файла (file, file.0, file.1 и т.д.) перенумеровываются при каждом открытии, если максимальный размер файла не задан. Если задан и размер и число версий, то перенумеровывание при открытии происходит только при превышении этого размера. Если при записи в файл его максимальный размер будет превышен, то при указании числа версий происходит перенумерация файлов и открывается новый, если число версий не указано, то запись в файл просто прекращается.
Режим отладки задается либо при запуске (ключ -d), либо командой trace программы rndc (выключается командой rndc notrace). Команда trace позволяет указать уровень отладки (чем больше уровень, тем более подробная отладочная информация выдается, уровень 3 достаточно болтлив). При указании фильтра (severity) можно указать определенный уровень отладки (debug [ уровень ]) для включения отладочной печати данного уровня (и ниже) независимо от уровня отладки сервера (лишь бы ее включили) или указать ключевое слово dynamic для отладочной печати уровня, совпадающего с уровнем отладки сервера.
В предложении category задается имя категории и список ранее определенных каналов, через которые будут выводиться сообщения данной категории:
Определены следующие категории:
- default – (определяет каналы для тех категорий, каналы для которых не определены явно; queries при этом не включается);
- general – (неотсортированные в другие категории сообщения);
- database – (хранение зон и кеш);
- security – (при уровне отладки 3 – разрешения и запрещения, наличие подписей);
- config – (разбор файла настройки);
- resolver – (выполнение рекурсивных запросов клиентов, обращение к другим серверам, объем выдачи зависит от уровня отладки);
- xfer-in
- xfer-out
- notify
- client – (обработка клиентских запросов и посылка ответов, уровень отладки 3);
- unmatched – (отсутствует класс или view);
- network
- update
- queries – (включается командой rndc querylog; явная привязка этой категории к каналам также включает трассировку – severity info);
- dispatch – (передача запросов между модулями bind);
- dnssec
- lame-servers (severity info)
- delegation-only – (ответы NXDOMAIN в результате действия опции delegation-only).
Переопределять каналы (в т.ч. встроенные) нельзя, но можно привязать категории к новым каналам. Сообщения об ошибках синтаксиса файла настройки и о запуске сервера записываются как будто утверждение logging отсутствует (так что syslog:daemon тоже надо просматривать регулярно). По умолчанию принимается следующая настройка записи в журнал:
Количество статистической информации, собираемой BIND 9 сильно уменьшилось о сравнению с предыдущими версиями. Накопленная статистика добавляется командой rndc stats к файлу named.stats в рабочей директории (options, directory), очередной раздел обрамляется строками “Statistics Dump” с указанием времени в формате UNIX :
- success – число запросов, не вызвавших ошибок или возврата клиенту ссылки;
- referral – число запросов, на которые сервер вернул клиенту ссылки;
- nxrrset – несуществующих записей запрошенного типа для доменного имени;
- nxdomain – несуществующих доменных имен;
- recursion – число запросов, потребовавших рекурсивной обработки;
- failure – число ошибок, кроме nxrrset и nxdomain.
Общее число запросов к серверу равно success + referral + nxrrset + nxdomain + failure. Статистика может собираться отдельно по зонам и видам, в этом случае имена зоны и вида (опускается для вида default) приводятся в конце каждой строки.
Немного местной статистики (кеширующий сервер; большую часть нагрузки создают почтовые серверы из-за RBL ;): 4.4 запроса в секунду; средний размер пакета – 100 байт; устоявшийся размер процесса – 16 МБ; нагрузка на процессор – втрое меньше, чем squid, обслуживающий тот же контингент пользователей.
Запуск сервера
Рекомендуется создать специальную группу named и пользователя named для запуска сервера. Перед запуском необходимо отредактировать /etc/named.conf, файлы зон и установить соответствующие права доступа к ним и прочим файлам, имеющим отношение к серверу (простой пример). Если необходимо управление сервером с помощью программы rndc, то необходимо также отредактировать /etc/rndc.conf. Ключи запуска:
- -c имя-файла-настройки – (полное имя файла);
- -d уровень-отладки;
- -f – (не уходить в фоновый режим при запуске);
- -g – (не уходить в фоновый режим при запуске, вся отладочная печать на stderr);
- -p номер-обслуживаемого-порта
- -u идентификатор-пользователя – (сменить эффективный идентификатор пользователя с root на указанный как можно скорее после запуска).
После отладки процесс запуска можно автоматизировать.
rndc – управление DNS сервером BIND 9
В то время как управление работающим сервером BIND 4 осуществлялось простой посылкой сигнала процессу ( HUP перезагрузить файл настройки и зоны; TERM – остановить; INT – сбросить базу данных в файл named_dump.db; ABRT – записать статистику в конец файла named.stats), управление сервером BIND 9 производится с помощью специальной утилиты rndc, которая соединяется с сервером (по умолчанию TCP порт 953) и использует специальный протокол для передачи ему команд. Однако сигналы HUP , TERM пока действуют.
Настраивая сервер, необходимо обеспечить права доступа к управляющему порту (controls) и ключ (key), смотри ниже rndc-confgen.
Файл настройки rndc (/etc/rndc.conf) имеет такой же синтаксис, что и named.conf. Комментарии могут записываться в стиле C, C++ или sh. Файл настройки состоит из утверждений, завершающихся точкой с запятой. Утверждения содержат блок предложений, заключенный в фигурные скобки. Предложение в блоке также завершается точкой с запятой. Права на чтение этого файла должны быть только у того, кто имеет право запускать rndc. Предусматриваются следующие типы утверждений:
Утилита rndc-confgen позволяет сгенерировать /etc/rndc.conf со случайным ключом (и закоментированные предложения controls и key для /etc/named.conf). Следующими ключами можно модифицировать получаемый файл:
- -b размер-ключа – (по умолчанию – 128; от 1 до 512);
- -k имя-ключа – (по умолчанию – rndc-key);
- -p номер-управляющего-порта – (по умолчанию – 953);
- -s имя-или-адрес-сервера – (по умолчанию – 127.0.0.1).
Утилита rndc позволяет менять параметры соединения с сервером с помощью ключей:
Если запустить rndc без указания команды, то она выдаст список поддерживаемых команд:
- reload – (перезагрузить файл настройки и зоны);
- reload зона [класс [вид]] – (перезагрузить зону);
- refresh зона [класс [вид]] – (запланировать немедленное обновление зоны);
- reconfig – (перезагрузить файл настройки и новые зоны);
- stats – (записать статистику в конец файла named.stats);
- querylog – (включить/выключить журнализацию запросов);
- dumpdb – (сбросить базу данных в файл named_dump.db);
- stop – (сохранить изменения в файлы зон и остановить сервер);
- halt – (остановить сервер без сохранения изменений);
- trace – (увеличить уровень отладки на 1);
- trace уровень – (установить уровень отладки);
- notrace – (отключить отладку);
- flush – (сбросить весь кеш);
- flush вид – (сбросить кеш для указанного вида);
- status – (показать состояние сервера);
- restart – (перезапустить сервер; не реализовано).
Автоматизация запуска сервера
Автоматизация запуска производится через стандартный в Linux механизм /etc/rc.d/. Кстати, можно позаимствовать скрипты из какого-нибудь дистрибутива. Для работы этих скриптов необходимо предварительно настроить сервер, включая управление через rndc, и создать пользователя и группу named.
Создается файл /etc/rc.d/init.d/named следующего вида (реальный файл из дистрибутива будет содержать множество проверок):
Не забудьте дать ему права на исполнение:
Включение его при загрузке и пробный запуск:
Проверяем, запустился ли:
Неуполномоченный сервер
Простейшим случаем является настройка сервера DNS , который не является уполномоченным ни для какой зоны, а только обслуживает локальных клиентов. Предполагается, что новый DNS сервер создается внутри уже существующей инфраструктуры, т.е. проблемы с определением канонического доменного имени сервера, почтового адреса администратора и обратной зоны решены кем-то до нас.
1. Создаем пользователя и группу named (25):
2. Добавляем в группу named тех, кто имеет право запускать rndc.
3. Создаем директорию /etc/named:
4. Кладем туда корневую зону (named.root)
5. Создаем локальную зону в файле loopback (127.0.0.1 тоже кто-то должен обрабатывать; почему localhost., а не доменное имя?):
6. Задаем права доступа к файлам в директории /etc/named
7. Редактируем файл настройки /etc/named.conf (часть опций понадобятся для дальнейшего расширения функций сервера):
8. Проверяем синтаксис файла настройки: named-checkconf
9. Запускаем rndc-confgen и результат записываем в /etc/rndc.conf:
10. Текст, выданный rndc-confgen как комментарий, добавляем к /etc/named.conf:
11. Устанавливаем права доступа:
11. Открываем локальный сетевой экран.
12. Тестовый запуск: named -u named
13. Заглядываем в журнал syslog, чтобы убедиться что все хорошо.
14. Попробуем найти локальный адрес:
15. Запускаем shell на соседнем хосте и пробуем найти локальный адрес оттуда:
16. Пробуем найти внешний адрес с соседнего хоста:
17. Обеспечиваем автоматический запуск сервера через /etc/rc.d
18. Настраиваем клиентов DNS в локальной сети.
19. Открываем внешние сетевые экраны.
20. Обеспечиваем выдачу адреса DNS сервера PPP -клиентам (у меня это делается через tacacs и извещаем остальных.
Первичный уполномоченный сервер для домена (primary, master)
Данный сервер в дополнение к обслуживанию своих клиентов будет первичным сервером для зоны company.ru. и отвечать на внешние запросы для данной зоны. Предполагается, что новый DNS сервер по-прежнему создается внутри уже существующей инфраструктуры, т.е. проблемы с определением почтового адреса администратора, почтовых серверов и обратной зоны решены кем-то до нас.
Договариваемся с кем-либо о вторичном уполномоченном сервере для нашей зоны. Не рекомендуется иметь только один уполномоченный сервер для зоны. Многие регистраторы просто не делегируют вам зону, пока не убедятся в наличии для нее двух работоспособных DNS серверов в различных сетях. В принципе, если есть второй канал выхода в интернет и возможность установить второй DNS сервер (на отдельном компьютере), то можно обойтись своими ресурсами. В этом случае, необходимо одновременно установить вторичный уполномоченный сервер.
1. Создаем простейший файл зоны /etc/named/company.ru.master (права доступа к файлу – named:named 640):
2. Как видно, имя домена в файле зоны не присутствует. Это очень удобно, если необходимо обеспечить обслуживание сотни виртуальных доменов – файлы зон для них будут просто одинаковыми.
3. Добавляем в файл настройки /etc/named.conf информацию о вторичном сервере, если его возможности отличаются от описанных нами ранее в глобальных опциях, например:
4. Добавляем в файл настройки /etc/named.conf описание зоны:
5. Открываем внешние сетевые экраны для доступа к портам 53 ( UDP и TCP ).
6. Перезапускаем DNS сервер:
7. Заглядываем в журнал syslog, чтобы убедиться что все хорошо.
8. Связываемся с администратором вторичного сервера, чтобы убедиться, что у него тоже все в порядке.
9. Обращаемся к регистратору за делегированием зоны (или изменяем информацию о серверах DNS для домена, если мы его переносили).
10. Регистратору может потребоваться некоторое время, чтобы проверить правильность работы указанных для домена серверов, после чего он делегирует домен и посылает извещение по e-mail.
11. Выждав некоторое время (необходимо для обновления БД регистратора и ее синхронизации с данными о зоне верхнего уровня), проверяем доступность информации о нашем домене снаружи:
Вторичный уполномоченный сервер для домена (secondary, slave)
Данный сервер в дополнение к обслуживанию своих клиентов будет вторичным сервером для обратной зоны 195.161.72.0 и отвечать на внешние запросы для данной зоны. Настройка первичного сервера описана выше.
1. Добавляем в файл настройки /etc/named.conf информацию о первичном сервере, если его возможности отличаются от описанных нами ранее в глобальных опциях, например:
2. Добавляем в файл настройки /etc/named.conf описание зоны:
3. Открываем внешние сетевые экраны для доступа к портам 53 ( UDP и TCP ).
4. Перезапускаем DNS сервер.
5. Заглядываем в журнал syslog, чтобы убедиться что все хорошо.
6. Просматриваем появившийся файл “72.161.195.in-addr.arpa.slave”
7. Обращаемся к своему LIR для того, чтобы он внес изменения в БД RIR (в большинстве случаев это будет БД RIPE ) и делегировал подзону в 161.195.in-addr.arpa.
8. Выждав некоторое время, проверяем, что наш новый вторичный сервер появился в списке уполномоченных серверов.
9. Так как мы устанавливали вторичный сервер, то для проверки работоспособности именно его нам потребуется “взгляд со стороны” (т.е. выполнять проверку необходимо с хоста, который не находится в нашем списке обслуживания рекурсивных запросов).
Поддомены без делегирования зоны
Добавить поддомен без делегирования прав его администрирования (т.е. без создания новой зоны) очень просто. Для этого в наш файл, описывающий зону, company.ru.master необходимо добавить следующие строки и перезапустить сервер (rndc reload; не забудьте предварительно увеличить серийный номер в SOA !):
При необходимости создать много одинаковых поддоменов (отдельный виртуальный www-сайт для каждого отдела) можно сделать общий include-файл с именем standard-www-server.include
Теперь при необходимости создать поддомен для сайта очередного отдела достаточно добавить одну строку в наш файл, описывающий зону, company.ru.master и перезапустить сервер (rndc reload; не забудьте предварительно увеличить серийный номер в SOA !):
Создание поддоменов с делегированием зоны
Предварительно необходимо настроить первичный и вторичные серверы, обслуживающие делегируемый поддомен, и убедиться, что они работают правильно. Вторичный и даже первичный сервер поддомена может совпадать с сервером базового домена.
Теперь в наш файл company.ru.master, описывающий базовую зону, добавляем строки, задающие первичный и вторичный серверы поддомена (здесь нет разницы между первичным и вторичным сервером):
Для каждого канонического имени сервера, лежащего внутри делегируемого поддомена, необходимо явно задать его адрес для того, чтобы избежать проблемы “курицы и яйца” (чтобы обратиться к серверу поддомена необходимо знать его адрес, а чтобы узнать его адрес необходимо обратиться к серверу домена и т.д.). Информация об адресе узла поддомена не принадлежит базовой зоне и называется связующими записями (glue records):
Следует избегать лишних связующих записей (находящихся вне базовой зоны). В лучшем случае они будут проигнорированы. Необходимо следить за актуальностью связующих записей, иначе поддомен станет невидимым для внешнего мира.
Делегирование обратной зоны не по границе октета
При выделении небольшой подсети в ведение системного администратора филиала возникает задача делегирования ему прав администрирования небольшой части обратной зоны. Структура доменных имен обратной зоны не позволяет делегировать подзону из, например, 16 адресов так же легко и естественно, как в случае прямой зоны.
Первое решение. Не делегировать подзону и вести общую обратную зону самостоятельно.
Второе решение. На каждый IP адрес в своей зоне добавить NS запись (или несколько записей, если подзона будет иметь несколько уполномоченных серверов):
Директива $GENERATE позволяет уменьшить объем записей до
Файл /etc/named.conf сервера филиала должен иметь описание для каждой зоны вида:
При этом в каждом файле зоны 128.72.161.195.in-addr.arpa.master и остальных должна быть описана подзона для одного единственного адреса:
Третье решение ( RFC 2317, BCP 20). На каждый IP адрес в своей зоне добавить CNAME запись, указывающую на соответствующий адрес во вспомогательном домене и NS запись (или несколько записей) для вспомогательного домена:
Директива $GENERATE позволяет уменьшить объем записей до
Файл /etc/named.conf сервера филиала должен иметь описание зоны вида:
Файл зоны 128-143.72.161.195.in-addr.arpa.master при этом должен содержать записи PTR для соответствующего интервала адресов:
DNS в изолированной сети интернет
Если необходимо обеспечить работу DNS в сети интернет, изолированной от Интернет, то надо создать файл named.own.root, описывающий “нашу” корневую зону на “основном” DNS сервере:
В /etc/named.conf необходимо заменить описание зоны корневых указателей (утверждение zone типа hint) на следующее:
На остальных DNS серверах локальной сети необходимо заменить файл named.root следующим содержимым:
Можно даже использовать файл named_dump.db, предусмотрительно созданный ранее с помощью rndc dumpdb, в качестве корневой зоны при временной потере доступа ко всем корневым серверам (например, в результате атаки хакеров на них или при падении основного канала связи, используемого для DNS запросов).
Использование TSIG (transaction signatures)
Для защиты от искажений и подделок ответов сервера, передачи зоны и обновлений зоны (update) поддерживается использование расширения TSIG протокола DNS . Для защиты обмена между каждой парой участников необходимо создать отдельный общий ключ. Имя ключа имеет синтаксис доменного имени. Секретное значение ключа записывается в кодировке Base64. Можно придумать его самостоятельно, но рекомендуется использовать случайную 128-битную последовательность, создаваемую утилитой dnssec-keygen:
В результате работы утилиты в текущей директории создаются файлы, содержащие публичный (файл с суффиксом .key) и частный (файл с суффиксом .private) ключи. Имена файлов образуются из основы (печатается утилитой на stdout) и соответствующего суффикса. Для такого симметричного алгоритма как HMAC -MD5 оба файла содержат эквивалентные значения ключа в различных форматах: последнее поле в файле .key и строка с заголовком “Key:“ в файле .private.
Имя и значение ключа используется в утверждении
key файла настройки bind для описания ключа.
Если при описании удалённого сервера в утверждении server использовать предложение keys, то наш сервер будет подписывать указанным ключом все направляемые данному серверу обычные запросы и запросы на передачу зоны, а также проверять, что ответ подписан (не обязательно тем же самым ключом).
Предложение allow-transfer утверждения zone с использованием ключа в ACL позволяет ограничивать передачу зоны только теми клиентами, кто использовал соответствующий ключ для подписи запроса.
Предложения allow-update и update-policy позволяют ограничить динамические обновления.
Содержимое файлов и их производных следует хранить в секрете от посторонних лиц (права доступа, передача по SSH ). Не забудьте о синхронизации времени, по умолчанию подпись действительна в течении 300 секунд.
Динамические изменения зоны
Расширение протокола DNS динамические изменения зоны) позволяет клиентам отправлять запросы на изменение записей о ресурсах (RR) первичному уполномоченному серверу непосредственно или с помощью вторичного уполномоченного сервера (предложение allow-update-forwarding в утверждении options или zone). Авторы не рекомендуют использовать передачу изменений через вторичные сервера. Серийный номер в SOA увеличивается BIND 9.2.3 при каждом изменении.
Нельзя редактировать файл зоны вручную одновременно с использованием механизма динамических изменений. Динамические изменения записывается в отдельный журнал для каждой зоны (имя файла – имя зоны с добавлением суффикса .jnl). Журнал сливается с файлом зоны через какой-то промежуток времени или при достижении максимального размера, задаваемого предложением max-journal-size в утверждении options или zone.
Сервер может проверять право клиента на изменение зоны по его IP адресу (не рекомендуется) или при помощи механизма TSIG – см. описание предложений allow-update и update-policy утверждения zone.
Утилита nsupdate позволяет сформировать пакет изменений и отослать его первичному уполномоченному серверу (имя сервера извлекается из SOA зоны). Пакет формируется на основе команд читаемых с stdin или из файла (имя файла задаётся в качестве параметра):
- ; … – (комментарий);
- server имя-сервера [порт];
- local IP-адрес [порт];
- zone имя-зоны;
- key имя-ключа значение-ключа – ( TSIG );
- send – (послать сформированный пакет серверу);
- пустая строка – (послать сформированный пакет серверу);
- show – (показать текущий пакет);
- prereq yxrrset доменное-имя [класс] тип-записи значение-записи-ресурса – (предварительное условие – указанное доменное имя имеет записи ресурсов указанного типа с заданными значениями);
- prereq yxrrset доменное-имя [класс] тип-записи – (предварительное условие – указанное доменное имя имеет хотя бы одну запись ресурсов указанного типа);
- prereq nxrrset доменное-имя [класс] тип-записи – (предварительное условие – указанное доменное имя не имеет ни одной записи ресурса указанного типа);
- prereq yxdomain доменное-имя – (предварительное условие – указанное доменное имя имеет хотя бы одну запись ресурса);
- prereq nxdomain доменное-имя – (предварительное условие – указанное доменное имя не имеет ни одной записи ресурса);
- update delete доменное-имя [класс] тип-записи значение-записи-ресурса – (удалить запись ресурса с заданным значением из RRset указанного типа для данного доменного имени);
- update delete доменное-имя [класс] тип-записи – (удалить набор записей ресурса указанного типа для данного доменного имени);
- update delete доменное-имя – (удалить все наборы ресурсов, относящиеся к указанному доменному имени);
- update add доменное-имя TTL [класс] тип-записи значение-записи-ресурса – (добавить запись ресурса).
- -v – (использовать TCP вместо UDP , рекомендуется);
- -d – (отладочная трассировка);
- -y имя-ключа:значение-ключа – (ключ TSIG для подписи сообщений; не рекомендую – может быть прочитан командой ps и т.п.);
- -k имя-файла .private – (ключ TSIG для подписи сообщений извлекается из файла .private, созданного утилитой dnssec-keygen).