4.8. 在 BIND 中配置响应策略区以覆盖 DNS 记录
使用 DNS 块和过滤,管理员可以重写 DNS 响应来阻止对某些域或主机的访问。在 BIND 中,响应策略区域 (RPZ) 提供此功能。您可以为受阻条目配置不同的操作,如返回 NXDOMAIN
错误或不响应查询。
如果您的环境中有多个 DNS 服务器,请使用此流程在主服务器上配置 RPZ,稍后配置区传输以在您的次要服务器上提供 RPZ。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named
或named-chroot
服务正在运行。
流程
编辑
/etc/named.conf
文件并进行以下更改:在
options
语句中添加response-policy
定义:options { ... response-policy { zone "rpz.local"; }; ... }
您可以在
response-policy
的zone
语句中为 RPZ 设置自定义名称。但是,在下一步中,您必须在区定义中使用相同的名称。为您在上一步中设置的 RPZ 添加
zone
定义:zone "rpz.local" { type master; file "rpz.local"; allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; }; allow-transfer { none; }; };
这些设置状态:
-
此服务器是名为
rpz.local
的 RPZ 的主服务器 (type master
)。 -
/var/named/rpz.local
文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在options
语句中的目录中创建的directory
相对。 -
allow-query
中定义的任何主机都可以查询此 RPZ。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。 - 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
-
此服务器是名为
验证
/etc/named.conf
文件的语法:# named-checkconf
如果命令没有显示输出,则语法为正确的。
使用以下内容创建
/var/named/rpz.local
文件,例如:$TTL 10m @ IN SOA ns1.example.com. hostmaster.example.com. ( 2022070601 ; serial number 1h ; refresh period 1m ; retry period 3d ; expire time 1m ) ; minimum TTL IN NS ns1.example.com. example.org IN CNAME . *.example.org IN CNAME . example.net IN CNAME rpz-drop. *.example.net IN CNAME rpz-drop.
这个区域文件:
-
将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用
h
指定小时),BIND 会将该值解析为秒。 - 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
-
将
ns1.example.com
设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS
) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。 -
将查询的
NXDOMAIN
错误返回给该域中的example.org
和主机。 -
将查询丢弃至此域中的
example.net
和主机。
有关操作和示例的完整列表,请参阅 IETF 草案:DNS 响应策略区域(RPZ)。
-
将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用
验证
/var/named/rpz.local
文件的语法:# named-checkzone rpz.local /var/named/rpz.local zone rpz.local/IN: loaded serial 2022070601 OK
重新载入 BIND:
# systemctl reload named
如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot
命令来重新加载该服务。
验证
尝试解析
example.org
中的主机,该主机在 RPZ 中配置,以返回NXDOMAIN
错误:# dig @localhost www.example.org ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286 ...
本例假定 BIND 在同一主机上运行并响应
localhost
接口上的查询。尝试解析
example.net
域中的主机,该域在 RPZ 中配置以丢弃查询:# dig @localhost www.example.net ... ;; connection timed out; no servers could be reached ...