mysql远程连接失败主因是四层拦截:用户host权限未设为'%'或具体ip、bind-address未配0.0.0.0、系统防火墙(ufw/firewalld/windows防火墙)未放行3306端口、云平台安全组未开放。

MySQL 用户权限没开远程访问,连不上是常态
默认安装的 MySQL 只监听 127.0.0.1,哪怕你改了 bind-address,用户账户本身也没授权从其他 IP 连入。常见错误现象是客户端报错:Host 'x.x.x.x' is not allowed to connect to this MySQL server。
实操建议:
- 先用
SELECT host, user FROM mysql.user;看当前用户允许的 host;本地账户(如'root'@'localhost')不会响应远程连接 - 新增或修改用户时,host 字段不能写
'localhost',得用'%'(任意主机)或具体 IP,例如:CREATE USER 'app'@'192.168.1.100' IDENTIFIED BY 'pwd'; - 别忘了
GRANT ALL ON *.* TO 'app'@'%';之后执行FLUSH PRIVILEGES;,否则权限不生效 - MySQL 8.0+ 默认认证插件是
caching_sha2_password,某些旧客户端不兼容,可临时改为:ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
bind-address 配置不对,MySQL 根本不听外网请求
即使用户权限开了,MySQL 进程本身没绑定到通外网的地址,TCP 层就拦死了。典型表现是 telnet 或 nc 测试端口直接 timeout,而不是拒绝连接(refused)。
实操建议:
- 检查配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),确认bind-address不是127.0.0.1;设为0.0.0.0表示监听所有 IPv4 接口 - MySQL 5.7+ 支持
bind-address = *同时监听 IPv4/IPv6,但部分发行版(如 Ubuntu 22.04)会因 systemd 的PrivateNetwork=true导致该设置失效,此时仍需用0.0.0.0 - 改完必须重启服务:
sudo systemctl restart mysql;用sudo ss -tlnp | grep :3306验证监听地址是否变成*:3306或0.0.0.0:3306
Linux 防火墙(iptables / ufw)默认拦掉 3306 端口
很多用户以为开了 MySQL 权限和 bind-address 就万事大吉,结果卡在系统级防火墙。现象是:本地能连,局域网其他机器 telnet mysql_host 3306 直接超时。
实操建议:
- Ubuntu/Debian 上如果启用了
ufw,运行sudo ufw status verbose查看状态;若 Active,加规则:sudo ufw allow 3306(更安全的做法是限制源 IP:sudo ufw allow from 192.168.1.0/24 to any port 3306) - CentOS/RHEL 7+ 默认用
firewalld,执行:sudo firewall-cmd --permanent --add-port=3306/tcp,然后sudo firewall-cmd --reload - 跳过防火墙测试:临时关掉(
sudo ufw disable或sudo systemctl stop firewalld),确认连通性后再配策略——别让防火墙和 MySQL 配置问题混在一起排查
Windows 防火墙入站规则没放行 MySQL 服务或端口
Windows Server 或桌面版装 MySQL,常忽略自带防火墙。现象是:同一局域网内 ping 通、telnet win_mysql_ip 3306 失败,且 Windows 事件日志里能看到被阻止的连接记录。
实操建议:
- 进「高级安全 Windows 防火墙」→「入站规则」→ 新建规则 → 选择「端口」→ TCP 3306 → 允许连接 → 按需选域/专用/公用配置文件
- 或者用命令快速添加(管理员权限运行 PowerShell):
New-NetFirewallRule -DisplayName "MySQL Server" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow - 注意:如果 MySQL 安装为服务,且服务名不是默认的
MySQL(比如叫MySQL80),规则里“程序”路径要指向正确的mysqld.exe,否则仅开端口可能不够(尤其启用强制完整性级别时)
真正卡住人的,往往不是单点配置,而是 MySQL 用户 host、bind-address、系统防火墙、网络设备 ACL 四层叠加拦截。每层都得单独验证,别指望改一处就全通——尤其是云服务器,安全组规则(AWS Security Group / 阿里云 ECS 安全组)那层最容易被漏掉。










