linux高可用负载均衡防火墙配置需精准放行三类流量:调度器与rs间业务端口、keepalived的vrrp协议(ip 112)、pacemaker/corosync的udp 5404-5405及tcp 2224/21064等端口,并绑定网卡到对应zone,禁用默认拒绝陷阱。

Linux 为高可用负载均衡器(如 LVS + Keepalived 或 Pacemaker 集群)配置防火墙规则,核心不是“全放开”,而是精准放行必需通信路径、屏蔽干扰流量、避免集群脑裂或服务中断。关键在于区分三类流量:调度器与真实服务器之间、集群节点间心跳与控制、对外提供服务的业务端口。
明确哪些端口和协议必须放行
高可用负载均衡架构中,不同组件依赖特定通信通道,不能笼统加 -p tcp --dport 80 就完事:
-
LVS 调度器(VS)与 RS 之间
- DR 模式:RS 不经过 VS 转发响应,但需能接收 VIP 的 ARP 请求(需
arptables配合),无需额外 TCP/UDP 端口放行;但ipvsadm规则本身不依赖防火墙放行,真正要通的是后端服务端口(如 RS 上的 Apache 的 80 端口)——这个端口需在 RS 的防火墙上对 VS 的 IP 或网段开放(非any)。 - NAT 模式:VS 做 DNAT+SNAT,RS 只需响应 VS 的请求,因此 RS 防火墙应只允许来自 VS 内网 IP 的访问(例如
192.168.239.10),而非所有来源。
- DR 模式:RS 不经过 VS 转发响应,但需能接收 VIP 的 ARP 请求(需
-
Keepalived 节点间(master/backup)
- 使用 VRRP 协议(IP 协议号 112),不是 UDP/TCP 端口,firewalld 默认禁止 VRRP 流量。必须显式启用:
sudo firewall-cmd --permanent --add-rich-rule='rule protocol value="112" accept'
- 若启用了健康检查脚本(如通过
track_script调用 curl),还需放行对应检查端口(如--add-port=80/tcp),但仅限于从本机到 RS 的出向连接(OUTPUT 链通常默认允许)。
- 使用 VRRP 协议(IP 协议号 112),不是 UDP/TCP 端口,firewalld 默认禁止 VRRP 流量。必须显式启用:
-
Pacemaker/Corosync 集群节点间
- Corosync 默认使用 UDP 端口
5404(multicast)、5405(unicast),以及 TCP 端口2224(pacemakerd)、3121(cman,旧版)、21064(qdevice)等。 - 推荐方式:按实际配置放行,例如:
sudo firewall-cmd --permanent --add-port=5404-5405/udp sudo firewall-cmd --permanent --add-port=2224/tcp sudo firewall-cmd --permanent --add-port=21064/tcp
- Corosync 默认使用 UDP 端口
关键操作:关闭无关服务、禁用默认拒绝陷阱
很多高可用故障源于防火墙“默认拒绝”策略未被正确绕过:
不要仅依赖
--add-service=ssh
SSH 是管理通道,但 Pacemaker 和 Keepalived 的通信不走 SSH。若你设置了firewall-cmd --set-default-zone=drop或block,即使开了 SSH,VRRP 或 Corosync 仍会被静默丢弃。-
优先使用 zone 绑定网卡,而非全局放行
把集群内部通信网卡(如eth1)绑定到internal区域,业务网卡(如eth0)绑定到public:sudo firewall-cmd --permanent --zone=internal --change-interface=eth1 sudo firewall-cmd --permanent --zone=internal --add-service=corosync sudo firewall-cmd --permanent --zone=internal --add-rich-rule='rule protocol value="112" accept' sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https
-
禁用 firewalld 开机自启?不推荐,但可设为
inactive后手动管控
更稳妥做法是保留 firewalld,但确保规则持久化并重载:sudo firewall-cmd --reload # 生效 --permanent 规则 sudo firewall-cmd --runtime-to-permanent # 同步当前运行时规则到磁盘(慎用)
验证是否生效,别只看 --list-all
- 查 VRRP 是否已放行:
sudo firewall-cmd --permanent --list-rich-rules | grep 112
- 查 Corosync 端口是否在
internal区域生效:sudo firewall-cmd --zone=internal --list-ports
- 在 backup 节点抓包确认 VRRP 包到达:
sudo tcpdump -i eth1 vrrp -n
若无输出,说明防火墙或网络层拦截了 VRRP。
不复杂但容易忽略。











