我在我的 VPS 上运行一个小型 Pi-Hole DNS 服务器,并且启用了以下 iptables 规则来阻止 DNS ANY 放大攻击:
*raw
-A PREROUTING -p udp --dport 53 -m string --from 40 --algo bm --hex-string "|0000FF0001|" -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP
-A PREROUTING -p tcp --dport 53 -m string --from 52 --algo bm --hex-string "|0000FF0001|" -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP
COMMIT
(来源:https://freek.ws/2017/03/18/blocking-dns-amplification-attacks-using-iptables/)
这两条规则在 ipv4 上效果很好(几周来我一直受到持续攻击,但所有请求都被阻止了),但我刚刚意识到我没有与它们对应的 ipv6 规则,而且我不知道十六进制字符串是否兼容,或者偏移量是多少。我还没有在 ipv6 上成为攻击目标,但我宁愿提前做好准备 - 尤其是因为我的 ipv6 地址已经接收了几个端口扫描器。
阻止 DNS ANY 请求的 ipv6 等效规则是什么?
答案1
除参数值外,IPv6 的规则应该相同--from
。
由于 IPv6 中的 IP 和 UDP 标头较大(由于地址较长),因此 DNS 部分开始得较晚。
根据UDP 维基百科页面,DNS 部分偏移量为 48 字节,因此对于 UDP,您应该--from 48
在 iptables 规则中使用。
-A PREROUTING -p udp --dport 53 -m string --from 48 --algo bm --hex-string "|0000FF0001|" -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP
对于 TCP,您应该检查类似的偏移量,但我不确定是否适用相同的规则。TCP 中来回传输的数据包更多,但不是 DNS,例如 3 次握手序列不符合此规则,这意味着远程主机仍会建立连接,但无法通过它进行任何 DNS ANY 查询。