mysql连不上首要排查端口监听与防火墙配置:先用netstat或ss确认3306是否监听(如仅127.0.0.1则需改bind-address为0.0.0.0并重启),再检查系统防火墙(ufw/firewalld)及云安全组是否双重放行,且规则顺序和来源ip限制合理。

MySQL 启动后连不上,90% 是防火墙没配对——不是服务没起来,是流量根本进不来。
确认 MySQL 正在监听 3306 端口
别急着开防火墙,先看 MySQL 自己有没有“开门”。netstat -tlnp | grep :3306 或 ss -tlnp | grep :3306 能看到监听地址。如果只显示 127.0.0.1:3306,说明它压根不接受外部连接,此时开防火墙也没用;必须先改 my.cnf 里的 bind-address(比如设为 0.0.0.0 或具体内网 IP)并重启 mysqld。
ufw 下只放行指定 IP 访问 3306
ufw 默认宽松,sudo ufw allow 3306/tcp 是全放开,生产环境绝对不能这么干。要限制来源,用 from 参数:
-
sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp—— 单 IP -
sudo ufw allow from 10.0.2.0/24 to any port 3306 proto tcp—— 网段 - 执行后记得
sudo ufw status numbered确认规则已生效,且顺序合理(靠前的规则优先匹配)
firewalld 添加永久端口规则
firewall-cmd 的临时规则重启就丢,必须加 --permanent:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent-
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="172.16.0.0/12" port port="3306" protocol="tcp" accept' --permanent—— 更细粒度控制来源 - 改完必须
sudo firewall-cmd --reload,否则不生效 - 检查:运行
sudo firewall-cmd --list-all,确认 3306 出现在ports:行里
云服务器还要过安全组这一关
本地防火墙开了,netstat 也显示监听 0.0.0.0:3306,但还是连不上?大概率卡在云平台的安全组。阿里云、腾讯云、AWS 的控制台里,必须单独添加入方向规则:
- 协议类型选
TCP,端口范围填3306 - 源 IP 段务必收紧,比如
192.168.5.0/24或单个 IP203.0.113.45/32,绝不要填0.0.0.0/0 - 安全组规则和系统防火墙是“与”关系:两者都允许,连接才成功;任一拒绝,就断连
- 改完安全组,等 10–30 秒再测,部分平台有延迟
最容易被忽略的是 conntrack 超时——空闲连接可能被防火墙悄无声息地踢掉,现象是查询中途报 Lost connection to MySQL server during query,MySQL 日志却干净得像没发生过。这类问题得调 nf_conntrack_tcp_timeout_established,而不是反复查用户权限或 bind-address。











