# BIND - авторитативный/кеширующий DNS-сервер _Протоколы · LinuxLab Knowledge Base_ **TL;DR:** BIND (Berkeley Internet Name Domain) - самый распространённый DNS-сервер в Linux. Демон `named`, конфиг `/etc/named.conf` или `/etc/bind/named.conf`, контроль через `rndc`. ## Когда поднимать свой BIND Большинству хостов хватает [systemd-resolved](/kb/systemd-resolved.md) или внешнего 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` | - | ```bash # 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 может выполнять любую/все роли: 1. **Caching/recursive resolver** - отвечает клиентам, кешируя ответы от внешних DNS. 2. **Authoritative primary (master)** - держит «оригинал» зоны `example.org`. 3. **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 на лету ```bash 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 # запись статистики ``` При первой установке надо сгенерировать ключ: ```bash sudo rndc-confgen -a -r /dev/urandom ``` Ключ сохранится в `/etc/rndc.key`, named и `rndc` будут использовать его для аутентификации. ## Проверка после правки **Обязательно** перед `rndc reload` - иначе сломанный конфиг убьёт named: ```bash # синтаксис named.conf sudo named-checkconf # синтаксис zone-файла sudo named-checkzone example.org /var/named/example.org.db # → zone example.org/IN: loaded serial 2026042901 # → OK ``` Тестирование: ```bash 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 1. **`allow-recursion`** ограничить только своей сетью. Открытый recursive resolver = DDoS amplifier: ``` allow-recursion { 192.168.0.0/24; localhost; }; ``` 2. **`allow-transfer`** только для known secondaries. Без этого AXFR раскрывает всю зону любому: ``` allow-transfer { 192.168.0.11; }; # IP secondary ``` 3. **TSIG-ключ** для transfer'а - даже secondary IP можно подделать: ``` key "transfer-key" { algorithm hmac-sha256; secret "BASE64..."; }; zone "example.org" IN { type master; allow-transfer { key transfer-key; }; }; ``` 4. **DNSSEC validation** для caching-server'а: `dnssec-validation auto`. 5. **Rate-limit** против amplification: ``` rate-limit { responses-per-second 10; }; ``` 6. **[fail2ban](/kb/fail2ban.md)** на лог named - банить тех кто долбит запросами. ## Логи и дебаг Стандартный лог: `/var/log/messages` (RHEL) или `journalctl -u named`. Для конкретной зоны - увеличить уровень: ```bash 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`. ## Команды ```bash sudo named-checkconf && sudo named-checkzone example.org /var/named/example.org.db ``` Проверить синтаксис конфига и зоны ПЕРЕД reload - иначе named упадёт ```bash sudo rndc reload example.org ``` Перечитать одну зону без полного рестарта named - после правки и инкремента serial ```bash dig @192.168.0.10 example.org +short ``` Спросить конкретно свой DNS - диагностика без влияния resolv.conf ```bash sudo rndc flush ``` Сбросить кеш - после смены DNS upstream или для теста авторитативного ответа ```bash dig @192.168.0.10 example.org AXFR ``` Zone transfer - проверить что secondary получит актуальные данные ## См. также - [DNS resolution](/kb/dns-resolution.md) - [systemd-resolved - локальный DNS-stub](/kb/systemd-resolved.md) - [fail2ban - автобан по логам](/kb/fail2ban.md) - [TLS-сертификаты - X.509, цепочка доверия, Let's Encrypt](/kb/tls-certificates.md)