arp_ignore=1是解决多网卡同网段arp响应冲突的推荐方案,需按网卡粒度配置并搭配arp_announce=2使用,避免mac漂移和不对称路由。

在多网卡同网段(例如 eth0 和 eth1 都配置了 192.168.1.x/24)的 Linux 环境中,ARP 响应冲突是常见问题:外部主机发来的 ARP 请求“谁有 192.168.1.57?”,本机两个网卡都可能应答,导致交换机学到错误 MAC 地址、流量被发往无该 IP 的网卡、连接中断或 ping 不通。arp_ignore 是解决该问题的核心参数,但必须配合 arp_announce 并按网卡粒度配置,不能仅设全局值。
arp_ignore 的作用和推荐取值
arp_ignore 控制“收到 ARP 请求后,是否响应”,关键看请求进来的接口和目标 IP 是否匹配:
- 值为 0(默认):任意网卡只要本机配了该 IP,就响应——多网卡同网段时必然引发 MAC 漂移;
- 值为 1(生产推荐):只响应目标 IP 是该接口主 IP(ip addr show dev eth0 中 inet 行无 secondary 标记)的请求;
- 值为 2(需 secondary IP 时用):响应目标 IP 是该接口上任一 IP(含 ip addr add ... label 添加的别名地址)的请求。
注意:值为 2 还要求源 IP 与该接口同子网(即请求方和目标 IP 必须在同一网段),比值 1 更严格;多数场景用 1 即可。
必须按具体网卡单独设置,不可依赖 all
/proc/sys/net/ipv4/conf/all/arp_ignore 是全局兜底值,但会被单接口设置覆盖。若只改 all,而没设 eth0、eth1 等具体网卡,实际可能无效。
- 临时生效(以 eth0、eth1 为例):
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignoreecho 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore - 永久生效:在
/etc/sysctl.conf或/etc/sysctl.d/99-arp-fix.conf中添加:net.ipv4.conf.eth0.arp_ignore = 1net.ipv4.conf.eth1.arp_ignore = 1 - 加载配置:
sysctl -p;验证:sysctl net.ipv4.conf.eth0.arp_ignore
arp_ignore 必须搭配 arp_announce=2 使用
只限制响应不解决主动发包问题。当本机访问同网段地址(如 ping 192.168.1.100)时,内核可能从错误网卡发 ARP 请求,造成路径不对称(asymmetric routing),防火墙或交换机可能丢包。
- arp_announce=2 表示:“发送 ARP 请求时,优先选与目标 IP 最匹配的本地地址所在的接口”;
- 例如 eth0 配 192.168.1.56,eth1 配 192.168.1.57,则访问 .56 自动走 eth0,访问 .57 自动走 eth1;
- 同样需按网卡设置:
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce,并写入 sysctl.conf。
验证与常见误区
配置后建议用 arping 测试隔离效果:
- 从外部主机执行:
arping -I eth0 -c 3 192.168.1.56→ 应仅 eth0 回应; - 执行:
arping -I eth0 -c 3 192.168.1.57→ eth0 不应回应(若回应说明 arp_ignore 未生效); - 检查 ARP 表:
ip neigh show,确认每个 IP 对应正确网卡的 MAC; - 避免混淆:rp_filter(反向路径过滤)也会影响通信,若开启(值为 1),需确保路由对称,否则可能丢包。











