FreeBSD: установка и настройка сервера BIND

Автор: | 04/08/2012
 

По-умолчанию, BIND устанавливается вместе с системой. Но лучше перепроверить версию.

Выполняем:

# /usr/sbin/named -v
BIND 9.8.1-P1

И смотрим — что у нас есть в портах:

# make search name=bind9 | less

Находим последнюю версию:


Port:   bind99-9.9.1.2

Значит — установим более новую версию.

Не забываем обновить порты:

# portsnap fetch update

Переходим и запускаем конфигурирование:

# cd /usr/ports/dns/bind99
# make config-recursive

В первом окне выбираем опцию:

[*] REPLACE_BASE    Replace base BIND with this version

что бы обновить установленную версию BIND-а.

ВАЖНО: каталог сервера named/var/named/etc/namedb/, однако сервер работает в chroot-окружении, поэтому все пути указываются как /etc/namedb/, который в то же время является ссылкой на /var/named/etc/namedb/.

Проверить это можно так:

# ls -i /etc/namedb/ /var/named/etc/namedb/
/etc/namedb/:
94731 dynamic           94732 master            94735 named.conf        94736 named.root        94741 rndc.conf.sample  94750 rndc.key          94733 slave             94747 touch             94734 working

/var/named/etc/namedb/:
94731 dynamic           94732 master            94735 named.conf        94736 named.root        94741 rndc.conf.sample  94750 rndc.key          94733 slave             94747 touch             94734 working

С ключем -i указывается т.н. «номер инноды» («inode number»). Если они совпадают — значит это один и тот же файл.

Приступаем к конфигурированию.

Создадим файлы логов и изменим владельца:

# touch /var/log/bind/named.log
# touch /var/log/bind/query.log
# chown -R bind:bind /var/log/bind/

Настроим дополнительное логгирование. В конец файла /etc/syslog.conf добавляем две строки:

!named
*.* /var/log/named.log

Создаем файл лога:

# touch /var/log/named.log

Устанавливаем владельца:

# chown bind:bind /var/log/named.log

Перезапускаем демон:

# /etc/rc.d/syslogd restart

Переходим в каталог сервера BIND и создадим копию файла конфигурации (на всякий случай):

# cd /var/named/etc/namedb/
# cp named.conf /home/setevoy/backups/configs/named.conf.default

Удалим старый файл named.conf:

# pwd
/var/named/etc/namedb
# rm named.conf

Создадим новый и заполним его:

options {
directory       «/etc/namedb»;
dump-file       «/var/named/data/cache_dump.db»;
pid-file        «/var/run/named/pid»;
statistics-file «/var/named/data/named_stats.txt»;
memstatistics-file «/var/named/data/named_mem_stats.txt»;
listen-on port 53 { 77.120.106.40; };
#       allow-query { localhost; };
#       recursion yes;
allow-recursion{
127.0.0.1;
10.0.0.0/24;
};
forwarders      {
77.120.112.133;
82.144.220.2;
82.144.220.7;
};
version         «this is my bind :)»;
};

logging {
channel default-log {file «/var/log/bind/named.log»; severity debug; print-severity yes; };
category default {default-log;};
channel «querylog» { file «/var/log/bind/query.log»; print-time yes;};
category queries {querylog;};
};

zone «.» {
type hint;
file «named.root»;
};

zone «localhost» {
type master;
file «master/localhost-forward.db»;
};

zone «127.in-addr.arpa» {
type master;
file «master/localhost-reverse.db»;
};

zone «website.co.ua» {
type master;
file «/var/named/zones/master/website.co.ua»;
};

zone «setevoy.org.ua» {
type master;
file «/var/named/zones/master/setevoy.org.ua»;
};

zone «it-news.in.ua» {
type slave;
file «/var/named/zones/slave/it-news.in.ua»;
masters{46.164.129.74; };
};

Опции named.conf

Рабочая директория сервера BIND, менять не надо:

directory       «/etc/namedb»;

Файл для хранения кеша ответов сервера:

dump-file       «/var/named/data/cache_dump.db»;

Тут хранится запись номера PID демона named, менять не надо:

pid-file        «/var/run/named/pid»;

Файл для хранения статистики запросов к серверу:

statistics-file «/var/named/data/named_stats.txt»;

Файл для хранения статистики использования памяти:

memstatistics-file «/var/named/data/named_mem_stats.txt»;

Указать определенный IP и порт для работы named (например — можно «завернуть» его только внутрь локальной сети):

listen-on port 53 { 77.120.106.40; };

Разрешить запросы к серверу всем:

allow-query { any; };

Разрешить рекурсивные запросы всем клиентам  о любых доменах:

recursion yes;

Разрешить рекурсивные запросы только с определенных IP и/или сетей (более правильное решение):

allow-recursion{
127.0.0.1;
10.0.0.0/24;
};

Адреса серверов DNS, которым будем отправлять рекурсивные запросы, необязательный параметр, у меня указаны DNS дата-центра:

forwarders      {
77.120.112.133;
82.144.220.2;
82.144.220.7;
};

Прячем версию нашего BIND:

version         «this is my bind :)»;

Далее идет перечисление файлов зон.

Корневая всех доменов:

zone «.» {
type hint;
file «named.root»;
};

Наша локальная зона:

zone «localhost» {
type master;
file «master/localhost-forward.db»;
};

Обратная локальная зона (содержит PTR-запись):

zone «127.in-addr.arpa» {
type master;
file «master/localhost-reverse.db»;
};

Далее идет описание обслуживаемых доменов.

Для домена setevoy.org.ua это сервер будет primary DNS, т.е. основным сервером:

zone «setevoy.org.ua» {
type master;
file «/var/named/zones/master/setevoy.org.ua»;
};

Для домена it-news.in.ua мы будем secondary DNS, т.е. вторичным сервером:

zone «it-news.in.ua» {
type slave;
file «/var/named/zones/slave/it-news.in.ua»;
masters{46.164.129.74; };
};

Создадим файл зоны для setevoy.org.ua:

# cat /var/named/zones/master/setevoy.org.ua
$TTL    3600
@               IN      SOA     ns1.setevoy.org.ua. root.setevoy.org.ua.  (
2012080401      ; Serial
3600            ; Refresh
900             ; Retry
3600            ; Expire
3600            ; Minimum
)
@               IN      NS      ns1.setevoy.org.ua.
@               IN      NS      ns3.dc.volia.com.
@               MX      10      mx.setevoy.org.ua.
@               IN      A       77.120.106.40
www             IN      A       77.120.106.40
mx              IN      A       77.120.106.40
ns1             IN      A       77.120.106.40

ВАЖНО: после каждого изменения строка Serial должна увеличиваться на 1 цифру в конце, иначе secondary NS не обновит у себя файл зоны домена. Подробно описывать файл не буду.

Перезапускаем named:

# service named restart

И смотрим логи /var/log/named/log, должно быть примерно такое:

Aug  3 23:48:11 akira named[1459]: all zones loaded
Aug  3 23:48:11 akira named[1459]: running

Одна из самых частых ошибок выглядит в логе так:

Aug  3 23:48:11 akira named[1459]: zone website.co.ua/IN: loading from master file /var/named/zones/master/website.co.ua failed: file not found
Aug  3 23:48:11 akira named[1459]: zone website.co.ua/IN: not loaded due to errors.

Ошибка была в самом файле зоны /var/named/zones/master/website.co.ua — не там поставил скобку.

Далее настроим утилиту rndc.

Выполняем команду:

# rndc-confgen

и получаем такое сообщение:

# Start of rndc.conf
key «rndc-key» {
algorithm hmac-md5;
secret «*****************************»;
};

