如何防止Linux丢弃具有错误的MAC地址的传入数据包(混杂不起作用)

我以类似的方式在一个静态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路由,这似乎是您想要执行的操作。