私は次の設定をしています:
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アドレスをバッファーに配置していますか?