linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Протоколы/bind-dns-server

kb/protocols ── Протоколы ── advanced

BIND - авторитативный/кеширующий DNS-сервер

BIND (Berkeley Internet Name Domain) - самый распространённый DNS-сервер в Linux. Демон `named`, конфиг `/etc/named.conf` или `/etc/bind/named.conf`, контроль через `rndc`.

view as markdownaka: named, bind9, isc-bind, named-conf

Когда поднимать свой 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/Fedorabindnamed/etc/named.conf
Debian/Ubuntubind9named/etc/bind/named.conf
Утилитыbind-utils / dnsutilsdig, 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-записей

ТипНазначение
SOAStart of Authority - метаданные зоны (serial, TTL'ы)
NSАвторитативные серверы зоны
Aимя → IPv4
AAAAимя → IPv6
CNAMEалиас на другое имя
PTRIP → имя (reverse)
MXmail-сервер для домена + 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 на лог 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-resolutionDNS resolutionРезолвинг имени → IP проходит через NSS: сначала `/etc/hosts`, потом DNS через `/etc/resolv.conf`. Порядок задаётся в `/etc/nsswitch.conf`.
  • systemd-resolvedsystemd-resolved - локальный DNS-stubsystemd-resolved - DNS stub-resolver, слушает на `127.0.0.53:53` и проксирует запросы на upstream-DNS, агрегируя данные от NetworkManager/DHCP/VPN. Управляется `resolvectl`.
  • fail2banfail2ban - автобан по логамfail2ban читает логи (sshd, nginx, postfix), регэкспом ловит N неудачных попыток за окно, добавляет IP в правила firewall'а на bantime. Главный инструмент против brute-force на SSH.
  • tls-certificatesTLS-сертификаты - X.509, цепочка доверия, Let's EncryptTLS cert - X.509 объект с public key + identity (CN/SAN) + подписью CA. Цепочка: leaf → intermediate → root (доверенный OS). Let's Encrypt = бесплатный CA через ACME (HTTP-01/DNS-01 challenge). В k8s - cert-manager.

§ упоминается в уроках

  • ›intermediate-12-bind-dns-server
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.