ZIM-НИЙ SAAALEЗимние скидки: до −50% на старт и −20% на продление
до 31.01.2026 Подробнее
Выберите продукт

BIND9 RPZ: DNS firewall и allowlist на практике

Пошагово включаем Response Policy Zone (RPZ) в BIND9 и превращаем рекурсивный резолвер в DNS firewall. Разбираем denylist/allowlist с исключениями, порядок policy zones, примеры named.conf, логирование, проверку dig и типовые ошибки.
BIND9 RPZ: DNS firewall и allowlist на практике

RPZ (Response Policy Zone) в BIND9 — механизм переписывания ответа рекурсивного резолвера по набору правил. На практике это «DNS firewall»: вы централизованно блокируете вредоносные домены, трекеры, фишинговые зоны и шумные эндпойнты, а также строите allowlist (разрешённое в приоритете), чтобы не ломать критичные сервисы.

Ниже — рабочий, эксплуатационный подход: включение RPZ в BIND9, структура policy zones, типы действий, allowlist-исключения, порядок срабатывания, минимально достаточное логирование и методика отладки. Формат намеренно «сделал → проверил → посмотрел логи».

Что такое BIND9 RPZ и чем он отличается от обычной зоны

Классическая authoritative-зона отвечает «как владелец домена». RPZ применяется на стороне рекурсивного резолвера (recursive resolver) и может переписать ответ до того, как он уйдёт клиенту. То есть вы не меняете внешний DNS домена — вы меняете то, что увидят пользователи/сервера при резолвинге через ваш BIND.

Чем RPZ полезен в эксплуатации:

  • работает на уровне доменных имён и некоторых атрибутов ответа (включая триггеры по IP в A/AAAA через отдельные механизмы RPZ);
  • поддерживает разные действия: NXDOMAIN/NODATA, CNAME на «заглушку», PASSTHRU (разрешить);
  • позволяет разруливать конфликты «denylist vs allowlist» приоритетом и порядком policy zones;
  • не требует агентского ПО: достаточно перевести клиентов на ваш резолвер.

Когда RPZ — хороший выбор (и где осторожнее)

Типовые кейсы, где RPZ даёт быстрый эффект:

  • Офис/команда/прод: запрет фишинга и малвари на уровне инфраструктуры.
  • Серверные сегменты: усиление egress-control через контроль DNS, особенно в контейнерных и CI средах.
  • Снижение шума: блокировка доменов телеметрии/рекламы, если это не конфликтует с политиками компании.
  • Инциденты: быстрое «отрубание» домена IOC на время расследования.

RPZ не поможет, если приложение обращается по hardcoded IP или использует DoH/DoT в обход вашего резолвера. В таких сценариях нужен сетевой контроль egress и политика на рабочих станциях/шлюзах.

Где нужна аккуратность: SaaS с динамическими доменами (цепочки CNAME), приложения с pinned endpoints, интеграции «сломался один домен — упал бизнес-процесс». Здесь обязательно планируйте allowlist и наблюдаемость (логи + метрики), а изменения катите через тестовый контур.

Схема: рекурсивный DNS-резолвер BIND9 и две RPZ-зоны — allowlist и denylist

Архитектура: как обычно строят DNS firewall на BIND9

Практичная схема выглядит так:

  • BIND9 работает как рекурсивный резолвер для внутренних клиентов (сети, VPN, VPC).
  • RPZ подключается в options через response-policy и список policy zones.
  • Обычно используют как минимум две зоны: deny (блокировки) и allow (исключения/разрешения). Иногда добавляют отдельную зону для «redirect на заглушку».
  • Обновление списков: локальные файлы, master/slave, либо генерация из фидов (под ваши правила комплаенса) с проверками и откатом.

Если вы выбираете, на чём поднимать резолвер, ориентируйтесь на изоляцию и предсказуемость ресурса. Для продового резолвера чаще удобнее отдельная виртуальная машина: так проще держать одинаковую конфигурацию, обновления и логи.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Базовая конфигурация: включаем RPZ в named.conf

Ниже — минимальный пример с двумя policy zones: rpz-allow и rpz-deny. Allowlist указан первым: если домен присутствует и там, и там — разрешение победит. Это самая удобная модель эксплуатации, потому что исключения всегда «сильнее» блокировок.

options {
  recursion yes;
  allow-recursion { 10.0.0.0/8; 192.168.0.0/16; 127.0.0.1; };
  listen-on { 127.0.0.1; 10.0.0.10; };

  response-policy {
    zone "rpz-allow";
    zone "rpz-deny";
  };
};

zone "rpz-allow" {
  type master;
  file "/etc/bind/rpz/rpz-allow.db";
  allow-query { none; };
};

zone "rpz-deny" {
  type master;
  file "/etc/bind/rpz/rpz-deny.db";
  allow-query { none; };
};

