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

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

我以类似静态 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 路由,这似乎就是您想要做的。

相关内容