iptables 删除长度和 TTL 条件不起作用

iptables 删除长度和 TTL 条件不起作用

使用iptablesLinux 主机上的实用程序需要创建迷你防火墙。我需要删除包长度大于 722 并且 TTL 大于 22 的所有传入连接。需要恰好 AND。仅当两个条件都为 TRUE 时才删除。

sudo iptables -N LOGDROP
sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A INPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A LOGDROP -m length --length 722:65535 -j DROP

主机的IP地址10.6.7.9带有防火墙。

我从这台主机做了 4 次测试,尝试 ping 另一台主机:

ping -s 10000 -t 250 10.6.7.10 //fail (TTL AND LENGHT are wrong)
ping -s 100 -t 200 10.6.7.10 //success (TTL is wrong)
ping -s 10 -t 10 10.6.7.10 //success (Both are right)
ping -s 10000 -t 10 10.6.7.10 // fail, BUT SHOULD BE TRUE.

为什么最后一次 ping 不起作用,如何解决?

答案1

如果两个条件必须同时成立,则应构造如下条件:

sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP

sudo iptables -A INPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP

答案2

很有可能来自远程主机的 ping 回复具有较大的 TTL,因为该-t选项仅设置传出数据包的 TTL。目前常见的默认 TTL 是 64。(我相信建议是互联网宽度的两倍。)

另一种可能性是,由于 10000 字节 ping 必须分段,远程主机拒绝回复它。尝试发送 800 字节 ping。

另外,如果您这样做,sudo iptables -L -v它会告诉您该规则已命中多少次。这对于调试很有用。

另一个调试选项是执行如下规则:

sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG

在 DROP 规则之前。这将在丢弃数据包之前将其记录到内核日志中(使用 读取dmesg)。然后您就可以计算出丢失了什么。

相关内容