BIND、RPZ 和转发优先级

Jon*_*n T 6 domain-name-system bind internal-dns rpz

我的目标是在不首先查找它们的地址的情况下阻止绑定中的某些域(这是一个小型缓存绑定 dns 服务器)。

目前,我的配置将转发对 badhost.com 的请求并获取 IP 地址(我可以在 wireshark 中看到这一点),然后它将用 NXDOMAIN 覆盖该响应。

绑定日志:

client 192.168.1.1#46107 (badhost.com): rpz QNAME NXDOMAIN rewrite badhost.com via badhost.com.rpz
Run Code Online (Sandbox Code Playgroud)

但是获取 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";
};
Run Code Online (Sandbox Code Playgroud)

区域

$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
Run Code Online (Sandbox Code Playgroud)

黑名单数据库

badhost.com CNAME .
Run Code Online (Sandbox Code Playgroud)

将有数千个条目,因此我不希望每个区域都指向同一个文件(0.0.0.0 或 127.0.0.1)。

And*_*w B 5

这可以通过qname-wait-recurse. 以下是BIND 9.10 ARM 中有关此功能使用的文档:

QNAME 或 Client-IP 触发器不需要 DNS 记录。名称或IP地址本身就足够了,因此原则上不需要递归解析查询名称。但是,不解析所请求的名称可能会将响应策略重写正在使用中以及名称列在策略区域中的事实泄露给列出名称的服务器操作员。为了防止信息泄露,默认情况下,请求所需的任何递归都在考虑任何策略触发器之前完成。由于列出的域通常具有较慢的权威服务器,因此这种默认行为可能会花费大量时间。该qname的-WAIT-没有递归当递归无法更改非错误响应时,选项会覆盖该默认行为。该选项不会影响在包含 IP、NSIP 和 NSDNAME 触发器的其他区域之后列出的策略区域中的 QNAME 或客户端 IP 触发器,因为这些可能取决于在递归解析期间将找到的 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 ]
; ]
Run Code Online (Sandbox Code Playgroud)

前:

response-policy { zone "rpz"; };
Run Code Online (Sandbox Code Playgroud)

后:

response-policy { zone "rpz"; } qname-wait-recurse no;
Run Code Online (Sandbox Code Playgroud)