Ubuntu 24.04系统 防火墙配置问题导致 MySQL 无法远程连接:firewalld 与 iptables 的冲突排查

摘要:本文结合数据中心运维的故障实践,深入分析 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 管理防火墙策略

  1. 移除手动 iptables 规则。
  2. 通过 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
  1. 查看已应用规则:
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 firewalldsudo iptables -L -n 等命令查看规则是否按预期应用。
  • 网络架构优化:在数据中心架构中使用安全组、交换机 ACL 配合服务器防火墙,可以实现更细粒度访问控制。
相关推荐
小北方城市网8 小时前
Spring Boot 接口开发实战:RESTful 规范、参数校验与全局异常处理
java·jvm·数据库·spring boot·后端·python·mysql
陈聪.8 小时前
HRCE简单实验
linux·运维·数据库
haluhalu.9 小时前
从 Linux 线程控制到 pthread 库
java·linux·服务器
2023自学中9 小时前
Cortex-M系列,Cortex-A系列,汇编启动文件的区别
linux·嵌入式硬件
APIshop9 小时前
实战代码解析:item_get——获取某鱼商品详情接口
java·linux·数据库
楼田莉子9 小时前
Linux系统小项目——“主从设计模式”进程池
linux·服务器·开发语言·c++·vscode·学习
洛_尘9 小时前
MySQL 5:增删改查操作
数据库·mysql
知数SEO9 小时前
Centos如何安装高版本Python
linux·python·centos
Source.Liu9 小时前
【IT工具】Ubuntu 环境下使用 Flask
linux·ubuntu·flask
xqhoj9 小时前
Linux学习指南(二)——进程
linux·运维·服务器