MySQL服务默认监听3306端口,需先确认systemctl status mysqld为active(running),再用ss -tlnp | grep :3306检查是否监听*:3306或0.0.0.0:3306,若仅127.0.0.1:3306则需修改my.cnf中bind-address并重启服务。

mysqld 服务默认监听 3306 端口,不配置防火墙规则就直接开放远程访问,等于把数据库裸奔在公网——哪怕只开了内网访问,也得明确放行,否则连本地应用都连不上。
怎么确认 MySQL 已启动且监听正确端口
先别急着配防火墙,得确保 mysqld 真正在跑、且没被绑定到 127.0.0.1 这种仅本地地址:
- 运行
systemctl status mysqld,状态必须是active (running) - 检查监听地址:
ss -tlnp | grep :3306,输出里应该有*:3306或具体 IP(比如0.0.0.0:3306),而不是只有127.0.0.1:3306 - 如果只看到
127.0.0.1,说明my.cnf里设置了bind-address = 127.0.0.1,得改成0.0.0.0或具体内网 IP,改完重启systemctl restart mysqld
firewalld 放行 3306 端口(CentOS/RHEL 7+)
firewalld 是默认防火墙,直接关掉不现实,正确做法是精准放行:
- 临时放行:
firewall-cmd --add-port=3306/tcp(重启后失效) - 永久放行:
firewall-cmd --add-port=3306/tcp --permanent - 重载规则:
firewall-cmd --reload - 验证是否生效:
firewall-cmd --list-ports应该输出3306/tcp
注意:不要用 --add-service=mysql,这个 service 定义在某些系统里并不存在或指向错误端口,硬写端口更可靠。
iptables 直接添加规则(CentOS 6 / Ubuntu 16.04 及更老版本)
如果系统用的是 iptables(比如 CentOS 6),命令完全不同:
- 允许本机所有 IP 访问 3306:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT - 只允许某段内网访问(例如
192.168.1.0/24):iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT - 保存规则(CentOS):
service iptables save;Ubuntu 则需用iptables-persistent工具固化
漏掉保存步骤,重启后规则就丢了——这是最常被忽略的一环。
SELinux 不关但要放行端口(生产环境推荐)
直接 setenforce 0 能绕过权限报错,但会掩盖真实问题。更稳妥的方式是让 SELinux 允许 mysqld 绑定到 3306:
- 检查当前上下文:
sestatus确认是enabled - 查看端口策略:
semanage port -l | grep mysql,正常应有mysql_port_t映射到3306 - 如果没有,手动添加:
semanage port -a -t mysql_port_t -p tcp 3306 - 无需重启服务,SELinux 规则立即生效
SELinux 的坑在于:它可能让你的 mysqld 启动成功,但客户端连不上,日志里却找不到明显错误——这种静默拒绝最难排查。


















