使用iptables
Linux 主機上的實用程式需要建立迷你防火牆。我需要刪除所有套件長度大於 722 且 TTL 大於 22 的傳入連線。僅當兩個條件都為 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
)。然後您就可以計算出丟失了什麼。