MySQL装好之后,很多人发现只能在本机用localhost登录,换一台机器连接就直接被拒绝。这个问题的根源通常不在权限,而在服务端根本没监听外部网卡,或者监听了但账号没有被授权远程访问。要真正打通MySQL的网络连接,需要从配置文件、账号授权、防火墙三个层面依次检查。本文以Linux和Windows环境为例,完整梳理一遍配置流程和排错方法。

一、修改配置文件让MySQL监听外部地址
MySQL默认的bind-address通常是127.0.0.1,含义是只接受来自本机回环接口的连接。可以用下面的命令确认当前监听情况:
netstat -anp | grep 3306 # 或者 ss -tlnp | grep mysql
如果输出中显示的是127.0.0.1:3306,说明只监听了本机,远程机器无论怎么连都到不了服务端。此时需要编辑配置文件。Linux下一般是/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,Windows下则是在安装目录下的my.ini。找到[mysqld]段落,把bind-address改成服务器的实际网卡地址,或者干脆注释掉这一行让MySQL监听所有网卡:
[mysqld] # 监听所有网卡的3306端口 bind-address = 0.0.0.0 # 也可以指定具体IP # bind-address = 192.168.1.100 port = 3306
这里有两个细节需要注意。第一,如果配置文件里出现skip-networking,必须把它注释掉,这个参数会彻底禁用TCP/IP连接,只允许本机socket方式访问,留着它改bind-address是无效的。第二,0.0.0.0表示接受任意网卡的连接,方便但暴露面大,如果服务器有多个网卡,建议绑定内网那块网卡的具体IP,公网网卡就不要监听了。改完之后重启服务:
# Linux (systemd) systemctl restart mysqld # 或 Debian/Ubuntu systemctl restart mysql # Windows 命令行(管理员权限) net stop mysql && net start mysql
重启后再次执行ss -tlnp,看到0.0.0.0:3306就说明监听配置生效了。
二、账号授权:允许用户从远程主机登录
监听打通只是第一步,MySQL的账号本身就带有主机限制。比如root@localhost这个账号,只允许从本机登录,远程连过来即使密码正确也会被拒绝。可以在服务器上登录MySQL后执行:
-- 查看账号允许的主机 SELECT user, host FROM mysql.user; -- 创建一个允许远程访问的账号 CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'192.168.1.%'; FLUSH PRIVILEGES;
host字段的写法有讲究。%代表任意主机,配置最省事但风险也最大;192.168.1.%限定某个网段;也可以写精确的IP或网段。生产环境强烈建议按需收紧,比如应用服务器只有两台,那就分别授权两个IP,而不是图方便用%。
如果用的是MySQL 8.0及以上版本,还要留意默认的认证插件。8.0默认使用caching_sha2_password,一些老版本的客户端驱动不支持,会报认证失败的错误。可以单独为该账号改回旧插件:
ALTER USER 'appuser'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
另外别忘了用SHOW GRANTS FOR 'appuser'@'192.168.1.%';检查一下权限是否真的授予成功,避免漏掉某条权限导致后续操作报错。
三、防火墙与安全组放行3306端口
前两步都做完还是连不上,大概率是防火墙拦截了。Linux上常用的是firewalld和iptables两种:
# firewalld (CentOS/RHEL) firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload # Ubuntu的ufw ufw allow 3306/tcp # iptables方式 iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
云服务器还有一层安全组规则,需要到云厂商控制台里放行3306端口,并限制来源IP。安全组不放行的话,系统内部防火墙怎么配都没用,这是云环境排错时最容易忽略的一环。建议来源IP只填应用服务器或办公网出口IP,不要填0.0.0.0/0把数据库直接暴露在公网上。数据库端口暴露公网后,几小时内就会被扫描爆破,风险极高。
客户端侧可以先用telnet 服务器IP 3306或mysql -h 服务器IP -u appuser -p测试连通性。如果telnet都不通,问题在网络层或防火墙;telnet通但登录失败,问题在账号授权或密码。
四、常见连接报错排查与安全加固
排错时按报错信息定位效率最高。报Connection refused说明端口没监听或防火墙REJECT,回到第一步检查bind-address;报Host xxx is not allowed to connect说明监听正常,是账号的host限制没放开,回到第二步;报Access denied则是用户名密码错误或认证插件不兼容;报Host is blocked because of many connection errors是因为短时间失败次数太多触发了拦截,执行FLUSH HOSTS;(8.0之前)或mysqladmin flush-hosts即可恢复。
安全方面,远程连接建议再补几层保护。网络层尽量走内网或VPN,不直接暴露公网;账号层用强密码并限制host范围;传输层开启SSL,MySQL 8.0默认生成了证书,在配置文件中加上require_secure_transport = ON可以强制客户端走加密连接;监控层面开启慢查询日志和连接数告警,防止被异常流量拖垮。配置完成后,把整套连接参数记录下来,包括监听地址、账号host规则、防火墙策略,方便后续迁移或审计时快速对照。