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
ファイアウォールの背後にあります。
私はこのホストから別のホストにpingを試みながら4つのテストを実行しました。
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
2 つの条件を同時に満たす必要がある場合は、次の条件を構成する必要があります。
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
-t
このオプションは発信パケットに対してのみTTLを設定するため、リモートホストのping応答に大きなTTLがある可能性が非常に高いです。現在、共通の基本TTLは64です。 (おすすめはインターネット幅の2倍だと思います。)
もう1つの可能性は、10000バイトのpingを断片化する必要があるため、リモートホストがそれに対する応答を拒否することです。 800バイトのpingを送ってください。
また、これにより、ルールsudo iptables -L -v
が何回ヒットされたかがわかります。これはデバッグに便利です。
別のデバッグオプションは、次の規則を実装することです。
sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG
DROPルールの移行。これにより、パケットを破棄する前に、カーネルログ(読み取りを使用dmesg
)にパケットが書き込まれます。これにより、欠落している部分を解決できます。