我以类似静态 proxy_arp 的方式配置了三台机器:
----------------------+ +----------------------------------------------+ +---------------------- 机器 A | | 机器 B | | 机器 C ----------------------+ +----------------------------------------------+ +---------------------- eth0|---|tap0 tap1|---|eth0 mac:52:54:00:12:34:56| |mac:b6:e0:11:97:fd:5f mac:36:46:74:b1:92:71| |mac:52:54:00:22:22:22 ip:192.168.12.2/24| |ip:0.0.0.0 ip:0.0.0.0| |ip:192.168.12.4/24 | |promisc 向上 promisc 向上| | 机器 A: arp -i eth0 -s 192.168.12.4 b6:e0:11:97:fd:5f 机器C: arp -i eth0 -s 192.168.12.2 36:46:74:b1:92:71 机器B: echo 1 > /proc/sys/net/ipv4/ip_forward 路由添加 192.168.12.4 dev tap1 路由添加 192.168.12.2 dev tap0
通过此配置,我可以从机器 A 成功 ping 192.168.12.4。
问题是,如果我将机器 C 上的静态 arp 路由替换为:
arp -i eth0 -s 192.168.12.2 22:22:22:22:22:22
为什么它会停止工作?ping 回复被机器 B 上的 tap1 收到(出现在 wireshark 上),但是由于某种原因,尽管 tap1 处于混杂模式,数据包却没有传输到 IP 层,也没有像应该的那样转发到 tap0!
您是否知道内核的哪个组件负责根据目标 mac 地址丢弃此类传入数据包,即使接口处于混杂模式?
答案1
网络层接收到 MAC 22:22:22:22:22 的数据包,但由于 MAC 地址不属于 tap1,因此数据包被忽略。将接口设置为混杂不会禁用该检查,它只会将其移至网络代码的后面。
转发 MAC 目标不是接收数据包的接口的数据包称为桥接。如果您通过计算机 B 桥接数据包,则可以正常配置计算机 A 和 C,而无需静态 ARP 路由,这似乎就是您想要做的。