Настройка DNS сервера BIND в choot при обновлении FreeBSD 9.3 до 10 версии

Пришла пора обновлять некоторые сервера с установленной на них FreeBSD 9.3. В FreeBSD 10 версии из базовой системы был удален сервер BIND, и если продолжать его использование и далее, то требуется установить его из портов.

После обновления системы  у меня быстро изменив пару строк конфигов не получилось запустить BIND в chroot`e на FreeBSD 10, поэтому я и решил детально расписать этот процесс. Возможно кому-то это сэкономит время.

Устанавливаем BIND из портов.

cd /usr/ports/dns/bind99 && make install clean

Оставшаяся конфигурация от 9.Х находится по пути /var/named/etc/namedb. И если действовать в соответствии со стандартами, то конфигурацию перемещаем в /usr/local/var/named/etc/namedb, т.к. даже сама система нам говорит, что в /var/named/ у нас ничего не должно быть.

root@:/usr/src # make check-old
>>> Checking for old files
/var/named/etc/namedb/named.root
>>> Checking for old libraries
>>> Checking for old directories
/var/named/dev
/var/named/etc
/var/named/etc/namedb
/var/named/etc/namedb/dynamic
/var/named/etc/namedb/master
/var/named/etc/namedb/working
/var/named/etc/namedb/slave
/var/named/var
/var/named/var/dump
/var/named/var/log
/var/named/var/run
/var/named/var/run/named
/var/named/var/stats
/var/run/named
To remove old files and directories run '/usr/obj/usr/src/make.amd64/bmake delete-old'.
To remove old libraries run '/usr/obj/usr/src/make.amd64/bmake delete-old-libs'.

Создаем рабочую директорию для BIND.

mv /var/named /usr/local/var

Удаляем ставшую уже ненужной ссылку

rm /etc/namedb

Файлы конфигурации созданные инсталлятором будут находиться по пути /usr/local/etc/namedb. На всякий случай резервируем их.

mv /usr/local/etc/namedb /usr/local/etc/namedb.orig

Создаем ссылку на наши конфигурационные файлы в директории /usr/local/etc/

ln -s /usr/local/var/named/etc/namedb /usr/local/etc/namedb

Создаем ссылку на конфигурационные файлы внутри chroot`a

mkdir -p /usr/local/var/named/usr/local
cd /usr/local/var/named/usr/local ln -s ../../etc
cp /usr/local/etc/namedb.orig/named.root /usr/local/var/named/etc/namedb

Создаем правила для devfs. Правим /etc/devfs.conf.

# Custom rules for the named chroot dev
[devfsrules_named_chroot=4]
add hide
add path run unhide
add path random unhide

Добавляем в /etc/fstab.

devfs             /usr/local/var/named/dev  devfs   rw,ruleset=4      0     0

Монтируем.

mount /usr/local/var/named/dev

Правим /etc/rc.conf примерно следующего содержания.

named_enable="YES"                                # Run named, the DNS server (or NO).
named_program="/usr/local/sbin/named"             # path to named, if you want a different one.
named_chrootdir="/usr/local/var/named"            # Chroot directory (or "" not to auto-chroot it)
named_conf="/usr/local/etc/namedb/named.conf"     # Path to the configuration file
named_flags="-4"                                  # Flags for named
named_uid="bind"                                  # User to run named as
named_chroot_autoupdate="YES"                     # Automatically install/update chrooted
                                                  # components of named. See /etc/rc.d/named.
named_symlink_enable="YES"                        # Symlink the chrooted pid file
#named_wait="NO"                 # Wait for working name service before exiting
#named_wait_host="localhost"     # Hostname to check if named_wait is enabled
#named_auto_forward="NO"         # Set up forwarders from /etc/resolv.conf
#named_auto_forward_only="NO"    # Do "forward only" instead of "forward first"

Правим конфигурационный файл /usr/local/etc/namedb/named.conf

directory "/usr/local/etc/namedb";

Выставляем правильные права доступа на конфигурационные файлы.

chown -R bind:wheel /usr/local/var/named/etc/namedb

На данный момент нужно еще поправить /usr/local/etc/rc.d/named иначе при остановке сервиса появляется ошибка.

Stopping named.
umount: /var/namedb/usr/local/lib/engines: statfs: No such file or directory
umount: /var/namedb/usr/local/lib/engines: unknown file system

Вносим следующие изменения

named_poststop()
{
-    if [ -n "${named_chrootdir}" -a -c ${named_chrootdir}/dev/null ]; then
+    if [ -d ${_openssl_engines} -a -n "${named_chrootdir}" -a -c ${named_chrootdir}/dev/null ]; then

Запускаем BIND 

/usr/local/etc/rc.d/named start

 

В статье использовались материалы:

http://blog.e-shell.org/301

http://ximalas.info/2015/01/06/missing-chroot-for-dnsbind9910/

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201423