Здравствуйте, уважаемые читатели!Данная статья написана по большей части, как заметка по сборке DNS сервиса BIND9.16.0
Появилась она в связи с моими исследованиями работоспособности такой фишки, как RPZ (Response Policy Zone).
Он позволяет переопределять ответы DNS для доменных имен т.е. блокировать тот или иной ресурс на уровне DNS. Я планировал использовать его для блокировки различной рекламы и баннеров.
В версиях BIND9.10 и BIND9.11 он почему-то не работал корректно. А вот в BIND9.16 работает!
Но в этой статье речь пойдет не о блокировке, а о сборке последней стабильной версии BIND9.Мне также не нравилось, что в репозитории для Debian 9 доступен только BIND9.10, а для Debian 10 доступен только BIND9.11
Я решил изучить вопрос сборки и запуска из исходных кодов. Если кому-то это будет полезно, то прошу к изучению.
Сборка и установка
Скачивание
Будем работать от корня
cd /root
Скачиваем исходники BIND9
Если планируете ставить последнюю версию, то качать отсюда: https://www.isc.org/bind/
wget https://downloads.isc.org/isc/bind9/9.16.0/bind-9.16.0.tar.xz
Распаковываем
tar -xf bind-9.16.0.tar.xz
Устанавливаем необходимые зависимости
apt update && apt -y install build-essential pkg-config python3-pip libuv1 libuv1-dev libssl-dev libcap-dev libtool-bin
pip3 install ply
Переходим в распакованную папку
cd bind-9.16.0/
Конфигурирование
В рабочей системе на Debian 10 у установленного BIND выводятся вот такие параметры сборки. Частью из них я и воспользуюсь!
BIND 9.11.5-P4-5.1-Debian (Extended Support Version)
built with '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=/usr/include' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-silent-rules' '--libdir=/usr/lib/x86_64-linux-gnu' '--libexecdir=/usr/lib/x86_64-linux-gnu' '--disable-maintainer-mode' '--disable-dependency-tracking' '--libdir=/usr/lib/x86_64-linux-gnu' '--sysconfdir=/etc/bind' '--with-python=python3' '--localstatedir=/' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-gost=no' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-libidn2' '--with-libjson=/usr' '--with-lmdb=/usr' '--with-gnu-ld' '--with-geoip=/usr' '--with-atf=no' '--enable-ipv6' '--enable-rrl' '--enable-filter-aaaa' '--enable-native-pkcs11' '--with-pkcs11=/usr/lib/softhsm/libsofthsm2.so' '--with-randomdev=/dev/urandom' '--enable-dnstap' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fdebug-prefix-map=/build/bind9-9ZuvGL/bind9-9.11.5.P4+dfsg=. -fstack-protector-strong -Wformat -Werror=format-security -fno-strict-aliasing -fno-delete-null-pointer-checks -DNO_VERSION_DATE -DDIG_SIGCHASE' 'LDFLAGS=-Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2'
Производим конфигурирование. Через —help вы можете ознакомиться с опциями настройки
./configure --prefix=/usr --includedir=/usr/include --mandir=/usr/share/man --infodir=/usr/share/info --sysconfdir=/etc/bind --localstatedir=/var --with-python=python3 --with-libtool --enable-static --with-gost=no --enable-full-report --enable-threads --enable-largefile --with-openssl=/usr
Больше о возможных параметрах
./configure --help
По умолчанию ‘make install’ установит все файлы в «/usr/local/bin’, ‘/usr/local/lib’ и т.д.
Вы можете указать префикс установки, отличный от ‘/usr/local’ используя ‘—prefix’,
Например ‘—prefix=$HOME’
После завершения конфигурирования получим итоговый вывод:
Кратко про основные опции:
- —sysconfdir=/etc/bind: Этот параметр заставляет BIND искать файлы конфигурации в /etc/bind вместо /usr/etc
- —with-libtool: Этот параметр вызывает динамическое создание библиотек и связывает установленные двоичные файлы с этими библиотеками
- —enable-fetchlimit: Используйте эту опцию, если вы хотите иметь возможность ограничить частоту рекурсивных клиентских запросов. Это может быть полезно на серверах, которые получают большое количество запросов
- —disable-static: Этот ключ предотвращает установку статических версий библиотек.
Сборка
Собираем
make
Устанавливаем
make install
Проверяем все ли установилось.
named
ls -l /usr/sbin/ | grep named
-rwxr-xr-x 1 root root 3801552 Mar 22 12:08 named
-rwxr-xr-x 1 root root 136288 Mar 22 12:08 named-checkconf
-rwxr-xr-x 1 root root 112056 Mar 22 12:08 named-checkzone
lrwxrwxrwx 1 root root 15 Mar 22 12:08 named-compilezone -> named-checkzone
-rwxr-xr-x 1 root root 26896 Mar 22 12:08 named-journalprint
rndc
ls -l /usr/sbin/ | grep rndc
-rwxr-xr-x 1 root root 97728 Mar 22 12:08 rndc
-rwxr-xr-x 1 root root 54672 Mar 22 12:08 rndc-confgen
Обновляем разрешения библиотек
ldconfig -v
Устанавливаем документацию
install -v -m755 -d /usr/share/doc/bind-9.16.0/arm
install -v -m644 doc/arm/*.html /usr/share/doc/bind-9.16.0/arm
Настройка
Предварительная настройка
Добавляем группу bind
groupadd bind
Добавляем пользователя bind
useradd -d /var/cache/bind -g bind -s /bin/false bind
Создаем папки для сервиса
Папка /etc/bind/ уже должна быть создана.
mkdir /etc/bind/zones /etc/bind/keys /var/cache/bind /run/named /var/run/named /var/log/bind
Добавляем файл bind9 в папку базовых настроек /etc/default/
nano /etc/default/bind9
# run resolvconf?
RESOLVCONF=no
# startup options for the server
OPTIONS="-u bind -4"
Создаем systemd сервис для управления BIND9
nano /etc/systemd/system/bind9.service
[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target
Wants=nss-lookup.target
Before=nss-lookup.target
[Service]
Type=forking
EnvironmentFile=-/etc/default/bind9
ExecStart=/usr/sbin/named $OPTIONS
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop
[Install]
WantedBy=multi-user.target
Создание конфигурации
Создаем ключ rndc.key
rndc-confgen -a
Переместим его в папку keys
mv /etc/bind/rndc.key /etc/bind/keys
Создаем файл rndc.conf для управления
nano /etc/bind/rndc.conf
include "/etc/bind/keys/rndc.key";
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
Создадим минимальный файл конфигурации для запуска BIND9
nano /etc/bind/named.conf
include "/etc/bind/keys/rndc.key";
options {
directory "/var/cache/bind";
pid-file "/var/run/named/named.pid";
statistics-file "/var/run/named/named.stats";
dump-file "/var/log/bind/bind.dump";
max-cache-size 241172480; // 256 Mb
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
zone "." {
type hint;
file "/etc/bind/zones/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/zones/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.255";
};
logging {
category default { bind_log; };
category unmatched { null; };
channel bind_log {
file "/var/log/bind/bind.log" versions 4 size 4m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
};
Добавляем базовые файлы зон
Обновляем права для папок и устанавливаем возможность записи для группы bind
chown -R root:bind /etc/bind /var/cache/bind /run/named /var/run/named /var/log/bind
chmod -R g+w /etc/bind /var/cache/bind /run/named /var/run/named /var/log/bind
Обновляем права для файла /etc/bind/keys/rndc.key
chown bind:bind /etc/bind/keys/rndc.key
Запуск сервиса
Активируем сервис BIND9 и запускаем его
systemctl enable bind9.service
systemctl start bind9.service
Проверяем работу
service bind9 status
Итоговый статус работы BIND9.16.0
Дополнительно процесс запуска можно просмотреть в лог файле /var/log/syslog и /var/log/bind/bind.log
starting BIND 9.16.0 (Stable Release) <6270e60/>
Обновление версии из исходников
Конечно встает вопрос о том а как потом это дело обновлять Ведь гораздо проще запустить &&
Вслучае сборки По из исходных кодов обновляться нам такжепридется из исходных кодов но тут уже может быть чуть проще
Качаем более новую версию распаковываем конфигурируем собираем и устанавливаем
Незабываем заранее остановить работающий Все должно работать как и раньше а возможно что то и лучше тк мы ставили версию с какимито и справлениями
Историю изменений можно найти здесь
Заключение
Побольшей части процесс сборки никакой сложности не представляет главное это корректно установленные права пользователя на папки и файлы
Если что то не запускается то тут уже помогут стандартные логи в которых достаточно информации чтобы понять что нетак
Благодарю за ваше время
Всего хорошего напросторах Интернета😉