Блог ИТ склеротика. HOWTO DNS сервер BIND (практика)

Страницы

Расширенный поиск в статьях блога

22 февраля 2012 г.

HOWTO DNS сервер BIND (практика)

 
В текущей статье хочу рассмотреть практический пример установки и настройки разных конфигураций сервера BIND. В статье я опишу настройку DNS-кэша и полноценногоDNS master сервера. Начну описание с общих понятий и необходимых шагов для организации любого DNS сервера.

Общие сведения

демон named DNS сервера BINDNamed - это демон, входящий в состав пакета bind9 и являющийся сервером доменных имен. Демон named может реализовывать функции серверов любого типа: master, slave, cache. На приведенной схеме я постарался максимально прозрачно отобразить основной принцип работы DNS сервера BIND. Бинарник, который выполняет основную работу, расположен в/usr/sbin/named. Он берет настройки из основного конфигурационного файла, который называется named.conf и расположен в каталоге /etc/bind. В основном конфиге описывается рабочий каталог асервера, зачастую это каталог /var/cache/bind, в котором лежат файлы описания зон и другие служебные файлы. Соответствие названия зоны и файла описания зонызадает раздел zone с параметром file. Раздел zone так же задает тип ответственности данного сервера за зону (master, slave и др.), а так же определяет особые параметры для текущей зоны (например, на каком интерфейсе обрабатывать запросы для текущей зоны). В файлах описания зон содержатся параметры зон и записи ресурсов (пути, указанные в данном абзаце могут отличаться, это зависит от дистрибутива Linux или параметровсборки сервера из исходников).
Эта общая схема работы, которая поможет в дальнейшем не запутаться, при рассмотрении конкретных конфигураций.
Формат файла конфигурации для 4-ой версии программы отличается от того, который применяется в восьмой и девятой версиях BIND. Учитывая, что я рассчитываю на установку нового DNS сервера, а старую версию смысла ставить не вижу, посему буду рассматривать конфиг новой версии.

Исходные данные

Для корректной работы DNS нем необходимо иметь настроенную сеть. DNS в текущей статье будет настроен на дистрибутиве Debian, особенности других дистрибутивов тоже будут отмечены. Конфиг сети стенда следующий:
dns:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.0.0.152
netmask 255.255.255.0
gateway 10.0.0.254

auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0

где 10.0.0.152/24 - внешний интерфейс (подсеть, выделенная провайдером), 192.168.1.1/24 - внутренний (Локальная сеть). Настраиваемая зона будет иметь имя example.com. В примере со slave сервером, вторичный сервер будет расположен на IP10.0.0.191.

Установка BIND9


 
Для работы DNS сервера необходимо установить пакет bind9 (в некоторых дистрибутивах -bind). Как отмечено на схеме - основным конфигурационным файлом BIND является файл named.conf (данный файл может быть размещен в каталоге /etc, иногда в /etc/bind ).


Параметры (синтаксис) named.conf


Синтаксис файла named.conf придерживается следующих правил:
 
IP-адреса - список IP должен быть разделен символом ";" , возможно указывать подсеть в формате 192.168.1.1/24 или 192.168.1.1/255.255.255.0, (для исключения IP перед ним нужно поставить знак !), возможно указывать имена "any", "none", "localhost" в двойных кавычках.
 
Комментарии - строки начинающиеся на #, // и заключенные в /* и */ считаются комментариями.
 
В файлах описания зон - символ @ является "переменной" хранящей имя зоны, указанной в конфигурационном файле named.confили в директиве @ORIGIN текущего описания зоны.
 
Каждая завершенная строка параметров должна завершаться символом ; .

Раздел Acl


Acl (access control list) - позволяет задать именованный список сетей. Формат раздела: acl "имя_сети" {ip; ip; ip; };

Раздел Options


