跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何利用 Keepalived 的 vrrp_iptables 自动维护双机切换时的安全规则

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

相关文章