Настойка DNS сервера BIND 9

Bog BOS: DNS сервер BIND

Требуется предварительное знакомство с материалом по архитектуре DNS.

BIND является самой распространенной реализацией сервера DNS. Разработка ведется Internet Software Consortium (ISC). Текущие версии (на 28 марта 2007) — BIND 9.4.0, BIND 9.3.4 (FC6 — 9.3.2/9.3.4), BIND 9.2.8 (поддержка до 1 августа 2007, RHEL4 — 9.2.4), BIND 8.4.7, BIND 4.9.11. Лицензия собственная, позволяет использовать продукт бесплатно или за плату (контракт на поддержку).

В комплекте с сервером 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/28), либо имя 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 имя-каталога; (абсолютное имя каталога, в котором лежат публичные и частные ключи для безопасного изменения зон; отдельный каталог может потребоваться для увеличения безопасности)
named-xfer имя-файла; (устарело)
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_or_no; (no; собирать статистику отдельно для каждой «своей» зоны)
auth-nxdomain yes_or_no; (no; всегда устанавливать бит AA в ответах NXDOMAIN, даже если сервер не является уполномоченным для данного домена; может потребоваться для совместимости)
deallocate-on-exit yes_or_no; (устарело)
dialup dialup_option; (позволяет уменьшить число дозвонов, если сервер находится на клиентском конце dialup-on-demand линии)
fake-iquery yes_or_no; (устарело)
fetch-glue yes_or_no; (устарело)
has-old-clients yes_or_no; (устарело; используйте auth-nxdomain yes и rfc2308-type1 no)
host-statistics yes_or_no; (не реализовано)
minimal-responses yes_or_no; (no; заполнять дополнительные секции в ответах только при крайней необходимости — отрицательный результат, делегирование; уменьшает нагрузку на сервер)
multiple-cnames yes_or_no; (устарело; позволял использовать множественные CNAME в нарушение стандарта)
notify yes_or_no_or_explicit; (yes; посылать DNS NOTIFY при изменении зоны, для которой сервер уполномочен, серверам из NS и also-notify; explicit — посылать только серверам из списка also-notify)
recursion yes_or_no; (yes; обслуживать рекурсивные запросы)
rfc2308-type1 yes_or_no; (не реализовано)
use-id-pool yes_or_no; (устарело)
maintain-ixfr-base yes_or_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_addr [port 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 в секунду со стороны нашего сервера как вторичного уполномоченного сервера к соответствующим первичным серверам для определения необходимости приема зоны)
serial-queries number; (устарело)
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-ixfr-log-size number; (устарело)
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; (не реализовано)
use-ixfr yes_or_no; (устарело)
provide-ixfr yes_or_no; (yes; отвечает как первичный сервер на запросы на передачу обновленной зоны в формате изменений — IXFR; данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server)
request-ixfr yes_or_no; (yes; запрашивает как вторичный сервер передачу обновлений зоны в формате изменений — IXFR; если удаленный сервер не поддерживает IXFR, то автоматически происходит откат к протоколу AXFR, данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server)
ixfr-from-differences yes_or_no; (no; вычисление и запись в журнал разницы между старым и новым содержимым зоны для последующей передачи ее в формате IXFR)
treat-cr-as-space yes_or_no; (устарело; NL и CRLF обрабатываются всегда)
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_or_no; (yes; можно отключать только при отключении обслуживания рекурсивных запросов; заполнять дополнительную секцию ответа, если эта информация есть в «своих» зонах)
additional-from-cache yes_or_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_or_no; (для IPv6)
root-delegation-only [exclude { «имя»; … } ]; (корневые зоны и зоны первого уровня, кроме списка исключений («DE», «LV», «US», «MUSEUM»), должны только делегировать подзоны)
Утверждение server может использоваться на верхнем уровне файла настройки или быть вложено в утверждение view. Если утверждение view содержит хотя бы одно утвержение server, то для данного вида используются только они (глобальные утверждения server игнорируются), иначе глобальные утверждения server действуют и на данный вид. Утвержение server может содержать следующие предложения:

bogus yes_or_no; (no; не отправлять запросы данному серверу)
provide-ixfr yes_or_no; (позволяет изменить значение опции, заданной глобально или для данного вида)
request-ixfr yes_or_no; (позволяет изменить значение опции, заданной глобально или для данного вида)
edns yes_or_no; (yes; пытаться ли использовать EDNS; ?)
transfers число; (позволяет изменить значение опции transfers-per-ns, заданной глобально)
transfer-format ( one-answer | many-answers ) ; (позволяет изменить значение опции, заданной глобально)
keys { string; … } ; (задает идентификатор ключа для подписи сообщения TSIG для данного сервера; ответ не обязан быть подписан этим ключом; реализован только один ключ на сервер)
Утверждение zone устанавливает опции, специфические для указанной зоны. Формат утверждения следующий:

zone имя-зоны [ класс ] {
type тип-зоны;
[ опция; … ]
};
Имя зоны — это доменное имя корневого узла зоны. Тип зоны определяет роль, которую сервер будет исполнять для этой зоны:

master — сервер является первичным уполномоченным сервером для данной зоны, т.е. загружает содержимое зоны из файла зоны, указанного опцией file
slave — сервер является вторичным уполномоченным сервером для данной зоны; содержимое зоны считывается от одного из серверов, указанных в опции masters; указание имени файла в опции file позволяет сохранять резервную копию зоны в файле
hint — позволяет задать с помощью опции file имя файла, содержащего описание корневой зоны; этот файл можно взять в Internic; сервер при загрузке обращается к одному из корневых серверов, перечисленных в этом файле, для получения текущего списка корневых серверов; полученный список используется в течении указанного TTL; для класса IN имеется встроенный список предполагаемых корневых серверов
stub — использовался в предыдущих версиях BIND для упрощения настройки; использовать не рекомендуется
forward — позволяет задавать список серверов, к которым будут перенаправляться запросы, не имеющие ответа в кеше, отдельно для данной зоны (см. предложения forward и forwarders в утверждении options)
delegation-only — эта зона может содержать только записи о делегировании подзон
Опции зоны (большинство опций позволяют заменить глобальные значения, заданные в утверждении options или взятые по умолчанию; они имеют тот же самый синтаксис и семантику):

masters [port ip_port] { ip_addr [port ip_port] [key ключ]; […] }; (адреса и номера портов серверов, с которых брать содержимое зоны; порт 53 по умолчанию; номер порта перед списком задает общий номер порта для всех серверов; если указано несколько серверов, то они опрашиваются все, а зона запрашивается с того из них, у кого она имеет наибольший серийный номер; указание ключа позволяет проверять правильность передачи с помощью цифровой подписи TSIG)
file «имя-файла»; (имя файла, в котором хранится содержимое зоны)
allow-update { список-шаблонов-адресов }; (none; каким хостам разрешено посылать динамические изменения зоны первичному серверу; права доступа на основе IP адресов опасны! используйте только списки шаблонов на основе ключей)
update-policy { update_policy_rule […] } ; (позволяет задать правила доступа на изменение отдельных записей при динамическом изменении зоны на основе авторства (identity) сообщений; имя автора извлекается из подписи TSIG или SIG(0); применим только для первичного сервера; несовместим с allow-update; правила рассматриваются по очереди до первого совпадения автора, имени и типа; каждое правило состоит из ключевого слова grant или deny, имени автора, способа сравнения имен, полного доменного имени и списка типов (м.б. опущен); в качестве автора можно указывать имя ключа, используемого для создания TSIG или SIG(0) или разделяемого секрета TKEY, а также шаблон (?); опущенный список типов соответствует любому типу, кроме SIG, NS, SOA и NXT; тип ANY соответствует любому типу, кроме NXT); допустимы следующие способы сравнения:
name (посимвольное сравнение)
subdomain (изменяемое имя должно быть поддоменом или совпадать с указанным в правиле)
wildcard (?)
self (изменяемое имя должно соответствовать имени автора, имеет смысл если для каждого изменяемого доменного имени создается ключ с таким же именем, а в качестве имени автора указывается шаблон *)
database «string»; (тип БД для хранения содержимого зоны во время работы; по умолчанию — «rbt»; другие типы БД необходимо явно указывать при сборке)
delegation-only yes_or_no (эта зона может содержать только записи о делегировании подзон; только для зон типа stub или hint)
allow-notify — описание см. в утверждении options
allow-query — описание см. в утверждении options
allow-transfer — описание см. в утверждении options
allow-update-forwarding — описание см. в утверждении options
also-notify — описание см. в утверждении options
check-names (warn|fail|ignore); (не реализовано)
dialup — описание см. в утверждении options
forward — описание см. в утверждении options
forwarders — описание см. в утверждении options, только для зоны типа forward
ixfr-base — устарело
ixfr-tmp-file — устарело
max-ixfr-log-size — устарело
max-transfer-idle-in — описание см. в утверждении options
max-transfer-idle-out — описание см. в утверждении options
max-transfer-time-in — описание см. в утверждении options
max-transfer-time-out — описание см. в утверждении options
notify — описание см. в утверждении options
pubkey number number number string ; (не реализовано)
transfer-source — описание см. в утверждении options
transfer-source-v6 — описание см. в утверждении options
notify-source — описание см. в утверждении options
notify-source-v6 — описание см. в утверждении options
zone-statistics — описание см. в утверждении options
sig-validity-interval — описание см. в утверждении options
min-refresh-time — описание см. в утверждении options
max-refresh-time — описание см. в утверждении options
min-retry-time — описание см. в утверждении options
max-retry-time — описание см. в утверждении options
ixfr-from-differences — описание см. в утверждении options
key-directory — описание см. в утверждении options

Запись опубликована в рубрике Linux, Networking. Добавьте в закладки постоянную ссылку.