Раздел Options задает глобальные параметры конфигурационного файла, управляющие всеми зонами. Данный раздел имеет формат:options {операторы_раздела_Options};. Options может быть "вложен" в раздел Zone, при этом он переопределяет глобальные параметры. Часто используемые операторы options:


  • allow-query {список_ip} - Разрешает ответы на запросы только из список_ip. При отсутствии - сервер отвечает на все запросы.
  • allow-recursion {список_ip} - На запросы из список_ip будут выполняться рекурсивные запросы. Для остальных - итеративные. Если не задан параметр, то сервер выполняет рекурсивные запросы для всех сетей.
  • allow-transfer {список_ip} - Указывает список серверов, которым разрешено брать зону с сервера (в основном тут указывают slave сервера)
  • directory /path/to/work/dir - указывает абсолютный путь к рабочему каталогу сервера. Этот оператор допустим только в разделе options.
  • forwarders {ip порт, ip порт...} - указывает адреса хостов и если нужно порты, куда переадресовывать запросы (обычно тут указываются DNS провайдеров ISP).
  • forward ONLY или forward FIRST - параметр first указывает, DNS-серверу пытаться разрешать имена с помощью DNS-серверов, указанных в параметре forwarders, и лишь в случае, если разрешить имя с помощью данных серверов не удалось, то будет осуществлять попытки разрешения имени самостоятельно.
  • notify YES|NO - YES - уведомлять slave сервера об изменениях в зоне, NO - не уведомлять.
  • recursion YES|NO - YES - выполнять рекурсивные запросы, если просит клиент, NO - не выполнять (только итеративные запросы). Если ответ найден в кэше, то возвращается из кэша. (может использоваться только в разделе Options)

Раздел Zone


Определяет описание зон(ы). Формат раздела: zone {операторы_раздела_zone}; Операторы, которые наиболее часто используются:


  • allow-update {список_ip} - указывает системы, которым разрешено динамически обновлять данную зону.
  • file "имя_файла" - указывает путь файла параметров зоны (должен быть расположен в каталоге, определенном в разделе options оператором directory)
  • masters {список_ip} -указывает список мастер-серверов. (допустим только в подчиненных зонах)
  • type "тип_зоны" - указывает тип зоны, описываемой в текущем разделе,тип_зоны может принимать следующие значения:

    • forward - указывает зону переадресации, которая переадресовывает запросы, пришедшие в эту зону.
    • hint - указывает вспомогательную зону (данный тип содержит информацию о корневых серверах, к которым сервер будет обращаться в случае невозможности найти ответ в кэше)
    • master - указывает работать в качестве мастер сервера для текущей зоны.
    • slave - указывает работать в качестве подчиненного сервера для текущей зоны.

Дополнительные параметры конфигурации


Значения времени в файлах зон по умолчанию указывается в секундах, если за ними не стоит одна из следующих букв: S - секунды, M - минуты, H- часы, D - дни, W - недели. Соответственно, запись 2h20m5s будет иметь значение 2 часа 20 минут 5 секунд и соответствовать 8405 секунд.
 
Любое имя хоста/записи, не оканчивающиеся точкой считается неFQDN именем и будет дополнено именем текущей зоны. Например, запись domen в файле зоны examle.com будет развернуто в FQDN-имя domen.examle.com. .
 
В конфигурационных файлах BIND могут применяться следующие директивы:


  • $TTL - определяет TTL по-умолчанию для всех записей в текущей зоне.
  • $ORIGIN - изменяет имя зоны с указанного в файле named.conf. При этом, область действия данной директивы не распространяется "выше" (то есть если файл включен директивой $INCLUDE, то область действия$ORIGN не распространяется на родительский)
  • $INCLUDE - включает указанный файл как часть файла зоны.

Для того чтобы локальный резолвер сервера тоже использовал локальный DNS, необходимо привести файл resolv.conf к следующему виду:
dns:~# cat /etc/resolv.conf
nameserver 127.0.0.1

Если в имени ресурсной записи встречается символ "*", то это он означает что вместо него можно подразумевать любую разрешенную последовательность символов. Такую запись называют "wildcard запись". Однако, символ "*" не может быть использован где угодно. Это может быть только первый символ в поле Name текущего домена, отделенный от остальных символом "."
 
 

Настройка кэширующего DNS сервера


