arp_ignore在多网卡同网段时必须设为1或2,否则默认值0会导致全接口响应arp请求,引发mac地址漂移和连接中断;设为1仅响应本接口主ip,设为2响应本接口所有ip(含secondary);需按网卡单独配置,并搭配arp_announce=2使用。

为什么 arp_ignore 在多网卡场景下必须设为 1 或 2
默认 Linux 内核对 ARP 请求是“全接口响应”:只要目标 IP 配置在本机任意网卡上,任意网卡收到 ARP 请求都会应答。这在多网卡同网段(比如 eth0 和 eth1 都配了 192.168.1.x/24)时会引发 ARP 混乱——交换机学到的 MAC 地址反复漂移,连接抖动甚至中断。
arp_ignore 控制本机是否响应到达某接口的 ARP 请求。设为 1 表示“只响应目标 IP 是该接口主 IP 的请求”,设为 2 表示“只响应目标 IP 是该接口配置的任一 IP 的请求”(含别名 IP)。生产环境推荐用 1,更严格;若用了 ip addr add ... label 添加了 secondary IP,且需要响应,则考虑 2。
- 值为
0(默认):所有网卡都响应所有本地 IP 的 ARP 请求 → 多网卡同网段时必出问题 - 值为
1:ARP 请求进 eth0,只有 eth0 上的主 IP(ip addr show dev eth0中 `inet` 行无 `secondary` 标记的)才响应 - 值为
2:ARP 请求进 eth0,只要 eth0 上配了该 IP(无论主 IP 还是 secondary)就响应
如何为指定网卡单独设置 arp_ignore
不能全局一刀切,必须按网卡粒度设置。例如 eth0 要严格响应,eth1 是辅助网卡且不希望它响应同网段 ARP,就得分别配置:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
注意路径中 conf/eth0/ 是关键——写成 conf/all/arp_ignore 会影响所有接口,但会被单接口设置覆盖(优先级:单接口 > all)。所以务必确认你改的是具体网卡名,不是 all 或 default。
- 临时生效:直接写
/proc/sys/...,重启失效 - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.conf.eth0.arp_ignore = 1(注意点号替换斜杠) - 加载配置:
sysctl -p,或重启网络服务(部分发行版需systemctl restart systemd-sysctl) - 验证是否生效:
sysctl net.ipv4.conf.eth0.arp_ignore
arp_ignore 必须搭配 arp_announce 使用
只设 arp_ignore 不够。当本机主动发包(比如 ping 其他机器)时,源 IP 可能选错网卡,导致返回路径和请求路径不一致( asymmetric routing),而中间设备(如防火墙)可能丢弃反向流量。这时 arp_announce 控制“从哪个接口发起 ARP 请求来解析下一跳”。
推荐设为 2:“使用最匹配该目标 IP 的本地地址来发送 ARP 请求”。这样 eth0 上的 192.168.1.10 去访问 192.168.1.100,就只会从 eth0 发 ARP,不会错误地从 eth1 发。
-
arp_announce = 0(默认):可能从任意有路由的接口发 ARP,风险高 -
arp_announce = 1:只从目标 IP 所在子网对应的接口发 ARP(较保守) -
arp_announce = 2(推荐):选“与目标 IP 最匹配”的本地地址所在接口(支持 CIDR 精确匹配) - 设置方式同
arp_ignore:echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
常见误判:明明设了 arp_ignore,ARP 还是被响应
最常忽略的三点:
- 检查是否设置了
conf/all/arp_ignore,它虽被单接口覆盖,但若你只改了all没改单接口,实际无效 - 确认网卡名是否正确:
ip link show查真实名字(比如可能是ens33而非eth0),别凭记忆硬写 - ARP 响应还受
rp_filter(反向路径过滤)影响:若开启严格模式(rp_filter=1),且回包接口 ≠ 入包接口,内核可能直接丢弃入向 ARP 请求,导致你以为“没响应”,其实是被过滤了。建议设为0或2(宽松模式)并配合策略路由
调试时用 tcpdump -i any arp 抓包,看哪个接口真正发出了 arp reply,再比对对应接口的 arp_ignore 值,比猜快得多。











