Sysadmin
May 22

Установка и настройка 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

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