
摘要:本文结合数据中心运维的故障实践,深入分析 Ubuntu 24.04 系统的香港服务器www.a5idc.com在配置防火墙时,firewalld 与 iptables 规则冲突导致 MySQL 无法远程连接的典型问题。文章涵盖硬件环境、产品参数、内核 Netfilter 工作机制、防火墙规则对比、完整排查步骤、解决方案与验证方法,并通过代码示例与表格评估帮助读者准确定位与修复类似故障。
一、项目背景与机房硬件配置
我们故障排查的A5数据香港机房的物理服务器是在机柜式数据中心部署的业务数据库节点,具体配置如下:
| 硬件项目 | 参数 |
|---|---|
| 香港服务器型号 | Dell PowerEdge R650 |
| CPU | 2 × Intel Xeon Silver 4310 (12核/24线程) |
| 内存 | 128 GB DDR4 ECC |
| 磁盘 | 2 × 1.92 TB NVMe SSD(RAID1) |
| 网络 | 2 × 25 GbE BGP直连 |
| 系统盘 | Ubuntu Server 24.04 LTS |
| MySQL 版本 | MySQL 8.0.35 |
| 内核版本 | 5.15(Ubuntu 默认内核) |
业务需求是允许来自应用服务器(10.0.10.0/24)和运维机(172.16.1.100)的远程访问 MySQL(TCP/3306)。
二、故障现象
部署完成后,远程应用服务器无法连接数据库:
bash
# 从应用服务器
$ mysql -h 10.0.20.50 -P 3306 -u appuser -p
ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.20.50' (110)
本机访问正常:
bash
$ mysql -u root -p -e "SHOW DATABASES;"
说明数据库服务本身正常。
三、初步分析:Ubuntu 防火墙机制
Ubuntu 24.04 默认提供 ufw(Uncomplicated Firewall) 作为用户防火墙前端,底层依赖 iptables/nftables。
但在该服务器上,我们为了精细控制分段网络策略,引入了 firewalld。这在 Ubuntu 上并非默认,而是手动安装的:
bash
$ sudo apt install firewalld
firewalld 运行时,会动态生成 iptables(或 nftables)规则。
关键点:
- iptables:传统 Linux 防火墙接口,基于 Netfilter。
- firewalld:动态管理防火墙策略,会改写底层 iptables/nftables 配置。
- nftables:新一代防火墙框架,在 Ubuntu 24.04 中逐渐替代 iptables。
当同时启用多种防火墙管理工具时,可能出现规则冲突或覆盖。
四、深入排查防火墙规则冲突
4.1 查看防火墙状态
先检查各防火墙服务状态:
bash
$ systemctl status ufw firewalld
输出示例:
ufw.service - Status: inactive
firewalld.service - Active: active
说明只启用了 firewalld。
4.2 检查防火墙规则
获取 firewalld 区域策略:
bash
$ sudo firewall-cmd --list-all-zones
输出示例(摘选):
public (active)
ports: 22/tcp 80/tcp
sources:
services: ssh http
注意:未包含 3306/tcp。
同时检查底层 iptables 规则:
bash
$ sudo iptables -L -n --line-numbers
可能看到:
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 10.0.10.0/24 0.0.0.0/0 tcp dpt:3306
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
此处 iptables 显式允许了 10.0.10.0/24 的 3306,但 firewalld 却未开放该端口。
结论:
firewalld 与 iptables 规则同时存在,但 firewalld 的默认策略(zone 默认 policy DROP)覆盖了 iptables 的底层规则。firewalld 在 netfilter 链中插入更靠前的规则,导致 iptables 允许规则失效。
五、关键技术细节解析
5.1 Netfilter 规则执行顺序
Linux 防火墙规则执行顺序如下:
PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTING
firewalld 会动态管理 filter 表的 INPUT 链,当 firewalld rule 插入在默认策略前面时,底层 iptables ACCEPT 可能被覆盖。
5.2 firewalld 与 iptables 的协同运行机制
- firewalld 通过动态更改 nftables / iptables 规则表实现 zone 管理。
- 同时存在时,firewalld 可能清空或重写手动设置的 iptables 规则。
- 手动 iptables 规则若插入不当或顺序靠后,将不会生效。
六、解决方案
6.1 推荐做法(生产环境)
方案一:统一使用 firewalld 管理防火墙策略
- 移除手动 iptables 规则。
- 通过 firewalld 放通 MySQL:
bash
# 永久开放 3306
sudo firewall-cmd --permanent --add-port=3306/tcp
# 也可指定来源网段
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.10.0/24" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
- 查看已应用规则:
bash
sudo firewall-cmd --list-ports
若已看到 3306/tcp 即成功。
6.2 替代做法:禁用 firewalld,仅使用 iptables
当业务更偏向传统 iptables 配置时:
bash
sudo systemctl disable --now firewalld
然后使用 iptables 恢复规则:
bash
sudo iptables -F
sudo iptables -A INPUT -p tcp --dport 3306 -s 10.0.10.0/24 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables-save > /etc/iptables/rules.v4
说明:此方法需确保
iptables-persistent安装并保存规则。
七、防火墙规则对比评估表
| 项目 | firewalld | iptables | UFW |
|---|---|---|---|
| 是否默认安装 | 否(需手动) | 是 | 是 |
| 动态管理规则 | ✓ | ✗(静态) | ✓ |
| 复杂策略支持 | 高 | 中 | 低 |
| 与系统集成 | 中 | 高 | 高 |
| 适合场景 | 多网段动态 | 传统固定规则 | 快速简单场景 |
八、全面验证
8.1 本地 TCP 监听验证
bash
$ sudo ss -tunlp | grep 3306
确认 MySQL 监听所有地址:
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=12))
8.2 防火墙连通性验证
从允许网段发起 telnet:
bash
telnet 10.0.20.50 3306
出现连接即成功。
8.3 MySQL 访问权限验证
确保 MySQL 授权到远程主机/IP:
sql
GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'10.0.10.%' IDENTIFIED BY 'StrongP@ss';
FLUSH PRIVILEGES;
九、实战总结与建议
- 避免混用防火墙管理工具:在 Ubuntu 24.04 上同事运行 firewalld 与手动 iptables 很容易引发规则覆盖与冲突。
- 统一策略管控:选定一个防火墙管理工具,全生命周期用它管理规则;若需切换,清理旧规则。
- 日志与测试 :利用
sudo journalctl -u firewalld和sudo iptables -L -n等命令查看规则是否按预期应用。 - 网络架构优化:在数据中心架构中使用安全组、交换机 ACL 配合服务器防火墙,可以实现更细粒度访问控制。