Установка и настройка DNS сервера Bind9 в Debian/Ubuntu Linux
Сервер DNS (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse DNS).
Установка DNS сервера
Этот пакет является основополагающим, и присутствует во всяческих репозиториях.
Установка производится стандартным образом:
apt install -y bind9 bind9utils
Стандартными для Debian/Ubuntu Linux расположениями файлов Bind9 являются
/etc/default/bind9- параметры запуска демона;/etc/bind/- файлы конфигурации;/var/cache/bind/- директория обслуживаемых доменных зон;/var/log/bind/- файлы журналов.
Четко установившаяся традиция разделения длинных конфигурационных файлов на части здесь может быть использована максимально эффективно при помощи директивы include, где основной файл конфигурации выглядит так
include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local"; include "/etc/bind/named.conf.default-zones"; include "/etc/bind/named.conf.zones"; include "/etc/bind/named.conf.zones.dynamic";
Основные параметры конфигурации DNS Bind9
В разделе options определяются общие параметры DNS сервера.
directory- определяет расположение мастер-файлов зон;forwarders- вышестоящие DNS серверы (заменить 0.0.0.0 и убрать комментарий);listen-on- какие интерфейсы должны прослушиваться;version- информация о версии сервера.
options {
        // forwarders { 0.0.0.0; };
        directory "/var/cache/bind";
        listen-on { 10.0.1.2; 10.0.2.2; 10.0.3.2; 127.0.0.1; };
        version none;
};Журналирование в DNS Bind9
Для разбивки журналов можно использовать каналы, которые записывать в различные файлы.
logging {
        // Общий канал для всех запросов в DNS
        channel default_ch {
                // Параметры ротации файла: размер 100КБ, 4 версии
                file "/var/log/bind/named.log" versions 4 size 100k;
                severity info;      // Уровень информативности
                print-time yes;     // Показывать время
                print-category yes; // Указывать категорию
        };
        // Канал для упрощенных запросов
        channel lame_ch {
                file "/var/log/bind/lame_servers.log" versions 4 size 100k;
                severity info;
                print-time yes;
                print-category yes;
                };
        // Канал безопасности
        channel security_ch {
                file "/var/log/bind/security.log" versions 4 size 100k;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };
        // Канал передачи зон между серверами
        channel xfer_ch {
                file "/var/log/bind/xfer.log" versions 4 size 100k;
                severity info;
                print-time yes;
                print-category yes;
                };
        // Канал отладки обновлений зон
        channel update_debug {
                file "/var/log/bind/update_debug.log" versions 4 size 100k;
                severity debug 3;
                print-category yes;
                print-severity yes;
                print-time     yes;
                print-severity yes;
                print-time     yes;
        };
        // Канал обновлений зон
        channel update_log {
                file "/var/log/bind/update.log" versions 4 size 100k;
                severity dynamic;
                print-category yes;
                print-severity yes;
                print-time     yes;
        };
        // Направление категорий сообщений в соответствующие каналы
        category lame-servers { lame_ch; };
        category xfer-in  { xfer_ch; };
        category xfer-out { xfer_ch; };
        category update   { update_debug; update_log; };
        category update-security { update_debug; };
        category security { security_ch; };
        category default  { default_ch; };
};При необходимости отключения любой категории, направьте ее в null
category lame-servers { null; };Добавление зоны в DNS
Для добавления своей динамической в данном случае зоны воспользуемся файлом, например, named.conf.zones.dynamic.
Добавим секретный ключ для DHCP
key DHCP_UPDATER {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
};zone "antroot.lan" {
    type master;
    file "antroot.lan.hosts";
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
    notify no;
};
zone "3.0.10.in-addr.arpa" IN {
    type master;
    file "_db.10.0.3";
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
};И также необходимо создать мастер-файлы этих зон в директории /var/cache/bind
Мастер файл прямой зоны antroot.lan.hosts
$ORIGIN .
$TTL 86400      ; 1 day
antroot.lan  IN SOA  antroot.lan. admin.antroot.lan. (
                                2021100601 ; serial
                                600        ; refresh (10 minutes)
                                300        ; retry (5 minutes)
                                3600       ; expire (1 hour)
                                600        ; minimum (10 minutes)
                                )
                        NS      ns.antroot.lan.
                        MX      10 mx.antroot.lan.
                        TXT     "antroot.ru server"
                        HINFO   "Pentium-III-1200" "Linux"
                        A       10.0.3.2
