mcast_src_ip 必须显式设置,因其指定VRRP组播报文的真实源IP(须为本机同子网真实地址,非VIP),解决多网卡、云环境或跨子网时默认选错出口IP导致心跳中断的问题。

mcast_src_ip 是 Keepalived 中用于明确指定 VRRP 组播心跳报文源 IP 地址的关键配置项,它不决定虚拟 IP(VIP)归属,而是解决多网卡、多子网或云环境(如腾讯云、阿里云)下心跳通信失败的核心参数。
为什么必须显式设置 mcast_src_ip?
Keepalived 默认使用系统路由表中“到达对端”的出接口 IP 作为组播报文源地址。但在以下场景中,该默认行为极易导致心跳中断: - 服务器有多个网卡(如 eth0 内网 + eth1 公网),而 keepalived 实际走的是内网通信,但系统选了公网 IP 发心跳; - 云服务器使用弹性网卡或绑定多个辅助私有 IP,VRRP 组播报文可能从错误的辅助地址发出; - 主备节点不在同一二层广播域(如跨可用区、跨 VPC),需依赖三层组播转发,此时源地址必须是双方能路由可达的真实内网 IP。
不设 mcast_src_ip,常表现为:ip a 能看到 VIP,但 tcpdump -i any vrrp 抓不到组播报文,或备机日志反复出现 Received advert with wrong version or group / Discarding advert due to wrong src ip。
mcast_src_ip 的正确填写方式
- 值必须是本机**真实存在的、且与对端 keepalived 节点处于同一子网的 IPv4 地址**(不能是 VIP,也不能是 127.0.0.1); - 通常就是你用于节点间通信的内网网卡主 IP,例如: - 主机 A 网卡 ens33 配置为 `192.168.10.69/24` → `mcast_src_ip 192.168.10.69` - 主机 B 网卡 ens33 配置为 `192.168.10.84/24` → `mcast_src_ip 192.168.10.84` - 若使用 IPv6,需配合 `mcast6_src_ip`,且确保 `ipv6` 模块已启用、组播路由可达。
✅ 正确示例(vrrp_instance 块内):
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
mcast_src_ip 192.168.10.69 # ← 就填这个真实IP,别填VIP!
priority 102
advert_int 1
...
}
配套必须检查的 3 个要点
- 确认组播地址和端口一致:默认组播地址是 `224.0.0.18`,端口 `694`;主备两台的 `virtual_router_id` 必须相同,否则不认为是同一组; - 关闭防火墙干扰:需放行 UDP 端口 `694` 及组播地址 `224.0.0.18/32`(iptables/firewalld/云安全组均需检查); - 验证底层连通性:在两台机器上执行 `ping 192.168.10.84` 和 `ping 192.168.10.69` 确保双向 ICMP 通,再用 `tcpdump -i ens33 host 224.0.0.18` 观察是否能收发 VRRP 报文。
常见误配与后果
- ❌ 填成 VIP(如 `192.168.10.99`):系统无法将组播报文从 VIP 发出(VIP 是虚拟地址,无对应 MAC),心跳静默失败; - ❌ 填成另一网卡 IP(如公网 IP `101.200.x.x`):备机收到源地址不属于内网段的 VRRP 包,直接丢弃(防欺骗机制); - ❌ 两台都填同一个 IP(如都填 `192.168.10.69`):违反唯一性,备机拒绝加入,日志报 `conflicting mcast_src_ip`。
不复杂但容易忽略。










