VIP不响应ARP请求的根本原因是vrrp_strict模式禁用免费ARP且关闭内核ARP参数自动适配,导致VIP无法通告、ARP表不更新、IPVS规则未同步;必须关闭vrrp_strict、显式配置arp_ignore/arp_announce、通过notify脚本动态管理VIP绑定与IPVS规则。

为什么 VIP 不响应 ARP 请求
Keepalived 的 VRRP 实例默认启用 vrrp_strict 模式时,会禁用非标准 VRRP 报文(包括 gratuitous ARP),同时要求所有 VRRP 配置严格符合 RFC 3768 —— 这直接导致 VIP 在主节点上无法发送免费 ARP,下游交换机/主机 ARP 表不更新,流量发不到 VIP。
更关键的是:vrrp_strict 会关闭内核的 arp_ignore 和 arp_announce 自动适配逻辑,而 IPVS 转发依赖这些参数控制 ARP 响应行为。即使 VIP 已绑定到 lo 接口,若未显式配置 ARP 相关 sysctl,VIP 就不会对 ARP 请求做应答。
- 检查是否启用了
vrrp_strict:在keepalived.conf的global_defs块中出现该指令即为开启 - 确认 VIP 是否绑定在
lo:运行ip addr show lo,应看到类似inet 192.168.10.100/32 scope host的条目 - 验证当前 ARP 行为:
sysctl net.ipv4.conf.all.arp_ignore和net.ipv4.conf.all.arp_announce应分别为1和2(否则需手动设置)
keepalived.conf 中必须关闭 vrrp_strict 并启用 notify 脚本
vrrp_strict 必须移除或注释掉,否则 VRRP 状态切换时不会触发免费 ARP,也不会调用 notify 脚本 —— 这是绝大多数“VIP 不通”问题的根源。
真正控制 ARP 响应和 IPVS 规则同步的,是 notify_master/notify_backup 脚本。Keepalived 不会自动管理 IPVS 规则,必须由脚本完成:
- Master 上:绑定 VIP 到
lo、设置arp_ignore=1和arp_announce=2、加载 IPVS 规则(ipvsadm -A/-a) - Backup 上:清空 VIP、清理 IPVS 规则(
ipvsadm -C)、重置 ARP 参数(可选,但建议统一) - 脚本需有执行权限,且路径在
keepalived.conf中写绝对路径,例如notify_master "/etc/keepalived/notify.sh master"
示例片段:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
# vrrp_strict ← 这行必须删除或注释
virtual_ipaddress {
192.168.10.100/32 dev lo label lo:0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
内核参数与 lo 接口配置缺一不可
仅靠 keepalived 绑定 VIP 到 lo 不够。Linux 默认允许任何接口响应任意 IP 的 ARP 请求,这会导致 Backup 节点也响应 VIP 的 ARP,引发流量错乱。必须通过内核参数限制:
-
net.ipv4.conf.all.arp_ignore = 1:只响应目标 IP 是本接口主 IP 的 ARP 请求 -
net.ipv4.conf.all.arp_announce = 2:选择最佳本地地址(即 lo 上的 VIP)来应答 ARP -
net.ipv4.conf.lo.arp_ignore和net.ipv4.conf.lo.arp_announce也需设为相同值,避免被 all 设置覆盖 - 这些参数需写入
/etc/sysctl.conf并执行sysctl -p生效,不能只临时设置
另外,VIP 必须用 /32 掩码绑定到 lo(如 192.168.10.100/32),并加 label lo:0。用 /24 或绑定到物理接口会破坏 ARP 隔离逻辑。
ipvsadm 规则必须在 notify 脚本中动态管理
Keepalived 不感知 IPVS,也不自动同步规则。如果只靠静态 ipvsadm -A 启动一次,failover 后 Backup 成为 Master 时规则并不存在,流量进不来。
所有 IPVS 操作必须放在 notify_master 脚本里,且需幂等处理(重复执行不报错):
- 先清空旧规则:
ipvsadm -C(Backup 脚本里也要执行) - 添加虚拟服务:
ipvsadm -A -t 192.168.10.100:80 -s rr - 添加真实服务器:
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.11:80 -m(注意使用-m即 MASQUERADE 模式,避免回环路由问题) - 检查是否已存在再操作,可用
ipvsadm -Ln | grep -q "192.168.10.100:"判断
别忘了在脚本开头加 #!/bin/bash,并确保 ipvsadm 在 PATH 中(或写全路径 /sbin/ipvsadm)。
ARP 不响应 + IPVS 规则缺失 + 内核参数未设,三者只要漏一个,VIP 就形同虚设。最容易被忽略的是 vrrp_strict 的全局压制效应——它会让所有其他配置都失效。











