Red Hat Training

A Red Hat training course is available for RHEL 8

4.8. 在 BIND 中配置响应策略区以覆盖 DNS 记录

使用 DNS 块和过滤,管理员可以重写 DNS 响应来阻止对某些域或主机的访问。在 BIND 中,响应策略区域 (RPZ) 提供此功能。您可以为受阻条目配置不同的操作,如返回 NXDOMAIN 错误或不响应查询。

如果您的环境中有多个 DNS 服务器,请使用此流程在主服务器上配置 RPZ,稍后配置区传输以在您的次要服务器上提供 RPZ。

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. 编辑 /etc/named.conf 文件并进行以下更改:

    1. options 语句中添加 response-policy 定义:

      options {
          ...
      
          response-policy {
              zone "rpz.local";
          };
      
          ...
      }

      您可以在 response-policyzone 语句中为 RPZ 设置自定义名称。但是,在下一步中,您必须在区定义中使用相同的名称。

    2. 为您在上一步中设置的 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 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /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)

  4. 验证 /var/named/rpz.local 文件的语法:

    # named-checkzone rpz.local /var/named/rpz.local
    zone rpz.local/IN: loaded serial 2022070601
    OK
  5. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  1. 尝试解析 example.org 中的主机,该主机在 RPZ 中配置,以返回 NXDOMAIN 错误:

    # dig @localhost www.example.org
    ...
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286
    ...

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

  2. 尝试解析 example.net 域中的主机,该域在 RPZ 中配置以丢弃查询:

    # dig @localhost www.example.net
    ...
    ;; connection timed out; no servers could be reached
    ...