После установки bind, он полностью готов работать как кэширующий DNS сервер без дополнительной настройки. Единственный недостаток - он обрабатывает запросы на всех интерфейсах, что нам абсолютно не нужно, поэтому мы немного подредактируем настройки сервера.
 
Для того, чтобы BIND работал в качестве кэширующего сервера, необходимо иметь конфигурационные файлы заполненные необходимой информацией:


  • named.conf;
  • описание серверов корневой зоны (зона типа hint);
  • описание зоны 127.in-addr.arpa.
dns:~# cat /etc/bind/named.conf
acl "lan" {
192.168.1.1/24;
127.0.0.1;
};

options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
/*
* Тут сказано, что если используется фаерволл, то необходимо
* нашему серверу создать соответствующие правила
* то есть открыть доступ по 53 TCP и UDP порту
*/

forward first; // задаем пересылку только первого запроса

forwarders { // указываем DNS сервера для пересылки
83.239.0.202; // предоставленные провайдером
213.132.67.110; // ибо до них ближе чем до корневых
};

listen-on { lan; }; // пусть слушает только нужные интерфейсы
allow-query { lan; }; // разрешить запросы только из локальной сети
allow-recursion { lan; }; // рекурсивные запросы тоже только из локальной
allow-transfer { none; }; // трансфер зон нам не нужен

version "unknown"; // не отображать версию DNS сервера при ответах

auth-nxdomain no; # для совместимости RFC1035
listen-on-v6 { none; }; //IPv6 нам не нужен
};

// описание настроек корневых серверов
zone "." {
type hint;
file "db.root";
};

// нижеописанные зоны определяют сервер авторитетным для петлевых
// интерфейсов, а так же для броадкаст-зон (согласно RFC 1912)

zone "localhost" {
type master;
file "localhost";
};

zone "127.in-addr.arpa" {
type master;
file "127.in-addr.arpa";
};

zone "0.in-addr.arpa" {
type master;
file "0.in-addr.arpa";
};

zone "255.in-addr.arpa" {
type master;
file "255.in-addr.arpa";
};

В данном примере приведен кэширующий DNS сервер, обрабатывающий запросы из списка сетей lan, в которую входит только одна локальная сеть 192.168.1.1/24 и петлевой интерфейс. При необходимости можно включить туда и другие сети. После определения списка сетей в директиве acl, в любом месте конфига можно будет ссылаться на этот список по имени (в нашем примере имя - lan), что, собственно и сделано в разделе options. Большинство параметров я прокомментировал, но отдельного внимания требует раздел, описывающий зону корневых серверов. В параметре file задан относительный путь к файлу описания корневых серверов (путь, относительно рабочего каталога сервера). За обновлениями данного файла необходимо следить, хотя он обновляется довольно редко (откуда брать обновленный файл я писал в теории DNS). Как вы заметили, имеется так же две записи для зоны localhost и две записи обратных зон для бродкаст доменов. Назначение этих зон состоит в том, чтобы избежать трансляции случайных запросов имен соответствующих IP-адресов на серверы, обслуживающие корневую зону.
 
Чтобы не вносить неразбериху в куче конфигурационных файлов, в статье я привожу примеры на основе единого конфигурационного файла. На  самом деле, в последних версиях Debian (и других дистрибутивах Linux), файл named.conf выглядит следующим образом:
root@master:~# cat /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

То есть основной файл не содержит конфигураций, а включает в себя более узко специализированные файлы, которые отвечают за свои задачи, например named.conf.options - содержит глобальные параметры конфигурации,named.conf.default-zones - содержит описание localhost и broadcast зон, а named.conf.local содержит описания зон, за которые отвечает данный сервер.
 
 
 
Далее, хочу обратить внимание на наличие файлов зон в каталоге, указанном в разделе options в параметре directory с именами, соответствующими параметрам file в разделах, описывающих зоны:
dns:~# ls -l /var/cache/bind/
итого 24
-rw-r--r-- 1 root root 237 Май 28 01:28 0.in-addr.arpa
-rw-r--r-- 1 root root 271 Май 28 01:28 127.in-addr.arpa
-rw-r--r-- 1 root root 237 Май 28 01:28 255.in-addr.arpa
-rw-r--r-- 1 root root 2994 Май 28 01:28 db.root
-rw-r--r-- 1 root root 270 Май 28 01:28 localhost
dns:~# cat /var/cache/bind/127.in-addr.arpa
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
1.0.0 IN PTR localhost.

