arp_ignore=0是多网卡同网段ARP混乱的直接原因,导致任意网卡响应本机所有IP的ARP请求,引发MAC漂移、连接中断;必须为每张业务网卡单独设arp_ignore=1并搭配arp_announce=2。

arp_ignore 值为 0 是多网卡 ARP 混乱的直接原因
默认 arp_ignore=0 时,只要目标 IP 配置在本机任意网卡上,**任何网卡收到 ARP 请求都会应答**。这在 eth0 和 eth1 同属 192.168.1.0/24 网段时必然引发问题:交换机反复学到同一 IP 对应不同 MAC(eth0 的 MAC vs eth1 的 MAC),MAC 地址漂移 → 连接抖动、间歇性中断、TCP 重传激增。
现象上常表现为:ip neigh show 中同一网关 IP 对应的 MAC 地址频繁切换;tcpdump -i any arp 可见多个接口同时回复 “Tell 192.168.1.1”;ping 时通时断,但 ip route get 192.168.1.1 显示路由始终正确。
这不是路由表错误,而是二层响应失控——必须改 arp_ignore,不能只调路由。
必须按网卡单独设 arp_ignore=1,不能写 conf/all
arp_ignore 生效优先级是:**单接口 > all > default**。写 /proc/sys/net/ipv4/conf/all/arp_ignore 看似省事,但会被后续单接口设置覆盖,且容易漏掉新添加的网卡(如容器 veth、bond 子接口)。
正确做法是明确指定每张物理/逻辑网卡:
echo 1 | sudo tee /proc/sys/net/ipv4/conf/eth0/arp_ignoreecho 1 | sudo tee /proc/sys/net/ipv4/conf/eth1/arp_ignoreecho 1 | sudo tee /proc/sys/net/ipv4/conf/bond0/arp_ignore
验证是否生效:sysctl net.ipv4.conf.eth0.arp_ignore 应返回 net.ipv4.conf.eth0.arp_ignore = 1;若仍为 0,说明路径写错(比如误写成 conf/eth0/arp_ignore 少了 net/ipv4/)或权限不足(需 root)。
arp_ignore=1 必须搭配 arp_announce=2 才完整
只设 arp_ignore=1 能阻止错误响应,但不解决“主动发包时选错源接口”的问题。例如 eth0 有 192.168.1.10,eth1 也有 192.168.1.20,当本机访问 192.168.1.100 时,内核可能从 eth1 发 ARP 请求(因源地址选择逻辑),而 eth1 并未配置该网段路由,导致 ARP 无响应 → ip neigh show 出现 INCOMPLETE 条目。
因此必须同步设 arp_announce=2:
echo 2 | sudo tee /proc/sys/net/ipv4/conf/eth0/arp_announceecho 2 | sudo tee /proc/sys/net/ipv4/conf/eth1/arp_announce
arp_announce=2 表示:“发送 ARP 请求时,优先使用与目标 IP 最匹配的那个本地地址所在的接口”。这样访问 192.168.1.x 就只会从 eth0 或 eth1 中实际配了该网段的那张卡发 ARP,避免跨网卡请求。
持久化要改 sysctl.conf,且注意点号和斜杠转换
临时命令重启即失效。写入 /etc/sysctl.conf 时,路径中的斜杠要换成点号:
- 错:
net.ipv4.conf/eth0/arp_ignore = 1 - 对:
net.ipv4.conf.eth0.arp_ignore = 1 - 对:
net.ipv4.conf.eth0.arp_announce = 2
加载配置用 sudo sysctl -p;若提示 “unknown key”,检查拼写(如 conf 写成 con)、网卡名是否真实存在(ip link show 确认是 ens33 还是 enp0s3),以及等号前后是否有空格(部分发行版严格校验格式)。
最易被忽略的一点:虚拟网卡(如 Docker 的 docker0、KVM 的 virbr0)通常不需要参与业务网段 ARP,它们的 arp_ignore 可保持默认 0,但**业务网卡一个都不能漏**——少配一张,混乱就从那里开始。



















