我的 iptables 中有这条规则来阻止以以下内容结尾的域名.watch
:
sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp
但问题是.
无法匹配。所以上面的行不匹配任何内容。但如果我从中删除点,.watch
它就watch
可以正常工作。
我怎样才能阻止 iptables 规则中的点“。”?
答案1
从语法上看,这似乎是正确的,但你的方法并不适合这个目的。字符串补丁匹配数据包中任意位置的字符串:
- 您正在丢弃任何包含
watch
或.watch
包含的数据包。这可能会导致误报,甚至会引入新的拒绝服务攻击载体。 - 它无法处理加密流量。它无法阻止大多数网络流量。
- 尽管对于匹配算法(
bm
Boyer–Moore 和kmp
Knuth–Pratt–Morris)有相对较好的选择,但使用字符串过滤器仍然需要大量计算。
文档也明确警告了这一点:
请谨慎使用此匹配。很多人想使用此匹配以及 DROP 目标来阻止蠕虫。这是一个重大错误。任何 IDS 规避方法都会击败它。
类似地,许多人一直使用这种匹配作为停止 HTTP 中的特定功能(如 POST 或 GET)的手段,方法是丢弃任何包含字符串 POST 的 HTTP 数据包。请理解,这项工作最好由过滤代理来完成。此外,使用前一种方法,任何带有单词 POST 的 HTML 内容都将被丢弃。这种匹配旨在能够将用户空间感兴趣的数据包排队以便进行更好的分析,仅此而已。基于此丢弃数据包将被任何 IDS 规避方法击败。
对于您要实现的目标,有更好的选择:
- 基于 DNS 的过滤。任何 DNS 服务器都可以做到这一点。例如,域名管理系统是一种常见的轻量级 DNS 转发器:您只需添加
address=/watch/0.0.0.0
到其配置中即可。 - 基于 Web 代理的过滤。
答案2
DNS 名称被编码为长度前缀标签(参见rfc1035 文档详细信息请参见 ,因此您需要使用--hex-string "|05|watch|00|"
来匹配以 结尾的名称.watch
(请注意,长度写为 2 个十六进制数字,例如,serverfault.com
将编码为)。请注意,这应该与and"|0b|serverfault|03|com|00|"
结合使用(如果匹配地址,则为 5353 ),否则可能会匹配大量其他不相关的数据包。-p udp
--destination-port 53
.local
DNS 查询也可以通过 TCP 进行,但过滤 TCP 更加复杂,并且有关加密请求的现有评论以及有关使用 DNS 和/或 Web 代理的应用程序级过滤的建议仍然适用。