Рассматривать файлы "петлевых" и бродкастовых зон не вижу смысла, т.к. после установки пакета bind настройки заданные по умолчанию в данных файлах вполне приемлемы. Далее, при организации мастер сервера мы рассмотрим пример описания файла зоны. Хочу обратить внимание, что мы настраиваем кэширующий сервер, а определяем мы его и как master для некоторых из зон. В нашем случае "кэширующий" говорит о том, что наш сервер не поддерживает ни одну из реально существующих зон, т.е. ему не делегировано прав на такое обслуживание.
 
Да, чуть не забыл, демон named должен быть разрешен для запуска на необходимых уровнях выполнения ОС (команда в RedHat -/sbin/chkconfig dhcpd on, в Debian - /usr/sbin/update-rc.d dhcpd defaults). После изменения конфигурационных файлов можно добавить сервис в автозагрузку и запустить демон:
dns:~# update-rc.d bind9 defaults
Adding system startup for /etc/init.d/bind9 ...
/etc/rc0.d/K20bind9 -> ../init.d/bind9
/etc/rc1.d/K20bind9 -> ../init.d/bind9
/etc/rc6.d/K20bind9 -> ../init.d/bind9
/etc/rc2.d/S20bind9 -> ../init.d/bind9
/etc/rc3.d/S20bind9 -> ../init.d/bind9
/etc/rc4.d/S20bind9 -> ../init.d/bind9
/etc/rc5.d/S20bind9 -> ../init.d/bind9
dns:~# /etc/init.d/bind9 start
Starting domain name service...: bind9.

На этом настройка кэширующего DNS завершена. Все запросы, которые попадают в кэш DNS сервера он хранит в оперативной памяти компьютера и при перезапуске демона эти данные обнуляются. Для проверки работы кэша можно выполнить команду nslookup mail.ru example.com., если в ответе содержится строка Non-authoritative answer, то адрес пришел из кэша, а так же если выполнить dig www.ru. (или другой домен, которого еще нет в кэше) и через некоторое время повторить команду, то время ответа должно быть гораздо меньше.
 
Давайте рассмотрим другие варианты сервера.

Главный (master) сервер зоны


Основной конфиг содержит следующие настройки:
dns:~# cat /etc/bind/named.conf
acl "lan" {
192.168.1.1/24;
127.0.0.1;
};

options {
directory "/var/cache/bind";
allow-query { any; }; // отвечать на зпросы со всех интерфейсов
recursion no; // запретить рекурсивные запросы
auth-nxdomain no; // для совместимости RFC1035
listen-on-v6 { none; }; // IPv6 нам не нужен
version "unknown"; // не отображать версию DNS сервера при ответах

/*
* Раскомментируйте строки ниже, если
* хотите разрешить рекрусивные запросы
* из локальной сети.
* (так же, необходимо закомментировать
* recursion no; )
*/
# forwarders { // указываем DNS сервера для пересылки
# 83.239.0.202; // предоставленные провайдером
# 213.132.67.110; // ибо до них ближе чем до корневых
# };

# allow-recursion { lan; }; // рекурсивные запросы тоже только из локальной

};

// описание настроек корневых серверов
zone "." {
type hint;
file "db.root";
};

// нижеописанные зоны определяют сервер авторитетным для петлевых
// интерфейсов, а так же для броадкаст-зон (согласно RFC 1912)

zone "localhost" {
type master;
file "localhost";
};

zone "127.in-addr.arpa" {
type master;
file "127.in-addr.arpa";
};

zone "0.in-addr.arpa" {
type master;
file "0.in-addr.arpa";
};

zone "255.in-addr.arpa" {
type master;
file "255.in-addr.arpa";
};

// описание основной зоны
zone "example.com" {
type master;
file "example.com";
allow-transfer { 10.0.0.191; };
};

