我的目标是阻止某些域的绑定,而不先查找他们的地址(这是一个小型caching绑定DNS服务器)。
目前我的configuration将转发badhost.com的请求并获取IP地址(我可以在wireshark中看到这一点),然后用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 { xxxx; yyyy; }; 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关于此function使用的文档:
QNAME或Client-IP触发器不需要DNSlogging。 名称或IP地址本身就足够了,所以原则上查询名称不需要recursionparsing。 但是,如果不parsing请求的名称,可能会泄漏响应策略重写正在使用的事实,并且该名称在策略域中列出给服务器的运营商以列出名称。 为了防止信息泄漏,默认情况下,在考虑任何策略触发之前,请求所需的任何recursion都已完成。 由于列出的域通常具有较慢的权威服务器,因此此默认行为可能会花费大量时间。 当recursion无法更改非错误响应时, qname-wait-recurse no选项将覆盖该默认行为。 该选项不会影响在包含IP,NSIP和NSDNAME触发器的其他区域之后列出的策略区域中的QNAME或客户端IP触发器,因为这些触发器可能取决于在recursionparsing过程中find的A,AAAA和NSlogging。 它也不会影响DNSSEC请求(DO = 1),除非break-dnssec yes正在使用,因为响应取决于在parsing期间是否findRRSIGlogging。 使用此选项可能会导致错误响应,如SERVFAIL似乎被重写,因为没有recursion正在发现授权服务器上的问题。
启用此function的语法有点模糊。 而不是把它放在全局options {}; 块,它需要出现在response-policy {};的尾部分号之前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;