将 BIND9 设置为 DNS 防火墙

bel*_*zar 6 domain-name-system bind dns-firewall rpz

由于 OpenDNS 现在需要一个在 pro 包中才能打开过滤功能,预算紧张,我们需要免费的 DNS 过滤。

阅读有关如何使用 bind 阻止域的链接后,我将 SquidGuard 黑名单和我需要的类别中的连接域收集到一个大列表中。然后我将它输入到这个 python 脚本中,生成一个包含大约 200 万个区域的文件。

named-checkconf 可以很好地解析它,但是重新加载 named 需要将近 10 分钟,然后它不会解决任何问题,并且服务器会减慢速度以进行爬行。删除包含导致命名再次正常工作。

将 BIND9 设置为有效地用作 DNS 防火墙的正确方法是什么?如果还可以阻止任何解析为可以解决整个问题的特定 IP 地址的域。

我以非权威身份运行绑定,只是一个缓存服务器。

And*_*w B 7

这对于当前的技术来说已经过时了。在 BIND 世界中,响应策略区 (RPZ) 是当今 DNS 防火墙的同义词。

RPZ 区域是一个普通的 DNS 区域,但用于定义服务器的策略操作。区域“后缀”无关紧要,因为这不是真正的 DNS 域。它只是一个包含特殊格式指令列表的区域文件。

options {
          ...
          response-policy { zone "whatever.anytld";} };
};
Run Code Online (Sandbox Code Playgroud)

记录的左侧定义匹配规则,记录类型和右侧定义要采取的操作。请注意以下示例的左侧没有尾随点。

$ORIGIN whatever.anytld.

; destination IP rewrite
baddomain1.example.com       A     198.51.100.1
*.baddomain1.example.com     A     198.51.100.1

; send them to an existing A record
baddomain2.example.com       CNAME mywebserver.example.org.
*.baddoman2.example.com      CNAME mywebserver.example.org.

; NXDOMAIN it
baddomain3.example.com       CNAME .
*.baddomain3.example.com     CNAME .

; reply with NODATA
baddomain4.example.com       CNAME *.
*.baddomain4.example.com     CNAME *.
Run Code Online (Sandbox Code Playgroud)

等等。您可以对此做很多事情,包括可能影响无辜共享托管站点的更严厉的措施:按名称阻止名称服务器,按 IP 阻止名称服务器,对返回记录的 IP 地址而不是名称执行操作等。

RPZ 会做很多事情,这并不意味着作为详尽的文档。推荐阅读包括适用于您的 BIND 版本的 BIND ARM 的第 6 章(本答案底部),以及在线 Zytrax 书籍的第 9 章

为了节省您的时间,我根据我的个人经验 Cliff 笔记:

  • 使用区域转移来移动您的 RPZ 区域IXFRixfr-from-differences在您的主人上启用以促进这一点。如果使用 BIND 9.9 或更高版本来防止基于通知的 DoS 尝试,请使用基于密钥的区域传输。
  • 只让管理 IP 查询 RPZ 区域。
  • 除非您正在运行 BIND 9.10,否则不要使用多个 RPZ 文件。在该版本之前,多个区域存在性能问题。
  • RPZ 不能用于阻止NS2014 年流行的基于记录的攻击,因为默认情况下 RPZ 旨在尝试权威查找,而不是将您的记录劫持“背叛”到上游名称服务器源。
    • qname-wait-recurse no是在 BIND 9.10 中添加的,并且可能允许您为此目的使用 RPZ。我一直想试验一下。
    • 即使qname-wait-recurse no有效,仍然需要一种无需额外配置即可用于离线攻击域的记录类型。我已经与 Paul Vixie 讨论过这个问题,我们可能会在 RPZ 格式规范的未来版本中看到它。
  • NXDOMAINNODATA操作将AUTHORITY在回复部分泄露您的 RPZ 区域的名称。假设人们会知道它的名字。

BIND ARM 第 6 章链接: