MySQL默认端口是3306,但实际部署中可能被修改(如多实例、云数据库、容器化),必须通过ss/netstat查运行端口、grep查配置文件、Docker映射端口等方式确认真实端口,否则放行错误端口将导致连接失败。

MySQL 默认端口是什么,为什么必须确认它
MySQL 默认监听 3306 端口,但实际部署中可能被修改(比如多实例、云数据库、容器化部署)。不确认真实端口就放行 3306,很可能连不上——尤其是用 mysqld --port=3307 启动,或配置文件里写了 port = 3308。
- 查正在运行的 MySQL 实际端口:
sudo ss -tlnp | grep mysqld或netstat -tlnp | grep mysql - 查配置文件设定:
grep "^port" /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf 2>/dev/null - Docker 启动时显式映射了端口(如
-p 3307:3306),则需放行宿主机的3307,而非容器内3306
firewalld 放行 MySQL 端口的正确命令
CentOS/RHEL 7+ 默认用 firewalld,直接开放端口比添加服务更可控,避免因 mysql 服务定义不匹配导致失效。
sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload
- 务必加
--permanent,否则重启 firewalld 后规则丢失 -
--reload是生效必需步骤,仅--add-port不会立即放行 - 若 MySQL 绑定到特定 IP(如
bind-address = 192.168.1.100),防火墙规则仍只需放行端口,无需额外限制源地址(那是iptables或网络层的事)
ufw 下如何安全放行,避免全网开放
Ubuntu/Debian 常用 ufw,默认策略是拒绝入站。只开 3306 端口不够安全,应限制访问来源 IP 段。
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp sudo ufw reload
- 不写
from就是允许任意 IP 连接,等同于暴露数据库到公网 - 若需从单个跳板机访问,写成
from 10.0.5.22更精确 -
ufw status verbose可确认规则是否已启用且顺序正确(ufw 按规则顺序匹配,靠前的 deny 可能拦截后续 allow)
Windows Server 上通过 PowerShell 配置防火墙
Windows Server 的 MySQL 若用于内部系统集成,常被忽略防火墙设置。图形界面容易点错,PowerShell 命令更可靠。
New-NetFirewallRule -DisplayName "MySQL Server" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow -Enabled True
- 必须指定
-Direction Inbound,出站规则对客户端连接无影响 - 若 MySQL 服务运行在非标准账户下(如 LocalSystem),规则仍生效;但若启用了“仅允许安全连接”,还需额外配置 IPsec 策略
- 执行后检查:
Get-NetFirewallRule -DisplayName "MySQL Server" | Select-Object Enabled, Direction, Action
实际放行后仍连不上,大概率是 MySQL 自身没监听外网(bind-address = 127.0.0.1)、用户权限没授权远程主机(GRANT ... ON . TO 'user'@'%' IDENTIFIED BY 'pwd'),或者云平台(阿里云/腾讯云)的安全组没同步放开——防火墙只是其中一环,别只盯着它调。










