我正在为自己的域运行自己的权威 DNS 服务器,并且一直在处理使用 ANY 查询类型的 DNS 放大攻击问题。考虑到世界不应该对我的服务器进行任何查询,我想过滤掉这种情况。
但是:BIND 没有这样的机制。(为此,我在 Windows 上的多用途服务器上运行 BIND - 查询量不需要经过微调的操作系统)
我现在已设置以下内容来解决这个问题:在虚拟机中本地安装 Linux,以便能够访问 iptables(这似乎是唯一能够过滤任何数据包中的字符串的东西),使用与主机服务器位于同一子网中的桥接 eth0 接口运行 debian(控制台)。
我的问题:如何使用 iptables 设置这个 Linux,以通过字符串(“*”)过滤传入的 UDP 数据包,并将允许的数据包重定向到主机服务器的 ip 地址?
或者,是否存在(Windows server 2003)本机 Windows 解决方案来实现这一点?(人们可以希望......)
提前致谢!
标记。
编辑:任何记录都是对“*”的请求,这会不会太笼统了?
答案1
据称,你问这个问题的原因是你不想DNS 放大攻击使用您的基础设施。
在撰写本文时,不同的 DNS 相关邮件列表和新闻组实际上已经讨论了使用 netfilter/iptables 的方法。这里的共识主要是,完全禁用某些查询类型并不是预防 DNS 放大攻击的好方法。通常,禁用公共客户端的递归就足够了,这一直是自 BIND 9.4.1-P1 以来的默认 BIND 配置。
如果你无法禁用递归,则Stephane Bortzmeier 提出的可能解决方案正在使用 Python 脚本构建 Netfilter 规则,该规则随后可用于对特定 DNS 标签的某些类型的查询进行速率限制:
您也可以在名称服务器之外执行此操作。例如,在 Linux 上,如果 QNAME 是固定的,假设为“bad.example”:
1)获取 http://www.bortzmeyer.org/files/generate-netfilter-u32-dns-rule.py
2)使用适当的选项运行它:
rule=$(python generate-netfilter-u32-dns-rule.py --qname bad.example --qtype ANY)
3)在 Netfilter 规则中使用输出:
iptables -A INPUT -p udp --dport 53 --match u32 --u32 "$rule" -j RATELIMITER
4)速率限制:
iptables -A RATELIMITER -m hashlimit \
--hashlimit-name DNS --hashlimit-above 20/second --hashlimit-mode srcip \
--hashlimit-burst 100 --hashlimit-srcmask 28 -j DROP
答案2
我使用以下规则来删除最常见的 DNS 放大攻击查询:
# isc.org
iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo bm --hex-string '|697363036f7267|' -j DROP
# NS? .
iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo bm --hex-string '|010000010000000000000000020001|' -j DROP
# ripe.net
iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo bm --hex-string '|0472697065036e6574|' -j DROP