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)。

当我执行 aread()时,读取的数据的前 6 个字节是目标 mac 地址,正确读取为 server(eth1)。

但是,当我将语句更改为

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

当我执行 aread()时,读取的数据的前 6 个字节显示目标 mac 地址是 linux bridge (eth2)。

为什么会这样?内核或以太网卡驱动程序是否将其自己的 MAC 地址放入缓冲区而不是使用 ETH_P_IP 读取线路?

4

1 回答 1

3

对于 ETH_P_IP 情况,您所描述的听起来像是正常的“路由”场景。(即路由mac是destination mac。)

如果您的客户端和服务器位于不同的子网/vlan 上,并且它们之间有一个路由器,那将是有意义的。

但是,该图指示了一个 linux“桥”。它只做桥接而不做路由吗?

编辑

ETH_P_IP 仅根据此答案捕获传入的 IP 数据包: Packet Sniffing using Raw Sockets in Linux in C

于 2012-10-09T01:11:32.480 回答