我有以下设置:
client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server当我在linux桥上打开一个原始套接字时
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));我将套接字绑定到eth2。当客户端向服务器发送分组时,在网桥上运行的wireshark报告具有客户端的源mac地址(Eth0)和服务器的目的mac地址(Eth1)的分组。
当我执行read()时,读取的数据的前6个字节是目的mac地址,它被正确地读取为服务器(Eth1)。
但是,当我将语句更改为
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));当我执行read()时,读取的数据的前6个字节显示目的mac地址是linux网桥(eth2)。
为什么会这样呢?内核或以太网卡驱动程序是否将自己的mac地址放在缓冲区中,而不是使用ETH_P_IP从线路上读取?
发布于 2012-10-09 09:11:32
对于ETH_P_IP来说,您所描述的听起来像是一个普通的“路由”场景。(即路由mac是目的地mac。)
如果您客户端和服务器位于不同的子网/vlan上,并且它们之间有一台路由器,那么这将是有意义的。
然而,图中显示的是linux的“桥”。它是不是只做桥接,根本不做路由?
编辑
ETH_P_IP仅根据以下答案捕获传入的IP数据包:Packet Sniffing using Raw Sockets in Linux in C
https://stackoverflow.com/questions/12783527
复制相似问题