我们有一个 RHEL 6.7 DNS 服务器,我们正在尝试丢弃包含某些域的数据包。例如,我们的一台 DNS 服务器参与了随机子域攻击,其中外部主机或其他 DNS 服务器向我们发送查询,然后我们的服务器针对特定主机名启动自己的递归查询。查询的每个主机名都是无效且随机的,并且不存在。从 tcpdump 中,这些查询之一如下所示。
123.123.123.123.54729 > 140.205.228.52.53: [bad udp cksum 0x3701 -> 0x0d53!] 37401 A? llij.x99moyu.net. (34)
在此示例中,我们的 DNS 服务器是 123.123.123.123 地址,并通过联系另一个 DNS 服务器来处理查找。我们正在运行旧版本的 BIND,它不支持 RRL 或递归客户端速率限制。我们尝试过使用 iptables 进行速率限制,但没有得到我们想要的结果。现在我们正在研究与 iptables 的字符串匹配,但到目前为止还没有成功。我似乎根本无法让它发挥作用。从我用谷歌搜索到的内容来看,这似乎相当简单。这是 iptables 的一条规则。
-A INPUT -p udp --dport 53 -m string --algo bm --string x99moyu.net. -j DROP
这是 iptables 命令的样子。
#iptables -L -vxn
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 STRING match "x99moyu.net." ALGO name bm TO 65535
此规则应丢弃它看到的通过 x99moyu.net 进入服务器的任何数据包。域存在(数据包中的任何位置)。但这是行不通的。该规则位于 INPUT 链的顶部,因此我知道它必须优先。我尝试将域末尾的句点去掉并在前面加上一个句点,但这也不起作用。我还尝试放置 --string x99moyu.net。在 --algo 之前,但这没有效果。我也尝试过 kmp 算法,但无济于事。
有没有人有 iptables 字符串模式匹配的经验可以帮助并告诉我我做错了什么?