不建议启用 Keepalived 的 vrrp_iptables 选项,因其在 VIP 漂移时盲目插入/删除 iptables 规则,缺乏状态跟踪、不兼容 firewalld/nftables 和云环境,易导致服务中断;应手动预置静态防火墙规则,专注 VRRP 协议(IP 协议号 112、组播地址 224.0.0.18)及健康检查端口,并在云环境中改用 Unicast 模式。
Keepalived 的
选项
不建议启用
,尤其在云环境或现代防火墙管理场景下。它并非用于“智能维护安全规则”,而是一个已知存在风险的自动机制:开启后,Keepalived 会在 VIP 漂移时
强制插入/删除 iptables 规则
(如
),但这些规则缺乏上下文、未适配连接跟踪状态、不兼容 firewalld/nftables,且极易与现有策略冲突,导致 VIP 无法访问或服务中断。
真正可靠的做法是
手动预置精准、静态的防火墙规则
,让 Keepalived 专注 VRRP 协议通信和 VIP 管理,不干涉防火墙逻辑。
明确 vrrp_iptables 的实际行为
它只在
切换瞬间,向
链
头部插入一条允许目标为 VIP 的 ACCEPT 规则
;
切换回
时,会尝试删除该规则;
不检查规则是否已存在、不处理多网卡、不兼容或匹配、不支持 IPv6
;
在启用
或
的系统上,该功能完全失效甚至引发异常;
云平台(如阿里云、AWS)通常禁用组播且不响应 VRRP 报文,此时
插入的规则毫无意义,反而掩盖真实连通性问题。
✅ 正确思路:防火墙规则应
独立于主备状态
——无论哪台机器持有 VIP,VRRP 通信和健康检查端口都必须始终可达。
应该配置的防火墙规则(推荐方案)
允许 VRRP 协议本身(必需)
VRRP 使用 IP 协议号
,目标组播地址
,不走端口:
放行健康检查端口(按需)
例如检查后端 Web 服务:
⚠️ 注意:不要只放行 VIP 绑定的端口,而是放行
本机实际监听的服务端口
(如
、
、
)。Keepalived 不转发流量,只接管 VIP;真实服务仍由本地进程提供。
设置默认策略(安全基线)
确保规则顺序合理,最后设为 DROP:
为什么不能依赖 vrrp_iptables 做“自动安全维护”
它不区分
,插入的规则可能绕过连接跟踪,带来安全隐患;
它不处理
链(在 LVS-DR/NAT 模式中 Forward 规则同样关键);
它无法适配
、
、速率限制等高级策略;
多实例(多个 vrrp_instance)时,规则插入逻辑混乱,易覆盖或遗漏;
日志中无明确记录,故障排查困难(你看到的是 “VIP 不通”,但真实原因是
插入失败或被后续规则拦截)。
云环境特别提醒
所有主流公有云(含华为云、腾讯云、Azure)
默认丢弃 VRRP 组播报文
,且不支持
;
此时必须关闭
(配置
),改用
Unicast 模式 + 显式点对点心跳
;
防火墙只需开放单播心跳端口(如 UDP 3333)、健康检查端口,无需处理组播;
示例 unicast 配置片段:
不复杂但容易忽略
vrrp_iptablesiptables -I INPUT -d $VIP -j ACCEPTstate MASTERINPUTBACKUP-m statectfirewalldnftablesvrrp_iptables112224.0.0.18# iptables(传统)
iptables -A INPUT -p 112 -j ACCEPT
iptables -A INPUT -d 224.0.0.18 -j ACCEPT# nftables(推荐,Linux 5.0+)
nft add rule ip filter input ip protocol vrrp accept
nft add rule ip filter input ip daddr 224.0.0.18 acceptiptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT8033066379iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT # 回环必须放开
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ↑ 上面三条放在最前,再追加 VRRP 和服务端口规则NEW/ESTABLISHEDFORWARDipsetgeoipiptables -I224.0.0.18vrrp_iptablesvrrp_iptables offvrrp_instance VI_1 {
...
unicast_src_ip 10.0.1.10
unicast_peer {
10.0.1.11
}
...
}