这是我正在遵循的规则:
iptables -A QUERY -p udp -m length --length 24:63 -m udp -m string --algo bm --hex-string '|ffffffff|' --from 12 --to 28 -j QUERYLIMIT
有没有办法只检查 UDP 有效负载而不是处理整个报头?该规则的问题在于报头大小可能会发生变化。
我知道 -m u32......这是处理它的唯一方法吗?
答案1
根据iptables
手册页,我认为-m u32
如果您想使用纯 iptables,这确实是您的最佳选择。您要匹配的内容是否位于有效负载中的某个特定位置,或者您真的需要仅限有效负载的版本-m string
?
如果你有编程能力,你也可以看看QUEUE
目标,它将数据包传递给用户空间守护进程进行过滤。这里是使用 Perl 验证 DNS 数据包的 QUEUE 表示例。请注意,这不会很快,特别是如果您使用 Perl 或其他脚本语言。如果您想使用 C,要查看的库是libnetfilter_queue。
我还注意到,您当前的规则从第 12 个字节开始,该字节用于检查 IP 标头中的源地址和目标地址。我不知道这是否正确,但如果您用仅有效负载规则替换该规则,则需要记住这一点。