Сборка установка и настройка BIND 9.16.0 из исходников в LXC контейнере Debian 10

gost-bind9-source-build
Здравствуйте, уважаемые читатели!
 
Данная статья написана по большей части, как заметка по сборке 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’

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

Итоговый вывод ./configure
===============================================================================
Configuration summary:
-------------------------------------------------------------------------------
Optional features enabled:
        Mutex lock type: 
    IPv6 support (--enable-ipv6)
    Python tools (--with-python)
    Print backtrace on crash (--enable-backtrace)
    Use symbol table for backtrace, named only (--enable-symtable)
    DNSSEC validation active by default (--enable-auto-validation)
    Dynamically loadable zone (DLZ) drivers:
        None
-------------------------------------------------------------------------------
Features disabled or unavailable on this platform:
    Large-system tuning (--with-tuning)
    Allow 'dnstap' packet logging (--enable-dnstap)
    GeoIP2 access control (--enable-geoip)
    GSS-API (--with-gssapi)
    DNS Response Policy Service interface (--enable-dnsrps)
    Allow 'fixed' rrset-order (--enable-fixed-rrset)
    Using PKCS#11 for Public-Key Cryptography (--with-native-pkcs11)
    Very verbose query trace logging (--enable-querytrace)
    Use GNU libtool (--with-libtool)
    CMocka Unit Testing Framework (--with-cmocka)
    XML statistics (--with-libxml2)
    JSON statistics (--with-json-c)
    HTTP zlib compression (--with-zlib)
    LMDB database to store configuration for 'addzone' zones (--with-lmdb)
    IDN support (--with-libidn2)
-------------------------------------------------------------------------------
Configured paths:
    prefix: /usr
    sysconfdir: /etc/bind
    localstatedir: /var
-------------------------------------------------------------------------------
Compiler: gcc
    gcc (Debian 8.3.0-6) 8.3.0
    Copyright (C) 2018 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
===============================================================================
Кратко про основные опции:

  • —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;
        };
};

Добавляем базовые файлы зон

/etc/bind/zones/db.root
nano /etc/bind/zones/db.root
.                        3600000      NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:ba3e::2:30
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201
B.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:84::b
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
C.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2::c
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     199.7.91.13
D.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2d::d
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2f::f
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     198.97.190.53
H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::53
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
I.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fe::53
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:c27::2:30
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fd::1
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:3::42
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35
/etc/bind/zones/db.local
nano /etc/bind/zones/db.local
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
/etc/bind/zones/db.127
nano /etc/bind/zones/db.127
$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.
/etc/bind/zones/db.0
nano /etc/bind/zones/db.0
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
/etc/bind/zones/db.255
nano /etc/bind/zones/db.255
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
 
Обновляем права для папок и устанавливаем возможность записи для группы 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
gost-bind-endstatus
Итоговый статус работы BIND9.16.0

Дополнительно процесс запуска можно просмотреть в лог файле /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
Далее настройки конфигурации и файлы зон можно реализовать по примеру статьи Домашний Сервер: Часть 3 – Внутренний DNS сервис на BIND9 или свои доменные имена в локальной сети

Обновление версии 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

Заключение

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

Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉

Выразить благодарность автору
Если Вам не безразлична судьба блога или Вы просто хотите отблагодарить Автора за его труд, смело переходите на страницу Поддержки, там описана вся информация, по тому, как это сделать. Заранее благодарен вам за данную инициативу!
Хочешь получать уведомления о выходе новых статей?
Loading
GregoryGost

Мир интересен, если вы достаточно любопытны!!!

Оцените автора
GREGORY GOST
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Андрей

    Собираю из исходников BIND9.18.0, потому как в репозиториях «кошака» (Ubuntu 20.04) баганный по голове 9.16.1 только находится, не предоставляющий услуг локального DNS сервера. Сам он спокойно всё и dig, и nslookup, но стоит только подцепиться кому-то к нему как к ресолверу, вместо nslookup идёт жирный timeout. Вот и решил — вдруг 9.18 лишена такой «особенности» или лучше понимает старые мосты и интерфейсы.

    Ответить
    1. GregoryGost автор

      А что именно не так с 9.16.1 можете уточнить?

  2. Никита

    Интересная статья, надеюсь будет продолжение по настройки нескольких dns серверов и более углубленная настройка bind

    Ответить
    1. GregoryGost автор

      Ну, для домашнего использования несколько DNS серверов не всегда нужно, но я подумаю над этим

  3. Павел

    Так значит стоит ожидать новой статьи по дополнительной настройке вырезания рекламы в BIND? Или будет дополнена новым функционалом старая статья?

    Ответить
    1. GregoryGost автор

      Думаю что отдельная т.к. есть ряд тонкостей. И нагружать ту статью не хочется дополнительной информацией

  4. Павел

    Уважаемый автор, т.е. сейчас последняя версия BIND получила функциональность pi-hole и стало возможно организовать вырезание рекламы её использованием и правильной настройкой?

    Ответить
    1. GregoryGost автор

      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 и т.д.