You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

同子网双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:

  1. 临时生效(重启后失效,先用来测试)
    在接收端执行以下命令:

    # 让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
    
  2. 永久生效(重启后依然有效)
    创建一个自定义的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让配置立即生效。

  3. 验证效果
    回到发送端,先清空现有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

火山引擎 最新活动