9

ローカル ポート宛ての UDP パケットをキャプチャしたいのですが、フィルタリング式は次のようになりudp port 20000ます。UDP パケットに IP フラグメンテーションがある場合、libpcap は最初の IP フラグメントしかキャプチャできないことに気付きました。その理由は、2 番目の IP フラグメントに UDP ヘッダーが含まれていないためだと思います (TCP でも同じだと思います) udp port 20000

これに対する回避策はありますか?または特定のローカルポート宛てのパケットをキャプチャできる他のライブラリはありますか?

ありがとう!

4

1 に答える 1

10

理由は、2 番目の IP フラグメントに UDP ヘッダーが含まれていないためだと思います (TCP の場合も同じだと思います)。そのため、libpcap はフィルター Express udp ポート 20000 を使用してそれらをキャプチャできません。

はい、そうです。

を試すと、ポート 20000の間のパケットと、最初のフラグメント以外の IP フラグメントudp port 20000 or (ip[6:2] & 0x1fff) != 0がキャプチャされます。これは理想的ではありませんが、libpcap フィルターが使用するフィルター メカニズム (OS カーネルの一部) がパケット間の履歴を維持しないため、libpcap フィルターでできることはこれだけです。特定の IP ID が、同じ IP ID、フラグメント オフセット 0、およびポート 20000 の UDP ヘッダーを持つ別のパケットと同じフラグメントの一部である場合。

(また、Linux の少なくとも一部のバージョンでは、IP データグラムのフラグメントをの順序で送信することに注意してください。これは、受信者が最初に最後のフラグメントを確認できるようにするためであり、再構築されたパケットのサイズをより頻繁に正確に推定できるようにするためです。 . これにより、TCP または UDP ヘッダーのフィールドをチェックするフィルターを使用して、IP パケットのすべてのフラグメントをキャプチャすることがさらに難しくなります。)

于 2013-11-07T12:18:12.637 に答える