使用iptables
Linux 主机上的实用程序需要创建迷你防火墙。我需要删除包长度大于 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
)。然后您就可以计算出丢失了什么。