ipvsadm vip 无 ARP 响应的 keepalived vrrp 配置配合

10次阅读

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

ipvsadm vip 无 ARP 响应的 keepalived vrrp 配置配合

为什么 VIP 不响应 ARP 请求

Keepalived 的 VRRP 实例默认启用 vrrp_strict 模式时,会禁用非标准 VRRP 报文(包括 gratuitous ARP),同时要求所有 VRRP 配置严格符合 RFC 3768 —— 这直接导致 VIP 在主节点上无法发送免费 ARP,下游交换机/主机 ARP 表不更新,流量发不到 VIP。

更关键的是:vrrp_strict 会关闭内核的 arp_ignorearp_announce 自动适配逻辑,而 IPVS 转发依赖这些参数控制 ARP 响应行为。即使 VIP 已绑定到 lo 接口,若未显式配置 ARP 相关 sysctl,VIP 就不会对 ARP 请求做应答。

  • 检查是否启用了 vrrp_strict:在 keepalived.confglobal_defs 块中出现该指令即为开启
  • 确认 VIP 是否绑定在 lo:运行 ip addr show lo,应看到类似 inet 192.168.10.100/32 scope host 的条目
  • 验证当前 ARP 行为:sysctl net.ipv4.conf.all.arp_ignorenet.ipv4.conf.all.arp_announce 应分别为 12(否则需手动设置)

keepalived.conf 中必须关闭 vrrp_strict 并启用 notify 脚本

vrrp_strict 必须移除或注释掉,否则 VRRP 状态切换时不会触发免费 ARP,也不会调用 notify 脚本 —— 这是绝大多数“VIP 不通”问题的根源。

真正控制 ARP 响应和 IPVS 规则同步的,是 notify_master/notify_backup 脚本。Keepalived 不会自动管理 IPVS 规则,必须由脚本完成:

  • Master 上:绑定 VIP 到 lo、设置 arp_ignore=1arp_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_ignorenet.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 的全局压制效应——它会让所有其他配置都失效。

text=ZqhQzanResources