You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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>

问题分析与修复建议

核心问题点

  1. 未允许回环接口流量:target="DROP"的区域默认拒绝所有未明确允许的流量,包括本地回环接口(lo,IP为127.0.0.1)的流量。Galera节点在退出或重新加入集群时,需要通过回环接口进行本地进程通信,被拒绝后会导致操作失败。
  2. 规则冗余:每个节点下同时配置了<service name="mysql"/>和<port port="3306" protocol="tcp"/>,而mysql服务本身已经包含3306端口,重复配置无意义且增加维护成本。
  3. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:27:34