$ORIGIN antroot.lan.
ns                      A       10.0.3.2
mx                      A       10.0.3.2
$TTL 300        ; 5 minutes
nas.                    A       10.0.3.8Мастер файл обратной _db.10.0.3
$ORIGIN .
$TTL 600        ; 10 minutes
3.0.10.in-addr.arpa     IN SOA  mijor.lan. cd.mijor.lan. (
                                34         ; serial
                                600        ; refresh (10 minutes)
                                3600       ; retry (1 hour)
                                86400      ; expire (1 day)
                                3600       ; minimum (1 hour)
                                )
                        NS      localhost.
$ORIGIN 3.0.10.in-addr.arpa.
$TTL 300        ; 5 minutes
90                      PTR     nas.mijor.lan.Проверка конфигурационных файлов:
named-checkconf /etc/bind/named.conf
Настройка Split DNS
Иногда требуется сделать различное отображение данных DNS для внутренних клиентов в корпоративной сети и для внешних, обращающихся через интернет. В частности, для использования машин с несколькими IP адресами, или работающими через nginx/haproxy прокси серверы.
Определим внешних и внутренних клиентов:
acl internal_nets { 172.16.72.0/24; 192.168.1.0/24; };
acl external_nets { bastion-ips-go-here; };view "internal" {
    match-clients {
        192.168.0.0/16;
        172.16.0.0/12;
        10.0.0.0/8;
        127.0.0.0/8;
    };
    recursion yes;
    zone "antroot.ru" {
        type master;
        file "antroot.ru.local.hosts";
        ...
    }
    include "named.conf.zones";
}
view "external" {
    match-clients { any; };
    zone "antroot.ru" {
        type master;
        file "antroot.ru.hosts";
        notify yes;
        allow-transfer { slave_ns; };
    };
    include "named.conf.zones";
};Здесь определено два отображения view, internal - внутренняя, котороая будет отдаваться только на запросы из внутренних сетей, и external - внешняя, которая будет отвечать на запросы любому клиенту. При помощи директивы include подключаются общие для всех клиентов данные.
В приведенном примере, разделяется (split) зона antroot.ru. Мы определяем адреса серверов из демилитаризованной зоны в файле antroot.ru.local.hosts
srv1 IN A 10.0.3.101 srv2 IN A 10.0.3.102
и наряду с этим задаем в файле antroot.ru.hosts белый IP адрес, на котором установлен, например, прокси сервер, перенаправляющий запросы по имени хоста на соответствующий адрес в локальной сети:
srv1 IN A 50.60.70.80 srv2 IN A 50.60.70.80
Запуск сервера DNS Bind9
Запуск, перезапуск осуществляется через утилиту systemctl
systemctl start bind9 systemctl enable bind9 systemctl status bind9
Управление DNS через утилиту rndc
Сгенерировать конфигурацию rndc:
rndc-confgen > /etc/bind/rndc.conf
key "rndc-key" {
      algorithm hmac-md5;
    secret "ABCDEFGHIJKLMNOPQRSTUVWXYZ==";
};
options {
     default-server 127.0.0.1;
     default-port 953;
     default-key "rndc-key";
};Добавить в /etc/bind/named.conf
include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
    };После перезапуска bind9 (systemctl restart bind9) можно воспользоваться:
rndc status- вывод общего состояния DNS сервера;rndc freeze antroot.lan- заморозка зоны antroot.lan для ручного внесения изменений;rndc thaw antroot.lan- вернуть возможность обновления зоны antroot.lan.
Некоторые ошибки
Ошибка синхронизации журнала изменений зоны
general: zone antroot.lan/IN: journal rollforward failed: journal out of sync with zone
Удалить файл журнала и перезапустить DNS сервер
rm var/cache/bind/antroot.lan.hosts.jnl systemctl restart bind9