Данная статья написана по большей части, как заметка по сборке 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
Вы можете указать префикс установки, отличный от ‘/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
Дополнительно процесс запуска можно просмотреть в лог файле /var/log/syslog и /var/log/bind/bind.log
starting BIND 9.16.0 (Stable Release)
running on Linux x86_64 5.3.18-2-pve #1 SMP PVE 5.3.18-2
Обновление версии Bind из исходников
Конечно встает вопрос о том, а как потом это дело обновлять. Ведь гораздо проще запустить apt update && apt upgrade
В случае сборки По из исходных кодов, обновляться нам также придется из исходных кодов, но тут уже может быть чуть проще.
Качаем более новую версию bind, распаковываем, конфигурируем, собираем и устанавливаем.
Не забываем заранее остановить работающий Bind9
service bind9 stop
wget https://downloads.isc.org/isc/bind9/9.16.10/bind-9.16.10.tar.xz
tar -xf bind-9.16.10.tar.xz
cd bind-9.16.10/
./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
make
make install
service bind9 start
service bind9 status
Все должно работать, как и раньше, а возможно что-то и лучше т.к. мы ставили версию с какими-то исправлениями )))
Историю изменений можно найти здесь: https://bind9.readthedocs.io
Заключение
По большей части процесс сборки никакой сложности не представляет, главное это корректно установленные права пользователя на папки и файлы.
Если что-то не запускается, то тут уже помогут стандартные логи в которых достаточно информации, чтобы понять, что не так.
Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉
Собираю из исходников BIND9.18.0, потому как в репозиториях «кошака» (Ubuntu 20.04) баганный по голове 9.16.1 только находится, не предоставляющий услуг локального DNS сервера. Сам он спокойно всё и dig, и nslookup, но стоит только подцепиться кому-то к нему как к ресолверу, вместо nslookup идёт жирный timeout. Вот и решил — вдруг 9.18 лишена такой «особенности» или лучше понимает старые мосты и интерфейсы.
А что именно не так с 9.16.1 можете уточнить?
Интересная статья, надеюсь будет продолжение по настройки нескольких dns серверов и более углубленная настройка bind
Ну, для домашнего использования несколько DNS серверов не всегда нужно, но я подумаю над этим
Так значит стоит ожидать новой статьи по дополнительной настройке вырезания рекламы в BIND? Или будет дополнена новым функционалом старая статья?
Думаю что отдельная т.к. есть ряд тонкостей. И нагружать ту статью не хочется дополнительной информацией
Уважаемый автор, т.е. сейчас последняя версия BIND получила функциональность pi-hole и стало возможно организовать вырезание рекламы её использованием и правильной настройкой?
RPZ (Response Policy Zones) — эта функция появилась только в BIND9.10, вернее в BIND9.8 в виде базовых элементов, но полноценная реализация после итераций и обновлений появилась в BIND9.10
https://www.zytrax.com/books/dns/ch7/rpz.html
От части можно этот функционал сравнить с pi-hole, но pi-hole по идее сделан для более легкого внедрения фильтрации на уровне «раз, два, чтобы работало»
С BIND чуть сложнее т.к. списки необходимо обрабатывать самому.
Из примера после загрузки 13 списков, приходится вводить whitelist т.к. эти списки проверять достаточно проблематично, по итогу в файле получается порядка 334000 доменных имен и переставала открываться почта mail.ru из-за наличия домена r.mail.ru в этом списке. Ну и так далее…
Я пока тестирую этот функционал и пишу bash сборщик доменов из таких файлов (вернее уже написал, внедряю дополнительные пользовательские blacklist и whitelist)
Но функционал работает. Всякие окна и баннеры перестают появляться. Также в rpz можно настроить ответы, которые получает браузер: NODATA, NXDOMAIN и т.д.