必须放行IP协议号112的VRRP报文,禁用conntrack跟踪,并按集群角色配置防火墙策略;组播需允许224.0.0.18,单播推荐生产使用。

Keepalived 在高可用(HA)环境中依赖 VRRP 协议实现主备切换,而 VRRP 报文默认使用 IP 协议号 112,不是标准的 TCP/UDP 流量。很多防火墙(如 iptables、firewalld、nftables 或云平台安全组)默认会拦截非 TCP/UDP 的协议报文,导致 Keepalived 心跳失败、VIP 无法漂移、脑裂等严重问题。
必须放行 VRRP 协议(IP protocol 112)
这是最核心的要求。VRRP 不走端口,而是直接封装在 IP 层,因此不能用 “允许 UDP 端口 112” 这类错误配置来替代。
- iptables 示例:
-A INPUT -p 112 -j ACCEPT(注意是 -p 112,不是 -p udp --dport 112) - firewalld 示例:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p 112 -j ACCEPT - 云平台(如阿里云、腾讯云)安全组中,需添加“自定义协议”规则,协议类型选 IP Protocol 112,源地址设为对端节点 IP 或整个集群网段
确保组播或单播通信可达(取决于 VRRP 模式)
Keepalived 默认使用组播地址 224.0.0.18 发送 VRRP 报文。若网络设备(交换机、路由器)或防火墙禁用了组播,或环境不支持组播(如某些容器网络、云主机内网),需改用单播模式,并开放对应单播目标 IP 的通信路径。
- 组播场景:防火墙需允许入向和出向的 224.0.0.18:0(协议 112),且交换机需启用 IGMP snooping 或允许该组播流
- 单播场景:Keepalived 配置中用
unicast_src_ip和unicast_peer指定对端地址,防火墙只需放行节点间点对点的 protocol 112 流量(更可控,推荐生产环境使用)
避免因 conntrack 导致 VRRP 报文被异常丢弃
Linux 内核 netfilter 的连接跟踪(conntrack)模块默认会对 protocol 112 做状态跟踪,但 VRRP 是无状态的周期性报文,容易触发 conntrack 表满或误判为异常流量而丢包,尤其在高负载或频繁切换时。
- 建议禁用 VRRP 协议的连接跟踪:
echo 'net.netfilter.nf_conntrack_proto_vrrp = 0' >> /etc/sysctl.conf && sysctl -p - 或在 iptables 中提前跳过 conntrack:
-A PREROUTING -p 112 -j NOTRACK(需配合 raw 表使用)
注意 VIP 绑定后流量路径与防火墙策略的一致性
VIP 漂移后,业务流量会发往新主节点。若防火墙策略基于物理 IP 编写(如只允许特定 IP 访问 80 端口),而未覆盖 VIP,会导致服务不可达;反之,若策略过于宽松(如全开所有 IP 的 protocol 112),又存在安全隐患。
- 推荐按角色而非 IP 设定策略:例如允许“HA 集群内所有节点之间 protocol 112 互通”,并对 VIP 开放业务端口(如 TCP 80/443)
- 避免在节点上对 VIP 做 DNAT/SNAT,Keepalived VIP 是绑定在本地回环或网卡上的真实地址,应直通处理

















