VIP无法响应ARP或频繁漂移的根源在于ARP参数配置错误、Keepalived状态异常、IPVS规则未同步及RS回环配置缺失;需统一设置arp_ignore=1/arp_announce=2,校验VRRP配置与防火墙,通过notify脚本同步IPVS规则,并在RS的lo接口正确绑定VIP且禁用ARP。

IPVS + Keepalived 配置后 VIP 无法响应 ARP 或频繁漂移,通常不是单一组件故障,而是网络层、内核参数、Keepalived 状态机与 IPVS 规则协同失配所致。核心在于:VIP 必须能被正确宣告(ARP 响应)、稳定绑定(内核不抢答)、且状态切换时规则同步无延迟。
ARP 响应失效:Linux 内核抑制了 VIP 的 ARP 回复
默认情况下,Linux 内核对非本地主 IP(即未配置在任何 real interface 上的 VIP)会忽略 ARP 请求(arp_ignore=1),或不主动宣告(arp_announce=2)。即使 Keepalived 已成功绑定了 VIP,若内核不响应 ARP,下游设备就学不到 VIP 的 MAC 地址。
解决方法:
- 在所有参与 LVS+Keepalived 的节点上,执行:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce - 同时确保对应网卡(如 eth0)也生效:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce - 写入 /etc/sysctl.conf 持久化:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
Keepalived 主备状态异常:VIP 绑定失败或未触发同步
Keepalived 进程运行但未真正绑定 VIP,常见于:
- 配置中 vrrp_instance 的 state 与实际角色不符(例如 backup 节点误配为 MASTER);
- interface 指向错误网卡(如配成 lo 而非 eth0);
- virtual_router_id 在集群中不唯一,导致 VRRP 报文被丢弃;
- 防火墙拦截 VRRP 协议(协议号 112,目的组播地址 224.0.0.18),造成主备无法通信、脑裂或反复切换。
验证方式:
ip addr show dev eth0 查看 VIP 是否存在;
sudo tcpdump -i eth0 host 224.0.0.18 观察 VRRP 报文收发;
tail -f /var/log/messages | grep Keepalived 检查状态切换日志。
IPVS 规则未随 VIP 同步:主备切换后调度器失效
Keepalived 默认只管理 VIP 和健康检查,不会自动同步 ipvsadm 规则。若仅在主节点手动添加规则,备节点无规则,VIP 漂移后流量到达却无对应虚拟服务,表现为“VIP 可 ping 通但服务不可达”。
推荐做法:
- 使用 Keepalived 的 notify_master / notify_backup 脚本,在状态切换时自动加载/清空规则;
- 示例脚本 /etc/keepalived/vip_rules.sh:
#!/bin/bash case "$1" in master) ipvsadm -C ipvsadm -A -t 192.168.1.100:80 -s rr ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g ;; backup) ipvsadm -C ;; esac - 在 keepalived.conf 中调用:
notify_master "/etc/keepalived/vip_rules.sh master"
notify_backup "/etc/keepalived/vip_rules.sh backup"
真实服务器(RS)回环接口配置遗漏:DR 模式下响应失败
若采用 LVS-DR 模式,RS 必须在 lo 接口上配置 VIP 并禁用 ARP 响应,否则:
- RS 自身 ARP 表混乱,可能响应 VIP 的 ARP 请求,引发冲突;
- 返回包不走 director,破坏 DR 转发路径。
RS 上必须执行:
ip addr add 192.168.1.100/32 dev lo label lo:0 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
并加入开机脚本或 network-scripts,确保重启后仍生效。











