0

私が現在テストしているシステムでは、EthヘッダーとIPヘッダーの間に独自のL2.5ヘッダーを追加するために、いくつかの仮想L2デバイスがチェーンされています。今私が使うとき

tcpdump -xx -i vir_device_1

、実際にはIPヘッダー付きのSLLヘッダーが表示されます。vir_device_1から実際に送信される、つまりndo_start_xmit()デバイス呼び出しの後に送信される完全なパケットをキャプチャするにはどうすればよいですか?

4

2 に答える 2

1

私の最初の質問に非常に役立つ回答を提供してくれたGuyHarrisに感謝します!

コメントで尋ねたフォローアップ質問への回答/メモとしてこれを追加しています。基本的に私の質問は、PF_PACKET/SOCK_RAWによって受信されたパケットのステータスは何であるかということでした。

ソフトウェアデバイス(キューなし)の場合、skbバッファの送信を開始するためdev_queue_xmit()に呼び出します。dev_hard_start_xmit(skb, dev)この関数は、を呼び出すdev_queue_xmit_nit()前に呼び出しますdev->ops->ndo_start_xmit(skb,dev)。つまり、PF_PACKETが認識するパケットは、で変更が行われる前の状態にありますndo_start_xmit()

于 2013-01-22T00:23:17.510 に答える
1

vir_device_1から実際に送信される、つまりndo_start_xmit()デバイス呼び出しの後に送信される完全なパケットをキャプチャするにはどうすればよいですか?

PF_PACKET / SOCK_RAWソケットを直接使用する独自のコードを作成するか(「SLLヘッダー」と言うので、これはおそらくLinuxです)、または次の方法で実行します。

  • ARPHRD_仮想インターフェイスに特別な値が割り当てられていることを確認してください。
  • DLT_USERヘッダーの特別なセットにn個の値の1つを使用するか、tcpdump-workers@lists.tcpdump.orgにDLT_それらに割り当てられる公式の値を要求します。
  • libpcapを変更して、そのARPHRD_値を使用している値にマップしDLT_ます。
  • DLT_その値を処理するようにtcpdumpを変更します。
  • 必要に応じて、そのインターフェイスでキャプチャする他のプログラムを変更するか、そのインターフェイスでtcpdumpによって書き込まれたキャプチャファイルを読み取って、その値も処理します。

DLT_USERn値は特に私的使用のために予約されており、libpcap、tcpdump、またはWireshark公式バージョンがそれらを独自の使用に割り当てることはありません(つまり、n値を使用する場合は、パッチDLT_USER提供してそれを割り当てる必要はありません。ヘッダーのタイプには価値があります。受け入れられないためです。他の人がすでに独自の特別なヘッダーに使用している可能性があり、引き続きサポートする必要があります)。したがって、libpcapの変更バージョンを維持する必要があります。公式の値を割り当てるのではなく、これらの値の1つを使用する場合は、tcpdumpなどを自分で使用してください。

于 2013-01-18T19:54:05.763 に答える