私が現在テストしているシステムでは、EthヘッダーとIPヘッダーの間に独自のL2.5ヘッダーを追加するために、いくつかの仮想L2デバイスがチェーンされています。今私が使うとき
tcpdump -xx -i vir_device_1
、実際にはIPヘッダー付きのSLLヘッダーが表示されます。vir_device_1から実際に送信される、つまりndo_start_xmit()デバイス呼び出しの後に送信される完全なパケットをキャプチャするにはどうすればよいですか?
私の最初の質問に非常に役立つ回答を提供してくれた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()
。
vir_device_1から実際に送信される、つまりndo_start_xmit()デバイス呼び出しの後に送信される完全なパケットをキャプチャするにはどうすればよいですか?
PF_PACKET / SOCK_RAWソケットを直接使用する独自のコードを作成するか(「SLLヘッダー」と言うので、これはおそらくLinuxです)、または次の方法で実行します。
ARPHRD_
仮想インターフェイスに特別な値が割り当てられていることを確認してください。DLT_USER
ヘッダーの特別なセットにn個の値の1つを使用するか、tcpdump-workers@lists.tcpdump.orgにDLT_
それらに割り当てられる公式の値を要求します。ARPHRD_
値を使用している値にマップしDLT_
ます。DLT_
その値を処理するようにtcpdumpを変更します。DLT_USER
n値は特に私的使用のために予約されており、libpcap、tcpdump、またはWiresharkの公式バージョンがそれらを独自の使用に割り当てることはありません(つまり、n値を使用する場合は、パッチをDLT_USER
提供してそれを割り当てる必要はありません。ヘッダーのタイプには価値があります。受け入れられないためです。他の人がすでに独自の特別なヘッダーに使用している可能性があり、引き続きサポートする必要があります)。したがって、libpcapの変更バージョンを維持する必要があります。公式の値を割り当てるのではなく、これらの値の1つを使用する場合は、tcpdumpなどを自分で使用してください。