A G*_*A G 5 sockets ethernet raw-sockets raw-ethernet
我有以下设置:
client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令在 linux 桥上打开 RAW 套接字时
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
Run Code Online (Sandbox Code Playgroud)
我的套接字绑定到 eth2。当客户端向服务器发送数据包时,运行在网桥上的wireshark会报告该数据包,其源MAC地址为客户端(eth0),目标MAC地址为服务器(eth1)。
当我执行 a 时read(),读取的数据的前 6 个字节是目标 MAC 地址,正确读取为 server(eth1)。
但是当我将语句更改为
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
Run Code Online (Sandbox Code Playgroud)
当我执行 a 时read(),读取的数据的前 6 个字节显示目标 MAC 地址是 linux 桥 (eth2)。
为什么会这样呢?内核或以太网卡驱动程序是否将自己的 MAC 地址放入缓冲区,而不是使用 ETH_P_IP 读取线路?
对于 ETH_P_IP 情况,您所描述的听起来像是正常的“路由”场景。(即路由 mac 是目标 mac。)
如果您的客户端和服务器位于不同的子网/vlan 上,并且中间有一个路由器,那么这是有意义的。
然而,该图显示了一个 Linux“桥”。它只做桥接而不做路由吗?
编辑
ETH_P_IP 仅根据此答案捕获传入的 IP 数据包: Packet Sniffing using Raw Sockets in Linux in C