Назад | Перейти на главную страницу

BIND, RPZ и приоритеты переадресации

Моя цель - заблокировать определенные домены в привязке БЕЗ первого поиска их адреса (это небольшой DNS-сервер для кеширования).

В настоящее время моя конфигурация перенаправляет запрос на badhost.com и получает IP-адрес (я вижу это в wirehark), а затем он перезапишет этот ответ с помощью NXDOMAIN.

bind.log:

client 192.168.1.1#46107 (badhost.com): rpz QNAME NXDOMAIN rewrite badhost.com via badhost.com.rpz

Но нет смысла получать IP-адрес, и это задерживает запрос. Я просто хочу, чтобы он быстро возвращал NXDOMAIN для заблокированных доменов без пересылки.

конфигурация:

options {
  response-policy { zone "rpz" policy nxdomain; };
  cleaning-interval 360;
  forward only;
  forwarders { x.x.x.x; y.y.y.y; };
  allow-recursion { any; };
  allow-query { any; };
  allow-query-cache { any; };

}

zone "rpz" {
  type master;
  file "/etc/bind/rpz.zone";
};
zone "0.0.127.in-addr.arpa" {
        type master;
    notify no;
        file "pz/127.0.0";
};
zone "1.168.192.in-addr.arpa" {
        type master;
        notify no;
        file "pz/192.168.1";
};
zone "lan" {
        type master;
        notify no;
        file "pz/lan";
};

rpz.zone

$TTL    604800
@       IN      SOA     ns1.example.local. info.example.local. (
                          2         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL

@       IN      NS      local.

$INCLUDE rpz.blacklist.db

rpz.blacklist.db

badhost.com CNAME .

Будут тысячи записей, поэтому я не хочу, чтобы зона указывала на один и тот же файл (0.0.0.0 или 127.0.0.1) для каждого из них.

Этого можно добиться с помощью qname-wait-recurse. Вот документация из BIND 9.10 ARM относительно использования этой функции:

Для триггера QNAME или Client-IP не требуются записи DNS. Достаточно самого имени или IP-адреса, поэтому, в принципе, рекурсивное разрешение имени запроса не требуется. Однако невыполнение разрешения запрошенного имени может привести к утечке того факта, что используется перезапись политики ответа и что имя указано в зоне политики для операторов серверов для перечисленных имен. Чтобы предотвратить эту утечку информации, по умолчанию любая рекурсия, необходимая для запроса, выполняется до рассмотрения каких-либо триггеров политики. Поскольку перечисленные домены часто имеют медленные авторитетные серверы, такое поведение по умолчанию может стоить много времени. В qname-wait-recurse нет опция отменяет это поведение по умолчанию, когда рекурсия не может изменить ответ, не связанный с ошибкой. Этот параметр не влияет на триггеры QNAME или client-IP в зонах политики, перечисленных после других зон, содержащих триггеры IP, NSIP и NSDNAME, поскольку они могут зависеть от записей A, AAAA и NS, которые будут обнаружены во время рекурсивного разрешения. Он также не влияет на запросы DNSSEC (DO = 1), если не используется break-dnssec yes, поскольку ответ будет зависеть от того, были ли найдены записи RRSIG во время разрешения. Использование этой опции может привести к тому, что ответы об ошибках, такие как SERVFAIL, будут казаться перезаписанными, поскольку рекурсия не выполняется для обнаружения проблем на полномочном сервере.

Синтаксис для включения этой функции немного неясен. Вместо того, чтобы помещать его в глобальный options {}; блок, он должен стоять перед конечной точкой с запятой в вашем response-policy {}; определение.

[ response-policy {
    zone zone_name
    [ policy (given | disabled | passthru | drop |
              nxdomain | nodata | cname domain) ]
    [ recursive-only yes_or_no ]
    [ max-policy-ttl number ]
    ; [...]
} [ recursive-only yes_or_no ]
  [ max-policy-ttl number ]
  [ break-dnssec yes_or_no ]
  [ min-ns-dots number ]
  [ qname-wait-recurse yes_or_no ]
  [ automatic-interface-scan yes_or_no ]
; ]

Перед:

response-policy { zone "rpz"; };

После:

response-policy { zone "rpz"; } qname-wait-recurse no;