//описание обратных зон
zone "0.0.10.in-addr.arpa" {
type master;
file "0.0.10.in-addr.arpa";
allow-transfer { 10.0.0.191; };
};

zone "1.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa";
# allow-transfer { 10.0.0.191; }; // зона описывает локальную сеть поэтому ее не передаем
};

// настройки логирования
logging {
channel "misc" {
file "/var/log/bind/misc.log" versions 4 size 4m;
print-time yes;
print-severity yes;
print-category yes;
};

channel "query" {
file "/var/log/bind/query.log" versions 4 size 4m;
print-time yes;
print-severity no;
print-category no;
};

category default {
"misc";
};

category queries {
"query";
};
};

 
Давайте кратко разберем конфигурационный файл и настройки master сервера: мы настраиваем мастер сервер для зоны example.com. . Согласно конфига, наш BIND имеет рабочий каталог /var/cache/bind, сервер отвечает на запросы со всех интерфейсов (allow-query {any ;};), рекурсивные запросы обрабатывает как итеративные (recursion no), является мастер-сервером для зоны example.com и локальных служебных зон (type master). При этом, если необходимо разрешить кэширование (то есть рекурсивные запросы) для локальной сети, то необходимо раскомментировать параметры forwarders и allow-recursion и закомментировать recursion no;.

 
Так же, для примера, я привел возможности BIND логировать все происходящее при работе сервера (можно для этой цели использовать syslog). В разделе logging задаются 2 параметра channel (можно и больше двух - на ваше усмотрение), эти параметры дословно можно назвать "канал" записи. Каждый канал определяет имя канала и настройки параметров записи (что записывать, а что - нет и куда писать). Директива category задает какую категорию сообщений в какой канал отправлять. Исходя из этого, мы имеем: запись стандартной информации в канал misc, а приходящие запросы посылаются в канал query. При этом, если файлы журнала достигают 4Мб (size 4m), он переименовывается добавлением к имени .1 и начинается запись в новый журнал, числа в конце других журналов увеличиваются. Журналы с номером, более указанного в version (в нашем случае 4) удаляются (Управлять ротацией логов можно так же с помощью logrotate). Параметры print* определяют заносить ли в журнал время появления, важность икатегорию информации. Более подробно про настройки раздела logging можно почитать в man (5) named.conf.
 
Отдельно хочется описать параметр  allow-transfer { 10.0.0.191; };. Данный параметр описывает серверы, которым разрешено скачивать копию зоны - т.н. slave серверА. В следующем примере мы разберем настройку slave DNS.
 
Для корректной работы логирования необходимо создать соответствующий каталог и присвоить необходимые права:
dns:~# mkdir /var/log/bind/
dns:~# chmod 744 /var/log/bind/
dns:~# ps aux | grep named
bind 4298 0.0 3.4 46792 13272 ? Ssl Jul05 0:00 /usr/sbin/named -u bind
root 4815 0.0 0.1 3304 772 pts/4 S+ 18:19 0:00 grep named
dns:~# chown bind /var/log/bind/
dns:~# ls -ld /var/log/bind/
drwxr--r-- 2 bind root 4096 Июл 6 18:18 /var/log/bind/

Давайте далее рассмотрим наш файл описания зоны example.com.:
dns:~# cat /var/cache/bind/example.com
$TTL 3D
@ IN SOA ns.example.com. root.example.com. (
2011070601 ; serial
8H ; refresh
2H ; retry
2W ; expire
1D) ; minimum

@ IN NS ns.example.com.
@ IN NS ns2.example.com.
@ IN A 10.0.0.152
@ IN MX 5 mx.example.com.
ns IN A 10.0.0.152
ns2 IN A 10.0.0.191
mx IN A 10.0.0.152
www IN CNAME @

