我以类似的方式在一个静态proxy_arp中configuration了三台机器:
---------------------- + + -------------------------- --------------------- + + ----------------------
机器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 up promisc up | |
机器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
有了这个configuration,我可以从机器A ping 192.168.12.4成功。
问题是,如果我用机器Creplace静态arp路由:
arp -i eth0 -s 192.168.12.2 22:22:22:22:22:22
为什么停止工作? 在机器B上的tap1(在wireshark上出现)接收到ping回复,但是由于某种原因,虽然tap1是混杂模式,但是数据包不会被传送到IP层,并且不会被转发到tap0。
你知道内核的哪个组件负责根据目标MAC地址丢弃这样的传入数据包,即使接口处于混杂模式?
networking层接收到MAC 22:22:22:22:22的数据包,但是由于MAC地址不属于tap1,数据包将被忽略。 将接口设置为混杂不会禁用该检查,只会将其移到稍后的networking代码中。
转发MAC目的地不在接收数据包接口的数据包称为桥接。 如果您通过计算机B桥接数据包,则您将能够正常configuration计算机A和C,而无需使用静态ARP路由,这似乎是您想要执行的操作。