Keepalived心跳包被防火墙拦截的本质是VRRP协议(IP协议号112)未放行,导致主备节点无法交换Advertisement报文,进而引发脑裂或状态停滞;排查需按协议验证、规则检查、抓包比对三步切入,先确认Keepalived自身正常,再定位网络层拦截,重点检查firewalld是否显式添加vrrp协议、交换机/云安全组是否允许协议号112。

Keepalived 心跳包被防火墙拦截,本质是 VRRP 协议(IP 协议号 112)未被放行,导致主备节点无法交换 Advertisement 报文,进而触发脑裂或状态停滞。排查要从协议验证、规则检查、抓包比对三步切入,不靠猜测。
确认 VRRP 报文是否真实发出与接收
先排除 Keepalived 自身异常,再定位网络层拦截:
- 在备节点执行:tcpdump -i eth0 'proto 112' -c 5 -nn,等待 30 秒;无任何输出,说明主节点根本没发出来,或发了但备节点收不到
- 立刻切到主节点,同样执行该命令;若主节点能抓到自身发出的 VRRP 包(源 IP 为本机,目标为 224.0.0.18),说明 Keepalived 正常工作,问题在传输路径
- 若主节点也抓不到,需检查 keepalived 配置中 interface 是否正确、网卡是否 UP、virtual_router_id 是否配置错误
检查防火墙是否显式拦截 VRRP 协议
firewalld 默认不放行协议号 112,即使开放了 UDP/TCP 端口也无效:
- 运行 firewall-cmd --list-all | grep vrrp,确认是否有
vrrp协议条目 - 若无,执行:firewall-cmd --permanent --add-protocol=vrrp,然后 firewall-cmd --reload
- 注意:不能只加
--add-service=vrrp(该 service 不存在),也不能用--add-port=112/udp(VRRP 不是 UDP 协议) - 如使用自定义链(如 direct rules),检查是否匹配了
--protocol vrrp且动作是 ACCEPT
验证报文能否穿越中间网络设备
防火墙只是第一关,交换机 ACL、云平台安全组、虚拟化桥接策略也可能过滤:
- 登录交换机,查看是否启用 IGMP snooping 或 STP 导致组播丢包;临时关闭 IGMP snooping 测试
- 若部署在云环境(如阿里云、AWS),检查安全组是否允许“自定义协议”类型,协议号填 112,源/目标设为高可用节点 IP 段
- 在主备节点间直接用 ping 和 arping 验证二层连通性;若 ping 通但 VRRP 抓不到,基本锁定为三层协议过滤
日志与配置交叉验证
避免误判配置一致性和服务状态:
- 在两节点分别执行 keepalived -t,确认配置语法无误,且 virtual_router_id 完全一致
- 查看系统日志:journalctl -u keepalived -n 50 | grep -i "vrrp\|advert\|priority",观察是否出现
Lost primary advertisement或No suitable interface found类提示 - 检查内核参数:cat /proc/sys/net/ipv4/conf/all/rp_filter,值为 1 可能干扰多播接收,临时设为 0 测试

















