同子网双10G端口接收端与发送端交换机组网ARP条目异常,寻求独立访问各端口解决方案
同子网双10G端口接收端与发送端交换机组网ARP条目异常,寻求独立访问各端口解决方案
嘿,这个问题我之前碰到过好几次,本质是Linux内核默认的ARP响应策略在多网卡同子网场景下的“特性”导致的,我来给你拆解清楚原因,再一步步教你解决:
为什么会出现两个IP对应同一个MAC的情况?
当接收端的两个网卡都在10.0.1.0/24这个子网时,Linux内核默认的ARP规则是:只要是来自同一子网的ARP请求,不管目标IP绑定在哪个网卡上,任意一个网卡都可以抢着响应。而且默认的arp_ignore参数是0,意思是“用接收ARP请求的网卡的MAC来回复,不管目标IP是不是属于这个网卡”。这就导致发送端请求10.0.1.2时,可能是enp74s0f1(绑定10.0.1.3的网卡)回复了自己的MAC;请求10.0.1.3时,也可能是同一个网卡回复,最终发送端的ARP表就出现了两个IP对应同一个MAC的情况。
解决步骤:让每个网卡只“负责”自己的IP
我们需要调整接收端的ARP相关内核参数,强制每个网卡只响应绑定在自身的IP的ARP请求,同时发送ARP时只使用自身IP:
临时生效(重启后失效,先用来测试)
在接收端执行以下命令:# 让enp74s0f0只响应绑定在自己身上的IP的ARP请求 echo 1 > /proc/sys/net/ipv4/conf/enp74s0f0/arp_ignore # 让enp74s0f0发送ARP时只使用自身绑定的IP echo 2 > /proc/sys/net/ipv4/conf/enp74s0f0/arp_announce # 对enp74s0f1做同样的配置 echo 1 > /proc/sys/net/ipv4/conf/enp74s0f1/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/enp74s0f1/arp_announce永久生效(重启后依然有效)
创建一个自定义的sysctl配置文件,比如/etc/sysctl.d/99-custom-arp.conf,写入以下内容:# 针对单个网卡配置 net.ipv4.conf.enp74s0f0.arp_ignore = 1 net.ipv4.conf.enp74s0f0.arp_announce = 2 net.ipv4.conf.enp74s0f1.arp_ignore = 1 net.ipv4.conf.enp74s0f1.arp_announce = 2 # 全局配置兜底 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2然后执行
sysctl -p /etc/sysctl.d/99-custom-arp.conf让配置立即生效。验证效果
回到发送端,先清空现有ARP缓存:arp -d 10.0.1.2 && arp -d 10.0.1.3分别ping两个IP:
ping 10.0.1.2 -c 3 ping 10.0.1.3 -c 3再查看ARP表,应该就能看到两个IP对应各自的MAC了:
sender$ arp Address HWtype HWaddress Flags Mask Iface 10.0.1.2 ether 00:0f:53:9a:44:b0 C enp0s25 10.0.1.3 ether 00:0f:53:9a:44:b1 C enp0s25
额外注意事项
- 如果调整后还是有问题,检查一下你的交换机有没有开启端口聚合(LACP)之类的功能,聚合模式会把两个端口当成一个逻辑端口,MAC地址会统一,这也会导致ARP异常。
- 你的netplan配置本身没问题,只是内核的ARP策略需要调整,不需要修改子网配置(当然如果后续有其他需求,也可以把两个网卡放到不同子网,但调整ARP参数是更直接的解决方案)。
备注:内容来源于stack exchange,提问作者Henrique Bucher