Комментарии к важным местам:

  • response-policy — список policy zones. Порядок важен и определяет приоритет при конфликте.
  • allow-query { none; } — чтобы RPZ-зону нельзя было «снять» как обычную зону запросом извне.
  • Ограничивайте рекурсию через allow-recursion (и дополнительно на фаерволе), иначе есть риск получить открытый резолвер.

Если вы мигрируете с другого DNS-стека или сравниваете подходы, полезно держать под рукой обзор различий по возможностям и эксплуатации: сравнение PowerDNS и BIND для инфраструктурных задач.

Файл RPZ-зоны: что внутри и как устроены правила

RPZ-зона по формату похожа на обычную DNS-зону, но имена в ней — это «триггеры политики». В простейшем варианте блокируем домен и поддомены CNAME-правилом.

Пример deny-zone:

$TTL 60
@   IN SOA localhost. root.localhost. (
        2026011001 ; serial
        1H         ; refresh
        15M        ; retry
        7D         ; expire
        1H )       ; minimum
    IN NS localhost.

; Блокировка домена целиком и всех поддоменов
bad.example.              CNAME .
*.bad.example.            CNAME .

; Точечная блокировка конкретного поддомена
ads.goodservice.example.  CNAME .

Что означает CNAME . в контексте RPZ: это «policy action» (синтетический ответ, который по смыслу эквивалентен блокировке). В эксплуатации такой шаблон часто используют как «жёсткий стоп» на имя.

Если вам важно, чтобы пользователь видел понятное объяснение в браузере, вместо «глухой» блокировки можно сделать редирект на walled garden (CNAME на домен заглушки), а заглушка отдаст страницу с текстом и контактами. Для сервисов/агентов это обычно хуже (лишний шум), а для пользовательских сегментов иногда удобнее.

Allowlist в RPZ: как делать исключения правильно

Allowlist обычно нужен в двух случаях: (1) denylist слишком широкий и задевает нужные домены; (2) у вас есть зоны, которые нельзя блокировать ни при каких условиях (например, критичная интеграция).

Пример allow-zone: «пропусти как есть» через CNAME на rpz-passthru.

$TTL 60
@   IN SOA localhost. root.localhost. (
        2026011001 ; serial
        1H
        15M
        7D
        1H )
    IN NS localhost.

; Разрешаем домен и поддомены (исключение)
important.example.        CNAME rpz-passthru.
*.important.example.      CNAME rpz-passthru.

; Разрешаем конкретный поддомен, даже если весь домен в deny
api.vendor.example.       CNAME rpz-passthru.

Ключевая идея: allowlist — отдельная policy zone, которая стоит раньше deny. Тогда вы не превращаете deny-файл в «кашу исключений», которую невозможно сопровождать.

Хорошее правило процесса: исключения добавляются только в allow-zone, а deny-zone генерируется автоматически из источников. Так вы снижаете риск ручных правок в проде и упрощаете откат.

Приоритеты policy zones: что делать при конфликте правил

Конфликты возникают, когда одно имя совпало с правилами в нескольких зонах. Самая практичная модель приоритетов:

  • Сначала allowlist (PASSTHRU), затем deny/redirect.
  • В deny-zone держите только блокировки/редиректы, без исключений.
  • Если нужно несколько deny-политик (например, «строгая» и «мягкая»), разделяйте на разные зоны и задавайте порядок в response-policy.

Настройки, которые часто забывают в проде

Чтобы RPZ работал предсказуемо, обычно дополнительно фиксируют:

  • Контроль клиентов: кроме allow-recursion используйте allow-query-cache, ACL и входной сетевой firewall.
  • TTL для RPZ: часто держат 60–300 секунд, чтобы быстро чинить ложные срабатывания, но не устраивать постоянный churn.
  • Серийник и перезагрузка: при правках зоны повышайте serial и делайте reload конкретной зоны, а не всей службы.

Команды контроля (универсальный набор):

named-checkconf
named-checkzone rpz-deny /etc/bind/rpz/rpz-deny.db
named-checkzone rpz-allow /etc/bind/rpz/rpz-allow.db
rndc reload rpz-deny
rndc reload rpz-allow
rndc status

Если у вас сложная DNS-архитектура (внутренние/внешние зоны, разные ответы в зависимости от сети), RPZ часто комбинируют с views. См. практический разбор: split-horizon и views в BIND.

DNS logging: как логировать RPZ и не утонуть в логах

DNS-запросы очень шумные, поэтому «логировать всё» почти всегда означает гигабайты в сутки и потерю смысла. Для RPZ полезнее логировать именно срабатывания политики и немного контекста.

Пример конфигурации логирования (пути адаптируйте под вашу систему):

logging {
  channel rpz_log {
    file "/var/log/named/rpz.log" versions 10 size 50m;
    severity info;
    print-time yes;
    print-severity yes;
    print-category yes;
  };

  channel queries_log {
    file "/var/log/named/queries.log" versions 5 size 100m;
    severity info;
    print-time yes;
    print-category yes;
  };

  category rpz { rpz_log; };
  category queries { queries_log; };
};

