MySQL用户host设为%仍连不上,因需同时满足五层条件:MySQL监听外网、用户host匹配、系统防火墙放行、云安全组开放、SSL协议兼容。
MySQL 用户 host 设置为 % 为什么还是连不上
host 设为 % 只解决 mysql 层面的授权问题,不等于网络可达。常见现象是客户端报错 error 1045 (28000): access denied for user 或直接超时,其实根本没走到认证阶段。
实操建议:
- 确认用户实际生效的 host:执行
SELECT user, host FROM mysql.user WHERE user = 'your_user';,注意 MySQL 8.0+ 默认创建的是'user'@'localhost','user'@'%'是另一条独立记录 - host 用
%不能匹配 localhost(Unix socket 连接),远程连接必须走 TCP,测试时显式指定-h 服务器IP,别用-h 127.0.0.1混淆 - MySQL 8.0+ 默认认证插件是
caching_sha2_password,旧客户端可能不兼容,建用户时加IDENTIFIED WITH mysql_native_password
Linux 防火墙放行 3306 端口但依然拒绝连接
iptables/nftables 规则顺序和默认策略常被忽略。现象是 telnet 服务器 IP 3306 直接显示 Connection refused,而非 timeout —— 这说明请求压根没到 MySQL,被防火墙或服务监听配置拦下了。
实操建议:
- 先查 MySQL 是否监听外网:运行
ss -tlnp | grep :3306,看到0.0.0.0:3306或具体 IP 才对;若只有127.0.0.1:3306,需改bind-address = 0.0.0.0并重启 mysqld - firewalld 放行要指定服务名或端口:用
firewall-cmd --permanent --add-port=3306/tcp,别只加--add-service=mysql(该 service 默认只开 3306,但部分系统模板未启用) - 云服务器(如阿里云、AWS)安全组是独立一层,必须单独配置入方向规则,且优先级高于系统防火墙
MySQL 8.0 开启远程访问后 SSL 报错:SSL connection error: protocol version mismatch
MySQL 8.0 默认强制客户端使用 TLS 1.2+,但很多工具(尤其是老版本 phpMyAdmin、某些 JDBC 驱动)协商失败就直接断开,错误日志里会出现 Failed to set up SSL because of handshake error。
实操建议:
- 临时绕过(仅调试):客户端连接加参数
--ssl-mode=DISABLED,或 URL 中加&useSSL=false - 生产环境应配证书:在 MySQL 配置中设置
ssl-ca、ssl-cert、ssl-key,然后用SHOW VARIABLES LIKE '%ssl%';确认状态为YES - 若用自签名证书,客户端需显式信任 CA,比如 JDBC 要加
&serverSslCert=/path/to/ca.pem
Windows Server 上 MySQL 远程连接失败,但 Linux 客户端能连
本质是 Windows 防火墙默认阻止入站 TCP 连接,且规则按“应用路径”而非端口匹配。现象是 Windows 客户端 telnet 自己的 3306 成功,但外部连不上,netstat -an | findstr :3306 显示监听正常。
实操建议:
- 进“高级安全 Windows 防火墙”,新建入站规则 → 端口 → TCP 3306 → 允许连接 → 配置作用域(建议限制源 IP 段)
- 检查规则是否启用:右键规则 → “属性” → “常规”选项卡里“启用此规则”必须勾选
- 别依赖“公用/专用配置文件”自动切换,手动在两个配置文件里都启用该规则更稳妥
真正卡住人的从来不是单点配置,而是 MySQL 的 bind-address、用户 host、系统防火墙、云平台安全组、客户端 SSL 协商这五层叠加判断。漏掉任意一层,都会表现为“明明设了 % 却连不上”。

















