必须先确认mysql实际监听端口(如ss -tlnp | grep mysqld),再按系统选用firewalld/ufw/powershell命令放行对应端口,最后验证规则生效且bind-address与用户权限匹配。

直接说结论:只放行 3306 端口不等于能连上 MySQL,必须先确认它真在用这个端口,再按系统选对命令,最后验证是否生效。
怎么确认 MySQL 实际监听的端口
很多人卡在“明明开了 3306,还是连不上”,根本原因是 MySQL 没在用 3306。比如启动时加了 --port=3307,或配置文件里写了 port = 3308,甚至 Docker 映射成 -p 3309:3306——这时防火墙放行 3306 就是白忙。
- Linux 查运行中端口:
sudo ss -tlnp | grep mysqld或sudo netstat -tlnp | grep mysql - 查配置文件:
grep "^port" /etc/my.cnf /etc/mysql/my.cnf 2>/dev/null - Docker 场景下重点看
docker ps输出的 PORTS 列,放行的是左边宿主机端口(如0.0.0.0:3307->3306/tcp中的3307)
Linux 上用 firewalld 开放端口(CentOS/RHEL)
firewalld 是默认工具,但常见错误是漏掉 --permanent 或忘了 --reload,导致重启后规则消失或压根没生效。
- 放行真实端口(假设是 3306):
sudo firewall-cmd --permanent --add-port=3306/tcp - 立即生效:
sudo firewall-cmd --reload - 验证:
sudo firewall-cmd --list-ports应该看到3306;sudo firewall-cmd --list-all能看到完整规则 - 不要用
--add-service=mysql,因为 firewalld 自带的mysql服务定义可能和你实际端口不匹配
Linux 上用 ufw 开放端口(Ubuntu/Debian)
ufw 默认拒绝所有入站,只执行 sudo ufw allow 3306/tcp 是最危险的操作——它等于把数据库暴露给整个互联网。
- 安全做法是限制来源:
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp - 如果只允许某台跳板机:
sudo ufw allow from 10.0.5.22 to any port 3306 proto tcp - 务必 reload:
sudo ufw reload - 检查顺序:
sudo ufw status verbose,确保你的allow规则没被前面的deny拦住
Windows 上用 PowerShell 配置入站规则
图形界面点错很常见,PowerShell 命令更可靠,而且能精确控制作用域(域、专用、公用网络)。
- 一条命令搞定(适用于所有配置文件):
New-NetFirewallRule -DisplayName "MySQL 3306" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow -Profile Domain,Private,Public - 验证:
Get-NetFirewallRule -DisplayName "MySQL 3306" | Get-NetFirewallPortFilter - 注意:如果 MySQL 只绑定了内网 IP(如
bind-address = 192.168.1.100),这条防火墙规则仍有效——它只管端口通不通,不管 MySQL 自己愿不愿意接
真正容易被忽略的点是:防火墙只是“路障”,不是“门禁”。即使端口通了,MySQL 还要满足两个条件才能响应连接——bind-address 得设成 0.0.0.0(或对应网卡 IP),且用户得有 @'%' 或具体远程 IP 的权限。三者缺一不可。











