Linux ホストのユーティリティを使用して、iptables
ミニ ファイアウォールを作成する必要があります。パッケージ長が 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
このオプションは送信パケットの TTL のみを設定するため、リモート ホストからの ping 応答の TTL が大きい可能性が高くなります-t
。最近の一般的なデフォルトの 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
) に記録されます。その後、何がドロップされたかを確認できます。