Когда поднимать свой BIND
Большинству хостов хватает systemd-resolved или внешнего DNS (1.1.1.1). Свой BIND нужен когда:
- Сеть >20 хостов - внутренние имена (
db1.corp.local) без правки/etc/hostsна каждом. - Split-horizon DNS - внутри сети отдавать private IP, снаружи public.
- Кеширующий resolver на офис/дата-центр - снижает latency и нагрузку на ISP.
- Авторитативный для своего публичного домена - самостоятельный hosting.
Альтернативы: dnsmasq (проще, для small networks), unbound (только resolver, без authoritative), PowerDNS (с БД-бэкэндом).
Установка и пакетные различия
| Дистрибутив | Пакет | Демон | Конфиг |
|---|---|---|---|
| RHEL/Fedora | bind | named | /etc/named.conf |
| Debian/Ubuntu | bind9 | named | /etc/bind/named.conf |
| Утилиты | bind-utils / dnsutils | dig, host, nslookup | - |
# RHEL
sudo dnf install bind bind-utils
sudo systemctl enable --now named
# Debian
sudo apt install bind9 dnsutils
sudo systemctl enable --now bind9
Дальше я использую RHEL-пути; для Debian подменяй на /etc/bind/.
Архитектура BIND - три роли
┌────────────────┐ запрос ┌─────────────────┐
│ Клиент │ ───────────────────→ │ Recursive │
│ /etc/resolv.conf │ │ resolver/cache │
│ nameserver │ │ │
│ 192.168.0.10 │ │ • рекурсия │
└────────────────┘ │ • кеш │
└────────┬────────┘
│
↓ если нет в кеше
┌─────────────────┐
│ Authoritative │
│ для example.org │
└─────────────────┘
Один named может выполнять любую/все роли:
- Caching/recursive resolver - отвечает клиентам, кешируя ответы от внешних DNS.
- Authoritative primary (master) - держит «оригинал» зоны
example.org. - Authoritative secondary (slave) - реплика с primary через AXFR/IXFR.
/etc/named.conf - структура
options { listen-on port 53 { 127.0.0.1; 192.168.0.10; }; listen-on-v6 port 53 { ::1; };directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
allow-query { localhost; 192.168.0.0/24; };recursion yes;
forwarders { 1.1.1.1; 9.9.9.9; };dnssec-validation auto;
};
logging { channel default_debug {file "data/named.run";
severity dynamic;
};
};
zone "." IN {type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
Ключевые секции:
options- глобальные настройки (где слушать, кому отвечать, forwarders, recursion).zone "..."- каждая обслуживаемая зона.include "..."- разбить большой конфиг на файлы (часто per-zone).acl name { ... }- именованный список IP/сетей для использования вallow-query,allow-transfer.logging- куда писать что.
Типы зон
| Тип | Назначение |
|---|---|
master | Авторитативный держатель оригинала (== primary в новых терминах) |
slave | Авторитативная реплика с master (== secondary) |
hint | Корневые серверы (. зона) для recursive-резолвинга |
forward | Делегировать запросы для зоны другому серверу |
stub | Минимальная копия - только NS-записи (редко используется) |
Forward zone - example.org → IP
zone "example.org" IN {type master;
file "example.org.db";
allow-update { none; }; allow-transfer { 192.168.0.11; }; # secondary};
Файл зоны /var/named/example.org.db:
$TTL 3600
@ IN SOA ns1.example.org. admin.example.org. (
2026042901 ; serial - YYYYMMDDxx, инкрементить при ИЗМЕНЕНИИ
3600 ; refresh
1800 ; retry
1209600 ; expire
86400 ) ; negative-cache TTL
IN NS ns1.example.org.
IN NS ns2.example.org.
IN MX 10 mail.example.org.
ns1 IN A 192.168.0.10
ns2 IN A 192.168.0.11
www IN A 192.168.0.20
mail IN A 192.168.0.30
api IN CNAME www
Точка . в конце имени = FQDN. Без точки имя дополняется $ORIGIN =
example.org. Это самая частая ошибка в зон-файлах.
Reverse zone - IP → имя
Для 192.168.0.0/24 обратная зона = 0.168.192.in-addr.arpa (октеты
в обратном порядке).
zone "0.168.192.in-addr.arpa" IN {type master;
file "192.168.0.rev";
};
Файл 192.168.0.rev:
$TTL 3600
@ IN SOA ns1.example.org. admin.example.org. (
2026042901 3600 1800 1209600 86400 )
IN NS ns1.example.org.
10 IN PTR ns1.example.org.
20 IN PTR www.example.org.
30 IN PTR mail.example.org.
PTR-записи нужны для логов (читаемые имена вместо IP), для anti-spam
(mail.example.org с обратной = mail.example.org доверяется), для tracert.
Типы DNS-записей
| Тип | Назначение |
|---|---|
SOA | Start of Authority - метаданные зоны (serial, TTL'ы) |
NS | Авторитативные серверы зоны |
A | имя → IPv4 |
AAAA | имя → IPv6 |
CNAME | алиас на другое имя |
PTR | IP → имя (reverse) |
MX | mail-сервер для домена + priority |
TXT | произвольный текст (SPF, DKIM, ACME-challenge) |
SRV | сервис на хосте: _sip._tcp.example.org |
CAA | какие CA могут выдавать сертификаты для домена |
Caching-only сервер - минимум
Если authoritative не нужен:
options { listen-on { 127.0.0.1; 192.168.0.0/24; }; allow-query { localhost; 192.168.0.0/24; };recursion yes;
forwarders { 1.1.1.1; 9.9.9.9; };forward only; # ходить ТОЛЬКО через forwarders, без рекурсии в root
};
zone "." IN { type hint; file "named.ca"; };Идеально для офисного DNS - кеширует ответы upstream'а.
rndc - управление named на лету
sudo rndc status # запущен ли, серийники зон
sudo rndc reload # перечитать конфиги и зоны
sudo rndc reload example.org # перечитать одну зону
sudo rndc flush # очистить весь кеш
sudo rndc flushname host.example.org # сбросить кеш конкретного имени
sudo rndc dumpdb -all # дамп кеша в файл
sudo rndc stats # запись статистики
При первой установке надо сгенерировать ключ:
sudo rndc-confgen -a -r /dev/urandom
Ключ сохранится в /etc/rndc.key, named и rndc будут использовать его
для аутентификации.
Проверка после правки
Обязательно перед rndc reload - иначе сломанный конфиг убьёт named:
# синтаксис named.conf
sudo named-checkconf
# синтаксис zone-файла
sudo named-checkzone example.org /var/named/example.org.db
▸zone example.org/IN: loaded serial 2026042901
▸OK
Тестирование:
dig @192.168.0.10 example.org # запрос конкретно к этому серверу
dig @192.168.0.10 -x 192.168.0.20 # reverse
dig @192.168.0.10 example.org AXFR # zone transfer (если разрешено)
dig @192.168.0.10 +short www.example.org
Безопасность - must
-
allow-recursionограничить только своей сетью. Открытый recursive resolver = DDoS amplifier:allow-recursion { 192.168.0.0/24; localhost; }; -
allow-transferтолько для known secondaries. Без этого AXFR раскрывает всю зону любому:allow-transfer { 192.168.0.11; }; # IP secondary -
TSIG-ключ для transfer'а - даже secondary IP можно подделать:
key "transfer-key" { algorithm hmac-sha256; secret "BASE64..."; };zone "example.org" IN {type master;
allow-transfer { key transfer-key; };};
-
DNSSEC validation для caching-server'а:
dnssec-validation auto. -
Rate-limit против amplification:
rate-limit { responses-per-second 10; }; -
fail2ban на лог named - банить тех кто долбит запросами.
Логи и дебаг
Стандартный лог: /var/log/messages (RHEL) или journalctl -u named.
Для конкретной зоны - увеличить уровень:
sudo rndc trace 3 # уровень 0..10
sudo rndc notrace
Частые проблемы:
loading zone X: file not found- путь вfile ""указан без префиксаdirectoryиз options.bad SOA record- пропущена точка после FQDN, либо неверное число параметров в SOA.serial number unchanged- изменили зону но не подняли serial. secondary-серверы НЕ синхронизируются.journal out of sync- после ручной правки файла удалить.jnl.