Практика такая:

  • на постоянке держите category rpz (срабатывания политики) и ограниченную ротацией глубину;
  • category queries включайте на время расследования, либо на отдельном резолвере, если у вас пул.

Для расследований важнее корреляция (время, клиент, имя, действие), чем полный дамп всех DNS-запросов.

Проверка: как убедиться, что RPZ реально срабатывает

После включения проверьте по шагам:

  1. резолвер доступен клиенту и реально рекурсирует;
  2. домен из deny-zone отдаёт ожидаемый результат (блок/редирект);
  3. домен из allow-zone действительно «пробивает» блокировку;
  4. в логе RPZ появляются записи о срабатывании.

Типовые команды диагностики:

dig @127.0.0.1 bad.example A
dig @127.0.0.1 api.vendor.example A
dig @127.0.0.1 ads.goodservice.example A
rndc querylog
rndc querylog

rndc querylog — переключатель: включили, собрали нужные события, выключили, чтобы не оставить вечный шум.

Типовые ошибки при внедрении RPZ

1) Открытый резолвер из-за неверных ACL

Если включили рекурсию и не ограничили клиентов, резолвер может стать публичным. Обязательно используйте ACL на allow-recursion и/или allow-query-cache и дублируйте ограничения сетевым firewall на вход.

2) Allowlist «не работает» из-за порядка policy zones

Проверьте порядок в response-policy: allow-zone должна идти раньше deny-zone. Если несколько deny-зон, зафиксируйте соглашение по порядку и не нарушайте его.

3) «Ломаем CDN» из-за слишком широких правил

Блокировать базовый домен провайдера (особенно CDN/антибот) часто означает блокировать десятки легитимных сервисов. Вводите стадию тестирования: сначала наблюдение (логирование + отчёт), потом включение блокировок.

4) Нет процесса обновления и отката

RPZ — это контент, а контент ломается. Храните зоны в Git, делайте генерацию с проверками (named-checkzone), применяйте атомарно и держите быстрый rollback (предыдущий файл + reload конкретной зоны).

Проверка RPZ: запросы dig и записи о срабатывании политики в логах BIND

Практика эксплуатации: как вести deny/allow списки без боли

Правила, которые хорошо работают в командах DevOps:

  • Разделяйте источники: deny — только генерация, allow — ручной список исключений (и тоже под контролем версий).
  • Короткий TTL для RPZ (60–300 секунд), чтобы быстро чинить ложные срабатывания.
  • Единый формат: если хотите блокировать «всё дерево», добавляйте и apex, и wildcard (example.tld. и *.example.tld.).
  • Минимальная наблюдаемость: отдельный лог для RPZ, ротация, быстрый поиск по домену и времени.
  • Плейбук инцидента: добавить в allow → reload → проверить → оформить постоянное исключение или исправить источник deny.

Если вы публикуете сервисы наружу и вам важна доверенная цепочка резолвинга и соответствие требованиям безопасности, отдельно продумайте политику DNSSEC и управление ключами. В такой схеме часто появляется потребность в управляемых SSL-сертификатах для внутренних админок/порталов и сервисов мониторинга, чтобы не плодить самоподписанные сертификаты.

FastFox SSL
Надежные SSL-сертификаты
Мы предлагаем широкий спектр SSL-сертификатов от GlobalSign по самым низким ценам. Поможем с покупкой и установкой SSL бесплатно!

Заключение

BIND9 с Response Policy Zone — один из самых практичных способов собрать управляемый DNS firewall в своей инфраструктуре: предсказуемые политики, быстрые исключения через allowlist и нормальная эксплуатация при условии, что вы продумали порядок policy zones, ограничения рекурсии и dns logging.

Следующий логичный шаг: автоматизация генерации зон из нескольких источников, тестовый резолвер для «сухого прогона» и отчётность по срабатываниям (сколько блоков, какие домены, какие клиенты).

Поделиться статьей

Вам будет интересно

PostgreSQL pg_hba.conf: настройка аутентификации и разбор типовых ошибок OpenAI Статья написана AI (GPT 5)

PostgreSQL pg_hba.conf: настройка аутентификации и разбор типовых ошибок

Разбираем pg_hba.conf в PostgreSQL: как читаются правила сверху вниз, чем отличаются peer, md5 и scram-sha-256, как безопасно откр ...
Postfix + Dovecot: как разбирать ошибки 552 и 554 и настраивать лимиты без боли OpenAI Статья написана AI (GPT 5)

Postfix + Dovecot: как разбирать ошибки 552 и 554 и настраивать лимиты без боли

Ошибки 552 и 554 в связке Postfix+Dovecot почти всегда связаны с лимитами или политиками: размер письма, квоты, число соединений, ...
UUID и PARTUUID в Linux: fstab, initramfs и systemd mount units без сюрпризов OpenAI Статья написана AI (GPT 5)

UUID и PARTUUID в Linux: fstab, initramfs и systemd mount units без сюрпризов

Показываю на практике разницу UUID и PARTUUID и как это влияет на загрузку Linux. Разберём правильные записи в /etc/fstab, когда н ...