如何使用Firewalld安全配置Galera集群节点?
配置Galera集群Firewalld自定义区域后节点无法正常退出/加入集群的问题解决建议
问题描述
配置Galera集群节点安全策略时遇到以下问题:此前仅开放所需端口时集群运行正常,现在希望进一步限制访问权限,只允许集群内其他节点与该节点通信,因此创建了自定义Firewalld区域。但使用该区域后,节点无法正常退出集群或重新加入集群,切换回原有区域后才能恢复正常,推测是区域配置存在错误。
环境信息
- 操作系统:Almalinux 8
- 数据库:MariaDB 10.6
- 防火墙:Firewalld
当前自定义区域XML配置
<?xml version="1.0" encoding="utf-8"?> <zone target="DROP"> <short>A_Node</short> <description>Zone for node of Galera Cluster</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <!-- Node A Rules --> <rule family="ipv4"> <source address="3.3.3.3"/> <service name="mysql"/> </rule> <rule family="ipv4"> <source address="3.3.3.3"/> <port port="3306" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="3.3.3.3"/> <port port="4444" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="3.3.3.3"/> <port port="4567" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="3.3.3.3"/> <port port="4567" protocol="udp"/> </rule> <rule family="ipv4"> <source address="3.3.3.3"/> <port port="4568" protocol="tcp"/> </rule> <!-- Node B Rules --> <rule family="ipv4"> <source address="4.4.4.4"/> <service name="mysql"/> </rule> <rule family="ipv4"> <source address="4.4.4.4"/> <port port="3306" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="4.4.4.4"/> <port port="4444" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="4.4.4.4"/> <port port="4567" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="4.4.4.4"/> <port port="4567" protocol="udp"/> </rule> <rule family="ipv4"> <source address="4.4.4.4"/> <port port="4568" protocol="tcp"/> </rule> <!-- Node C Rules --> <rule family="ipv4"> <source address="5.5.5.5"/> <service name="mysql"/> </rule> <rule family="ipv4"> <source address="5.5.5.5"/> <port port="3306" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="5.5.5.5"/> <port port="4444" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="5.5.5.5"/> <port port="4567" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="5.5.5.5"/> <port port="4567" protocol="udp"/> </rule> <rule family="ipv4"> <source address="5.5.5.5"/> <port port="4568" protocol="tcp"/> </rule> <!-- Node D Rules --> <rule family="ipv4"> <source address="6.6.6.6"/> <service name="mysql"/> </rule> <rule family="ipv4"> <source address="6.6.6.6"/> <port port="3306" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="6.6.6.6"/> <port port="4444" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="6.6.6.6"/> <port port="4567" protocol="tcp"/> </rule> <rule family="ipv4"> <source address="6.6.6.6"/> <port port="4567" protocol="udp"/> </rule> <rule family="ipv4"> <source address="6.6.6.6"/> <port port="4568" protocol="tcp"/> </rule> </zone>
问题分析与修复建议
核心问题点
- 未允许回环接口流量:
target="DROP"的区域默认拒绝所有未明确允许的流量,包括本地回环接口(lo,IP为127.0.0.1)的流量。Galera节点在退出或重新加入集群时,需要通过回环接口进行本地进程通信,被拒绝后会导致操作失败。 - 规则冗余:每个节点下同时配置了
<service name="mysql"/>和<port port="3306" protocol="tcp"/>,而mysql服务本身已经包含3306端口,重复配置无意义且增加维护成本。 - 缺少ICMP流量允许:集群节点之间需要ICMP包(如ping、MTU检测)维持网络连通性,DROP区域默认拒绝这些流量,可能导致节点间心跳检测失败,影响集群状态同步。
具体修复步骤
1. 添加回环接口允许规则
在XML配置中加入回环IP的允许规则,或者通过命令添加回环接口到区域:
- XML方式添加:
<!-- 在现有service配置后添加 --> <rule family="ipv4"> <source address="127.0.0.1"/> <accept/> </rule> <rule family="ipv6"> <source address="::1"/> <accept/> </rule> - 命令行方式:
firewall-cmd --zone=A_Node --add-interface=lo --permanent firewall-cmd --reload
2. 移除冗余规则
删除每个节点下的<service name="mysql"/>或<port port="3306" protocol="tcp"/>,二者保留其一即可(推荐保留service配置,更符合Firewalld规范)。
3. 添加ICMP流量允许
允许集群节点间的ICMP流量,确保网络连通性检测正常:
- XML方式(针对单个节点):
<rule family="ipv4"> <source address="3.3.3.3"/> <icmp-block-inversion/> <accept/> </rule> <!-- 对节点B/C/D重复上述规则 --> - 命令行方式:
# 先启用ICMP反转(允许所有未明确阻止的ICMP) firewall-cmd --zone=A_Node --add-icmp-block-inversion --permanent # 允许每个集群节点的ICMP流量 firewall-cmd --zone=A_Node --add-source=3.3.3.3 --permanent firewall-cmd --zone=A_Node --add-source=4.4.4.4 --permanent firewall-cmd --zone=A_Node --add-source=5.5.5.5 --permanent firewall-cmd --zone=A_Node --add-source=6.6.6.6 --permanent firewall-cmd --reload
4. 优化规则结构(可选)
将所有集群节点的规则合并,减少重复配置:
<rule family="ipv4"> <source address="3.3.3.3"/> <source address="4.4.4.4"/> <source address="5.5.5.5"/> <source address="6.6.6.6"/> <service name="mysql"/> <port port="4444" protocol="tcp"/> <port port="4567" protocol="tcp"/> <port port="4567" protocol="udp"/> <port port="4568" protocol="tcp"/> <accept/> </rule>
5. 验证配置
修改后重新加载规则并检查:
firewall-cmd --reload firewall-cmd --zone=A_Node --list-all
确认回环接口、集群节点IP、所需端口/服务均已被允许。
内容的提问来源于stack exchange,提问作者Anthonee Williams
相关产品推荐
相关产品推荐

