Сервер DNS (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse 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";
В разделе 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;
};
Для разбивки журналов можно использовать каналы, которые записывать в различные файлы.
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; };
Для добавления своей динамической в данном случае зоны воспользуемся файлом, например, named.conf.zones.dynamic
.
Добавим секретный ключ для DHCP
key DHCP_UPDATER {
algorithm HMAC-MD5.SIG-ALG.REG.INT;
secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
};
И зоны, прямую и обратную:
zone "halfoff.lan" {
type master;
file "halfoff.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
Мастер файл прямой зоны halfoff.lan.hosts
$ORIGIN .
$TTL 86400 ; 1 day
halfoff.lan IN SOA halfoff.lan. admin.halfoff.lan. (
2021100601 ; serial
600 ; refresh (10 minutes)
300 ; retry (5 minutes)
3600 ; expire (1 hour)
600 ; minimum (10 minutes)
)
NS ns.halfoff.lan.
MX 10 mx.halfoff.lan.
TXT "halfoff.ru server"
HINFO "Pentium-III-1200" "Linux"
A 10.0.3.2
$ORIGIN halfoff.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
Иногда требуется сделать различное отображение данных 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 "halfoff.ru" {
type master;
file "halfoff.ru.local.hosts";
...
}
include "named.conf.zones";
}
view "external" {
match-clients { any; };
zone "halfoff.ru" {
type master;
file "halfoff.ru.hosts";
notify yes;
allow-transfer { slave_ns; };
};
include "named.conf.zones";
};
Здесь определено два отображения view
, internal
- внутренняя, котороая будет отдаваться только на запросы из внутренних сетей, и external
- внешняя, которая будет отвечать на запросы любому клиенту. При помощи директивы include
подключаются общие для всех клиентов данные.
В приведенном примере, разделяется (split) зона halfoff.ru
. Мы определяем адреса серверов из демилитаризованной зоны в файле halfoff.ru.local.hosts
srv1 IN A 10.0.3.101
srv2 IN A 10.0.3.102
и наряду с этим задаем в файле halfoff.ru.hosts
белый IP адрес, на котором установлен, например, прокси сервер, перенаправляющий запросы по имени хоста на соответствующий адрес в локальной сети:
srv1 IN A 50.60.70.80
srv2 IN A 50.60.70.80
Запуск, перезапуск осуществляется через утилиту systemctl
systemctl start bind9
systemctl enable bind9
systemctl status bind9
Сгенерировать конфигурацию 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 halfoff.lan
- заморозка зоны halfoff.lan для ручного внесения измененийrndc thaw halfoff.lan
- вернуть возможность обновления зоны halfoff.lanОшибка синхронизации журнала изменений зоны
general: zone halfoff.lan/IN: journal rollforward failed: journal out of sync with zone
Удалить файл журнала и перезапустить DNS сервер
rm var/cache/bind/halfoff.lan.hosts.jnl
systemctl restart bind9