4

私は次の設定をしています:

client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server

を使用してLinuxブリッジでRAWソケットを開くと

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

ソケットをeth2にバインドしています。クライアントがサーバーにパケットを送信すると、ブリッジで実行されているwiresharkは、送信元MACアドレスがclient(eth0)、宛先MACアドレスがserver(eth1)のパケットを報告します。

を実行するread()と、読み取られたデータの最初の6バイトが宛先MACアドレスであり、server(eth1)として正しく読み取られます。

ただし、ステートメントを次のように変更すると

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));

を実行するread()と、読み取られたデータの最初の6バイトは、宛先MACアドレスがLinuxブリッジ(eth2)であることを示しています。

なぜこれでしょうか?カーネルまたはイーサネットカードドライバーは、ETH_P_IPを使用してネットワークを読み取る代わりに、独自のMACアドレスをバッファーに配置していますか?

4

1 に答える 1

3

ETH_P_IPの場合、説明している内容は通常の「ルーティング」シナリオのように聞こえます。(つまり、ルーティングMacは宛先Macです。)

クライアントとサーバーが異なるサブネット/VLAN上にあり、その間にルーターがある場合は意味があります。

ただし、この図はLinuxの「ブリッジ」を示しています。ブリッジングのみを行い、ルーティングはまったく行いませんか?

編集

ETH_P_IPは、次の回答に従って着信IPパケットのみをキャプチャします。C のLinuxでRawSocketsを使用したパケットスニッフィング

于 2012-10-09T01:11:32.480 に答える