а так же в домене in-addr.arpa.
dns:~# cat /var/cache/bind/0.0.10.in-addr.arpa
$TTL 3600
@ IN SOA ns.examle.com. root.example.com. (
2007042001 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS ns.examle.com.
IN NS ns2.example.com.
152 IN PTR examle.com.
191 IN PTR ns.example.com.
* IN PTR examle.com.

dns:~# cat /var/cache/bind/1.168.192.in-addr.arpa
$TTL 3600
@ IN SOA ns.examle.com. root.example.com. (
2007042001 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS ns.examle.com.
IN NS ns2.example.com.
* IN PTR examle.com.

Наша сеть небольшая, предполагается, что в сети совсем мало машин. Все сервисы сети размещены на одном хосте example.com., поэтому и master DNS (ns.example.com.) и почтовый сервер (mx.example.com.) указывает на одну машину (10.0.0.152).

Вторичный (secondary, slave) авторитетный сервер зоны


Основная функция slave сервера - автоматическая синхронизация описания зоны с master сервером. Данная задача регламентируется документом RFC 1034 в разделе 4.3.5. Согласно данному документу обмен данными между серверами рекомендовано производить по протоколу TCP, посредством запроса AXFR. По этому запросу за одно TCP соединение должна передаваться вся зона целиком (RFC 1035).
 
Так же, slave DNS-сервер делит нагрузку с master сервером или принимает на себя всю нагрузку в случае аварии па первом сервере.
 
Прежде чем приступить к настройке slave DNS сервера, необходимо проверить возможность получения зоны вручную со вторичного сервера с помощью следующей команды:
root@debian:~# dig @10.0.0.152 example.com. axfr

; <<>> DiG 9.7.3 <<>> @10.0.0.152 example.com. axfr
; (1 server found)
;; global options: +cmd
example.com. 259200 IN SOA ns.example.com. root.example.com. 2011070801 28800 7200 1209600 86400
example.com. 259200 IN NS ns.example.com.
example.com. 259200 IN NS ns2.example.com.
example.com. 259200 IN A 10.0.0.152
example.com. 259200 IN MX 5 mx.example.com.
mx.example.com. 259200 IN A 10.0.0.152
ns.example.com. 259200 IN A 10.0.0.152
ns2.example.com. 259200 IN A 10.0.0.191
www.example.com. 259200 IN CNAME example.com.
example.com. 259200 IN SOA ns.example.com. root.example.com. 2011070801 28800 7200 1209600 86400
;; Query time: 14 msec
;; SERVER: 10.0.0.152#53(10.0.0.152)
;; WHEN: Fri Jul 8 15:33:54 2011
;; XFR size: 11 records (messages 1, bytes 258)

Получение зоны прошло успешно. Далее, для настройки подчиненного сервера, алгоритм следующий:


  1. Скопировать конфигурационный файл named.conf с master сервера;
  2. Заменить параметр type master на type slave в тех зонах, для которых он будет вторичным;
  3. Параметр  allow-transfer { 10.0.0.191; }; заменить на masters { 10.0.0.152;}; в тех зонах, для которых он будет вторичным;
  4. Удалить зоны, которые не будет обслуживать текущий сервер, в том числе и корневую, если slave не будет отвечать на рекурсивные запросы;
  5. Создать каталоги для логов, как в предыдущем примере.

Итого, мы получаем конфиг slave сервера:
root@debian:~# cat /etc/bind/named.conf
options {
directory "/var/cache/bind";
allow-query { any; }; // отвечать на запросы со всех интерфейсов
recursion no; // запретить рекурсивные запросы
auth-nxdomain no; // для совместимости RFC1035
listen-on-v6 { none; }; // IPv6 нам не нужен
version "unknown"; // не отображать версию DNS сервера при ответах
};

// нижеописанные зоны определяют сервер авторитетным для петлевых
// интерфейсов, а так же для броадкаст-зон (согласно RFC 1912)

zone "localhost" {
type master;
file "localhost";
};

zone "127.in-addr.arpa" {
type master;
file "127.in-addr.arpa";
};

zone "0.in-addr.arpa" {
type master;
file "0.in-addr.arpa";
};

zone "255.in-addr.arpa" {
type master;
file "255.in-addr.arpa";
};

// описание основной зоны
zone "example.com" {
type slave;
file "example.com";
masters { 10.0.0.152; };
};

//описание обратной зоны
zone "0.0.10.in-addr.arpa" {
type slave;
file "0.0.10.in-addr.arpa";
masters { 10.0.0.152; };
};

// настройки логирования
logging {
channel "misc" {
file "/var/log/bind/misc.log" versions 4 size 4m;
print-time YES;
print-severity YES;
print-category YES;
};

channel "query" {
file "/var/log/bind/query.log" versions 4 size 4m;
print-time YES;
print-severity NO;
print-category NO;
};

category default {
"misc";
};

category queries {
"query";
};
};

после перезапуска наш slave сервер благополучно скопирует необходимую ему информацию с главного сервера, о чем будет говорить наличие файлов в  каталоге:
 
root@debian:~# ls -la /var/cache/bind/
итого 28
drwxrwxr-x 2 root bind 4096 Июл 8 18:47 .
drwxr-xr-x 10 root root 4096 Июл 8 15:17 ..
-rw-r--r-- 1 bind bind 416 Июл 8 18:32 0.0.10.in-addr.arpa
......
-rw-r--r-- 1 bind bind 455 Июл 8 18:32 example.com
........

 
В принципе, slave сервер может не хранить копию зоны у себя в файловой системе. Эта копия нужна только в момент старта DNS. Наличие копии зоны в файловой системе может избавить от сбоя при недоступности master сервера во время запуска slave DNS. Если не указать опцию file в разделе zone, то копия не создается.

Настройка netfilter (iptables) для DNS BIND


Собственно, настроив работу сервера, неплохо было бы его защитить. Мы знаем, что сервер работает на 53/udp порту. Почитав статью о том, что такое netfilter и правила iptables и ознакомившись с практическими примерами iptables, можно создать правила фильтрации сетевого трафика:
dns ~ # iptables-save
# типовые правила iptables для DNS
*filter
:INPUT DROP [7511:662704]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
# разрешить доступ локальной сети к DNS серверу:
-A INPUT -s 192.168.1.1/24 -d 192.168.1.1/32 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:61000 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:61000 -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# разрешить доступ DNS серверу совершать исходящие запросы
-A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
COMMIT

Это типовой пример! Для задания правил iptables под Ваши задачи и конфигурацию сети, необходимо понимать принцип работы netfilter в Linux, почитав вышеуказанные статьи.

Устранение неполадок


Основным источником для выявления проблем с DNS является системный лог. Вот пример ошибок при запуске, когда я ошибся с путем к файлу зоны коревых серверов:
Jul 5 18:12:43 dns-server named[4224]: built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-dlz-postgres=no' '--with-dlz-mysql=no' '--with-dlz-bdb=yes' '--with-dlz-filesystem=yes' '--with-dlz-ldap=yes' '--with-dlz-stub=yes' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=' 'CPPFLAGS='
Jul 5 18:12:43 dns-server named[4224]: adjusted limit on open files from 1024 to 1048576
Jul 5 18:12:43 dns-server named[4224]: found 1 CPU, using 1 worker thread
Jul 5 18:12:43 dns-server named[4224]: using up to 4096 sockets
Jul 5 18:12:43 dns-server named[4224]: loading configuration from '/etc/bind/named.conf'
Jul 5 18:12:43 dns-server named[4224]: reading built-in trusted keys from file '/etc/bind/bind.keys'
Jul 5 18:12:43 dns-server named[4224]: using default UDP/IPv4 port range: [1024, 65535]
Jul 5 18:12:43 dns-server named[4224]: using default UDP/IPv6 port range: [1024, 65535]
Jul 5 18:12:43 dns-server named[4224]: listening on IPv4 interface lo, 127.0.0.1#53
Jul 5 18:12:43 dns-server named[4224]: listening on IPv4 interface eth1, 192.168.1.1#53
Jul 5 18:12:43 dns-server named[4224]: generating session key for dynamic DNS
Jul 5 18:12:43 dns-server named[4224]: could not configure root hints from '/etc/bind/db.root': file not found
Jul 5 18:12:43 dns-server named[4224]: loading configuration: file not found # файл не найден
Jul 5 18:12:43 dns-server named[4224]: exiting (due to fatal error)
Jul 5 18:15:05 dns-server named[4298]: starting BIND 9.7.3 -u bind
Jul 5 18:15:05 dns-server named[4298]: built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-dlz-postgres=no' '--with-dlz-mysql=no' '--with-dlz-bdb=yes' '--with-dlz-filesystem=yes' '--with-dlz-ldap=yes' '--with-dlz-stub=yes' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=' 'CPPFLAGS='
Jul 5 18:15:05 dns-server named[4298]: adjusted limit on open files from 1024 to 1048576
Jul 5 18:15:05 dns-server named[4298]: found 1 CPU, using 1 worker thread
Jul 5 18:15:05 dns-server named[4298]: using up to 4096 sockets
Jul 5 18:15:05 dns-server named[4298]: loading configuration from '/etc/bind/named.conf'
Jul 5 18:15:05 dns-server named[4298]: using default UDP/IPv4 port range: [1024, 65535]
Jul 5 18:15:05 dns-server named[4298]: using default UDP/IPv6 port range: [1024, 65535]
Jul 5 18:15:05 dns-server named[4298]: listening on IPv4 interface lo, 127.0.0.1#53
Jul 5 18:15:05 dns-server named[4298]: listening on IPv4 interface eth1, 192.168.1.1#53
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 254.169.IN-ADDR.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 2.0.192.IN-ADDR.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 100.51.198.IN-ADDR.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 113.0.203.IN-ADDR.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 255.255.255.255.IN-ADDR.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: D.F.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 8.E.F.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 9.E.F.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: A.E.F.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: B.E.F.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA
Jul 5 18:15:05 dns-server named[4298]: zone 0.in-addr.arpa/IN: loaded serial 1
Jul 5 18:15:05 dns-server named[4298]: zone 127.in-addr.arpa/IN: loaded serial 1
Jul 5 18:15:05 dns-server named[4298]: zone 255.in-addr.arpa/IN: loaded serial 1
Jul 5 18:15:05 dns-server named[4298]: zone localhost/IN: loaded serial 2
Jul 5 18:15:05 dns-server named[4298]: running # запуск прошел удачно

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

Ссылки по теме:

HOWTO DHCP server на Linux (практика)
Настройка сети в Linux, диагностика и мониторинг
DNS сервер BIND (теория)
HOWTO DNS сервер BIND (практика)
Команды управления DNS сервером bind (named) - rndc ...
Как принудительно перезагрузить зону DNS на ведомый (slave ...
Немного о Dnsmasq
Настройка Dynamic DNS на базе Bind9 и nsupdate
Сетевые утилиты сомандной строки Windows
Знакомьтесь: проект Namecoin, будущий "убийца" DNS и ...
Установка и настройка DNS-сервера BIND (named) на Linux ...
Свои DDNS (Dynamic DNS) сервер и клиент на базе Debian
Настройка Прокси сервера + dns сервера на Debian
Список свободных (публичных) серверов DNS
 
Что читать:
Система доменных имен: http://citforum.ru/internet/dns/khramtsov/
RFC 1034 — Domain Names — Concepts and Facilities: http://tools.ietf.org/html/rfc1034
RFC 1035 — Domain Names — Implementation and Specification: http://tools.ietf.org/html/rfc1035
RFC 1537 — Common DNS Data File Configuration Errors: http://tools.ietf.org/html/rfc1537
RFC 1591 — Domain Name System Structure and Delegation: http://tools.ietf.org/html/rfc1591
RFC 1713 — Tools for DNS Debugging: http://tools.ietf.org/html/rfc1713
RFC 2606 — Reserved Top Level DNS Names: http://tools.ietf.org/html/rfc2606
Безопасность DNS (DNSSEC): http://book.itep.ru/4/4/dnssec.htm
BIND 9 Administrator Reference Manual: http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.html
Secure BIND Template: http://www.cymru.com/Documents/secure-bind-template.html
Хорошо расписаны параметры конфига на русском: http://www.bog.pp.ru/work/bind.html
Автоматическое создание файла зоны: http://www.zonefile.org/?lang=en#zonefile
 
Upd 2012.02.14: добавил настройку netfilter для DNS
 

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free