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