Если в вашей инфраструктуре больше 5–10 серверов, resolving через публичные DNS замедляет развёртывание и создаёт зависимость от интернет-канала. Собственный DNS-сервер на BIND9 решает обе проблемы: быстрое разрешение внутренних имён и полный контроль над зонами.
Среда: Ubuntu 22.04 LTS, BIND9 версия 9.18, внутренняя сеть 192.168.10.0/24, домен corp.local.
1. Установка BIND9
sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y
# Проверяем версию
named -v
# BIND 9.18.28-0ubuntu0.22.04.1 (Extended Support Version)
# Проверяем статус сервиса
sudo systemctl status bind9
Конфигурационные файлы лежат в /etc/bind/:
named.conf- точка входа, подключает остальные файлыnamed.conf.options- глобальные параметры (рекурсия, форвардеры, ACL)named.conf.local- описания зонdb.*- файлы зон

2. Настройка глобальных параметров (named.conf.options)
Открываем файл:
sudo nano /etc/bind/named.conf.options
Базовая конфигурация для внутреннего DNS-сервера:
acl "trusted" {
192.168.10.0/24;
127.0.0.1;
};
options {
directory "/var/cache/bind";
// Разрешаем рекурсию только для доверенных клиентов
recursion yes;
allow-recursion { trusted; };
// Форвардеры - внешние DNS для запросов вне наших зон
forwarders {
8.8.8.8;
1.1.1.1;
};
forward only;
// Запрещаем запросы AXFR извне
allow-transfer { none; };
// Скрываем версию BIND от публичного доступа
version "not disclosed";
listen-on { 127.0.0.1; 192.168.10.1; };
listen-on-v6 { none; };
dnssec-validation auto;
};
Ключевой момент - блок acl "trusted". Без него любой хост в интернете сможет использовать ваш сервер как открытый резолвер, что приводит к участию в DNS-amplification атаках.
3. Создание прямой зоны (forward zone)
Прямая зона преобразует имена хостов в IP-адреса. Добавляем зону в named.conf.local:
sudo nano /etc/bind/named.conf.local
zone "corp.local" {
type master;
file "/etc/bind/db.corp.local";
allow-query { trusted; };
};
Создаём файл зоны:
sudo cp /etc/bind/db.local /etc/bind/db.corp.local
sudo nano /etc/bind/db.corp.local
$TTL 604800
@ IN SOA ns1.corp.local. admin.corp.local. (
2026052201 ; Serial (формат YYYYMMDDNN)
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Negative Cache TTL
;
; Name servers
@ IN NS ns1.corp.local.
; A records
ns1 IN A 192.168.10.1
web01 IN A 192.168.10.10
web02 IN A 192.168.10.11
db01 IN A 192.168.10.20
gitlab IN A 192.168.10.30
; CNAME records
git IN CNAME gitlab.corp.local.Serial в формате YYYYMMDDNN нужно увеличивать при каждом изменении зоны, иначе вторичные DNS-серверы не получат обновления.
4. Создание обратной зоны (reverse zone)
Обратная зона преобразует IP в имена хостов. Нужна для корректной работы PTR-запросов и ряда почтовых серверов.
sudo nano /etc/bind/named.conf.local
Добавляем:
zone "10.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.10";
allow-query { trusted; };
};
Создаём файл обратной зоны:
sudo nano /etc/bind/db.192.168.10
$TTL 604800
@ IN SOA ns1.corp.local. admin.corp.local. (
2026052201
3600
1800
604800
86400 )
;
@ IN NS ns1.corp.local.
; PTR records - только последний октет IP
1 IN PTR ns1.corp.local.
10 IN PTR web01.corp.local.
11 IN PTR web02.corp.local.
20 IN PTR db01.corp.local.
30 IN PTR gitlab.corp.local.5. Проверка конфигурации и перезапуск
Перед перезапуском обязательно проверяем синтаксис:
# Проверка основного конфига
sudo named-checkconf
# Проверка файла прямой зоны
sudo named-checkzone corp.local /etc/bind/db.corp.local
# Проверка файла обратной зоны
sudo named-checkzone 10.168.192.in-addr.arpa /etc/bind/db.192.168.10
Если named-checkconf ничего не вывел - конфиг синтаксически корректен. named-checkzone должен завершиться строкой OK.
sudo systemctl restart bind9
sudo systemctl status bind9

6. Проверка через dig
# Прямой запрос - имя в IP
dig @192.168.10.1 web01.corp.local A
# Обратный запрос - IP в имя
dig @192.168.10.1 -x 192.168.10.10
# Проверка рекурсии (внешний домен)
dig @192.168.10.1 github.com
# Проверка, что от неизвестных хостов рекурсия запрещена
# (выполнить с хоста вне ACL trusted)
dig @192.168.10.1 github.com
# Должен вернуть: status: REFUSEDdig удобнее nslookup, потому что явно показывает TTL, флаги ответа и сервер, который обработал запрос. В строке flags: ищите qr aa rd ra для авторитетных ответов вашего сервера.
7. Настройка клиентов
На клиентских машинах сети 192.168.10.0/24 укажите IP вашего DNS-сервера:
# Временно (Ubuntu с systemd-resolved)
sudo resolvectl dns eth0 192.168.10.1
sudo resolvectl domain eth0 corp.local
# Постоянно через Netplan
# /etc/netplan/50-cloud-init.yaml
nameservers:
addresses: [192.168.10.1]
search: [corp.local]
После этого клиент может обращаться к хостам по коротким именам: ssh web01 вместо ssh web01.corp.local.

Итог
BIND9 на Ubuntu 22.04 настраивается за 30–40 минут. Основные точки ошибок: неправильный serial в файле зоны (не обновляется при изменениях), отсутствие ACL (сервер становится открытым резолвером), и блокировка рекурсии для внутренних клиентов. Проверяйте конфиг через named-checkconf и named-checkzone перед каждым перезапуском - это экономит время на диагностику. Для production-среды добавьте второй DNS-сервер с type slave и репликацией зон через AXFR с ограничением по IP.