options {
default-key «rndc-key»;
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key «rndc-key» {
#       algorithm hmac-md5;
#       secret «»*****************************»;
# };
#
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { «rndc-key»; };
# };
# End of named.conf

Создаем файл rndc.conf и в него вписываем содержимое строк между # Start of rndc.conf и # End of rndc.conf:

# cat rndc.conf
# Start of rndc.conf
key «rndc-key» {
algorithm hmac-md5;
secret «*****************************»;
};

options {
default-key «rndc-key»;
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

То, что находится после строки «# Use with the following in named.conf, adjusting the allow list as needed:» добавляем в конец файла named.conf и убираем комментарии, получаем:

key «rndc-key» {
algorithm hmac-md5;
secret «*****************************»;
};

controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { «rndc-key»; };
};

И перезагружаем named, пока старым способом:

# service named restart
Stopping named.
Starting named.

Теперь сервером можно управлять с помощью команд утилиты rndc.

Перезапустить named:

# rndc reload
WARNING: key file (/etc/namedb/rndc.key) exists, but using default configuration file (/etc/namedb/rndc.conf)
server reload successful

Проверить статус сервера:

# rndc status
WARNING: key file (/etc/namedb/rndc.key) exists, but using default configuration file (/etc/namedb/rndc.conf)
version: 9.9.1-P2 (this is my bind :))
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 38
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

Команд много, добавлю их попозже в другой статье.

Добавляем named  в автозапуск при старте системы в файл /etc/rc.conf:

#Enable and configure BIND
named_enable=»YES»
named_uid=»bind»
named_chrootdir=»»
named_flags=»-s»

И можно перезагрузить сервер для полной уверенности:

# shutdown -r now
Shutdown NOW!
shutdown: [pid 1953]

Во время загрузки пошли ошибки:

# less /var/log/bind/named.log | grep failed
error: zone it-news.in.ua/IN: loading from master file /var/named/zones/slave/it-news.in.ua failed: end of file
debug 1: managed-keys-zone: loading from master file managed-keys.bind failed: file not found
error: isc_stdio_read failed: end of file

Решение — создать файл managed-keys.bind в рабочем каталоге named:

# touch  /var/named/etc/namedb/working/managed-keys.bind
# chmod bind:bind /var/named/etc/namedb/working/managed-keys.bind

Теперь проверим как сервер отвечает на запросы:

02:35:34 [setevoy@perun ~] $ dig @77.120.106.40 setevoy.org.ua

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61430
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;setevoy.org.ua.                        IN      A

;; ANSWER SECTION:
setevoy.org.ua.         3600    IN      A       77.120.106.40

;; AUTHORITY SECTION:
setevoy.org.ua.         3600    IN      NS      ns1.setevoy.org.ua.
setevoy.org.ua.         3600    IN      NS      ns3.dc.volia.com.

;; ADDITIONAL SECTION:
ns1.setevoy.org.ua.     3600    IN      A       77.120.106.40

Вывод немного сократил, но основное видно — мы получили  status: NOERROR и ответ ANSWER SECTION: setevoy.org.ua.         3600    IN      A       77.120.106.40.

Проверим домен, для которого являемся secondary:

02:56:19 [setevoy@perun ~] $ dig @77.120.106.40 it-news.in.ua

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18743
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;it-news.in.ua.                 IN      A

;; ANSWER SECTION:
it-news.in.ua.          600     IN      A       77.120.106.52

;; AUTHORITY SECTION:
it-news.in.ua.          600     IN      NS      gamma.freehost.com.ua.
it-news.in.ua.          600     IN      NS      beta.freehost.com.ua.
it-news.in.ua.          600     IN      NS      alpha.freehost.com.ua.

Тоже все отлично.

В файл /etc/resolv.conf добавим наш сервер:

# cat /etc/resolv.conf
nameserver 127.0.0.1

Полезные ссылки:

http://www.lissyara.su/articles/freebsd/programms/bind/
http://www.lissyara.su/articles/freebsd/programms/named_9.7.0/
http://subnets.ru/blog/?p=38
http://muff.kiev.ua/content/bind-9-nastroika-dns-servera
http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/network-dns.html
http://info.nic.ru/st/8/out_259.shtml