MySQL部署到服务器后,经常会遇到在本地命令行可以登录,但使用笔记本或另一台机器上的程序连接时被拒绝的情况。这个问题通常不是数据库坏了,而是MySQL自身安全策略、系统网络配置共同起作用的结果。要把远程连接打通,需要从服务监听、账号权限、防火墙三处逐一确认。

一、检查MySQL服务监听地址
MySQL启动后会绑定一个IP地址来监听客户端请求。在多数Linux发行版中,默认配置文件里写了bind-address = 127.0.0.1,意思是只接受本机回环地址的连接。此时即便账号允许远程,TCP层根本收不到外部数据包。
我们需要编辑配置文件,常见路径为/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf。将bind-address改为0.0.0.0表示监听所有网卡,或直接用井号注释该行。修改后必须重启服务才能生效。
# 查看当前监听情况 ss -tlnp | grep 3306 # 编辑配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 找到 bind-address = 127.0.0.1 # 改为 bind-address = 0.0.0.0 # 重启MySQL sudo systemctl restart mysql
改为0.0.0.0后,任何能访问该服务器3306端口的机器都能建立TCP连接,但是否能登录成功还要看MySQL里的账号授权。生产环境如果只想给固定IP开放,可以在云安全组限制来源,而不必在bind-address上做精细控制。
二、配置用户远程访问权限
MySQL的权限系统把“哪个用户从哪台主机连接”作为授权维度。执行SELECT user,host FROM mysql.user;会看到很多账号的host是localhost,这表示只允许本机连。要让外部IP连入,必须创建host为客户端IP或百分号的账号,并授予库表权限。
下面示例创建一个允许从任意IP连接的用户,并赋予test库全部权限。实际运用中建议写具体IP提升安全性。注意MySQL 8.0之后要先建用户再授权,不能像旧版用GRANT隐式建户。
-- MySQL 8.0 及以上 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON test.* TO 'remote_user'@'%'; FLUSH PRIVILEGES; -- 限定某IP段(如192.168.1.网段) CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!'; GRANT SELECT,INSERT,UPDATE ON test.* TO 'remote_user'@'192.168.1.%'; FLUSH PRIVILEGES;
授权后可用SHOW GRANTS FOR 'remote_user'@'%';核对。如果之前用root远程连,官方并不推荐把root的host改成百分号,容易成为攻击入口。独立远程账号配合最小权限原则更稳妥。
三、排查防火墙与云安全组
即便MySQL监听正常、账号有权限,服务器防火墙也可能丢弃3306端口的包。Ubuntu默认用ufw,CentOS常用firewalld。另外云厂商有独立安全组,属于外层虚拟防火墙,两边都要放通。
本地防火墙放通命令如下,云控制台则需在入站规则添加TCP 3306来源IP。排查时可在客户端用telnet或nc测试端口通断,避免盲目改数据库配置。
# ufw 放通 sudo ufw allow 3306/tcp # firewalld 放通 sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload # 客户端测试端口 nc -zv 服务器IP 3306
有时公司网络出口做了限制,从办公网连不上但手机热点可以,这不属于服务端问题。可让运维确认出口策略,或采用SSH隧道方式绕开直连限制,后面会简单说明。
四、使用SSH隧道作为替代方案
如果安全规范要求数据库绝不暴露公网,又需要临时远程维护,SSH隧道是最省事的方案。它在本地和服务器间建立加密通道,把本地端口转发到远端127.0.0.1的3306,对MySQL来说连接仍来自本机。
执行下面命令后,本地程序连127.0.0.1:13306就等于连了服务器MySQL,且不需要改bind-address和授权host。适合运维排查,不适合高并发业务长期用。
ssh -N -L 13306:127.0.0.1:3306 user@服务器IP # 另一个终端连接 mysql -h 127.0.0.1 -P 13306 -u remote_user -p
隧道方案把认证交给SSH,数据库层压力小,也不会因暴露端口增加被扫风险。但隧道依赖跳板机稳定,断线会让业务连接全部失败,因此仅作补充手段。
五、常见错误与处理
报错ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect说明账号host不匹配,回去检查mysql.user表。报错Can't connect to MySQL server on 'IP' (timed out)一般是防火墙或bind-address问题。认证失败Access denied for user则是密码或权限粒度不对。
推荐按“端口通不通、监听对不对、账号允不允许、密码正不正确”的顺序排错。每改一项就用客户端实测,不要同时改多处导致分不清哪步生效。养成修改前备份配置文件与mysql库的习惯,可避免误操作锁死管理入口。
| 现象 | 可能原因 | 首要动作 |
|---|---|---|
| 连接超时 | bind-address限制或防火墙 | ss查监听,ufw放端口 |
| Host not allowed | 用户host非客户端IP | CREATE USER或改host |
| Access denied | 密码错或库权限不足 | SHOW GRANTS核对 |
把上述监听、授权、网络三层都打通,MySQL远程连接就能稳定工作。后续可结合SSL加密连接进一步提升传输安全,尤其在跨公网场景下十分必要。