云环境必须用单播因云平台默认禁用组播,导致Keepalived VRRP心跳无法传输而引发双主;单播通过点对点通信绕过限制,需配置unicast_src_ip和unicast_peer并放行IP协议号112。

Keepalived 默认用组播(224.0.0.18)发 VRRP 心跳,但在 AWS、阿里云、腾讯云等多数云平台中,底层网络默认禁用组播——节点之间收不到彼此的心跳,就会各自认为“只有自己活着”,结果同时抢 VIP,出现双主、服务中断或脑裂。单播模式能彻底绕过这个限制,让心跳精准点对点送达。
为什么云环境必须用单播
云厂商的虚拟网络通常不转发组播报文,哪怕你配置正确,tcpdump 也抓不到 224.0.0.18 的 VRRP 包。这不是 Keepalived 的问题,是网络基础设施的硬性约束。单播不依赖组播路由,只要两个节点能互相 ping 通、端口未被安全组拦截(VRRP 协议走 IP 协议号 112,不是 TCP/UDP),通信就能建立。
核心配置要点(两节点示例)
假设有两台云服务器:
- KA1:内网 IP 172.25.254.50,规划为主节点
- KA2:内网 IP 172.25.254.60,规划为备节点
- VIP:172.25.254.100/24
关键动作是关闭组播、显式指定源和对端:
- 在 KA1 的 vrrp_instance 块中添加:
unicast_src_ip 172.25.254.50
unicast_peer { 172.25.254.60 } - 在 KA2 的对应块中反向配置:
unicast_src_ip 172.25.254.60
unicast_peer { 172.25.254.50 } - 注释或删除 vrrp_mcast_group4 行(如有),避免干扰
- virtual_router_id 两端必须完全一致(如 51),否则不视为同一组
验证通信是否真正生效
光改配置不够,得确认心跳真的在走单播:
- 在 KA1 上执行:
tcpdump -i eth0 'ip proto \112'(过滤 VRRP 协议报文) - 重启 KA2 的 keepalived:
systemctl restart keepalived - 观察 KA1 的 tcpdump 输出——应看到目标 IP 为 172.25.254.50 的 VRRP 包(即 KA2 主动发来的单播心跳)
- 同理,在 KA2 上抓包,应看到源为 172.25.254.50 的包
如果只看到本地发包、没收到对端,检查云平台安全组是否放行了 IP 协议号 112,或确认网卡名(interface)是否写错(如 enp0s3 而非 eth0)。
配套注意事项
单播模式下,这些细节容易忽略但直接影响稳定性:
- vrrp_strict 建议注释掉——它会校验更多字段,在单播路径下可能误判报文非法
- 防火墙需允许 IP 协议号 112(不是端口):
iptables -I INPUT -p 112 -j ACCEPT - 两节点时间需同步(chrony/ntp),否则认证可能失败
- 若用多网卡,unicast_src_ip 必须填实际参与通信的网卡 IP,不能填 0.0.0.0 或 lo 地址

















