web-dev-qa-db-ja.com

tcpdumpがパケット全体をキャプチャしない

私は使っています

Sudo tcpdump -A -s0 -ien0 port 80 | grep schemas-Microsoft >> ~/Downloads/convert.txt

tcpdumpがキャプチャすることになっているときに、インターネットを介して送信されているMicrosoftスキーマのxmlをキャプチャするには:(例)

<xml>
 <sample>h</sample>
 <samp2>j</sample>
</xml>

キャプチャするだけです:

<xml>
<sample>h</sample
<sam

そして、ファイルのどこかでランダムに停止します。これは何が原因ですか?

7
DisplayName

Wiresharkのドキュメントのガイダンスでは、次のコマンドを使用してパケットのコンテンツ全体をキャプチャすることを推奨しています。

$ tcpdump -i <interface> -s 65535 -w <some-file>

tcpdumpのmanページを見ると、そこのガイダンスは-s0が同等であることを示唆しています:

-s

デフォルトの65535バイトではなく、各パケットからのsnaplenバイトのデータをスナーフします。制限されたスナップショットのために切り捨てられたパケットは、「[| proto]」で出力に示されます。ここで、protoは切り捨てが発生したプロトコルレベルの名前です。スナップショットを大きくすると、パケットの処理にかかる時間が長くなり、パケットバッファリングの量が減少することに注意してください。これにより、パケットが失われる可能性があります。 snaplenを、関心のあるプロトコル情報をキャプチャする最小の数に制限する必要があります。snaplenを0に設定すると、デフォルトの65535に設定され、最近の古いバージョンのtcpdumpとの下位互換性が維持されます。

主に、そのガイダンスの途中の文のために、一部のデータが失われているのではないかと思います。

スナップショットを大きくすると、パケットの処理にかかる時間が長くなり、パケットバッファリングの量が減少することに注意してください。これにより、パケットが失われる可能性があります。 snaplenは、関心のあるプロトコル情報をキャプチャする最小数に制限する必要があります。

これを行う方法を検索したところ、 他の人が示唆している 次のようなコマンドラインに気づきました。

$ tcpdump -nnXSs 0 'port 80'
  • "-nn"を指定すると、DNSでのホスト名と(/etc/servicesでの)サービス名を検索せずに、それぞれより高速でクリーンな出力が得られます。
  • "-X"は、各パケットを16進数およびASCIIで出力します。これは実際にヘッダーなどを追跡するのに便利なビットです
  • "-S"は、相対ではなく絶対を出力しますTCPシーケンス番号-私が正しく覚えている場合、これは、これを行う複数のユーザーからのtcpdump出力を一度に比較できるようにするためです。
  • "-s 0"デフォルトでは、tcpdumpは各パケットの先頭のみをキャプチャします。ここで0を使用すると、パケット全体がキャプチャされます。

-nnを追加してパフォーマンスが向上するかどうかを確認し、バッファリングされるデータを減らし、データのドロップを防ぐことができればと考えています。他のスイッチが役立つ場合がありますが、状況に応じてどのように役立つかは明確ではありません。

参考文献

8
slm