mysql外网访问
MySQL默认只监听127.0.0.1,外网访问这个设计初衷是外网访问安全的。但现实里,外网访问你迟早得让外网访问它——比如给同事开个只读账号查数据,外网访问或者让云服务器上的外网访问应用连本地开发库。直接改配置文件是外网访问最快的路子,但也是外网访问最容易踩坑的。
先看你的外网访问MySQL装在哪儿。Linux上多半是外网访问/etc/mysql/my.cnf,Windows是外网访问my.ini,Mac用homebrew的外网访问话在/usr/local/etc/my.cnf。找到[mysqld]段落,外网访问把bind-address那行改成0.0.0.0,外网访问或者干脆注释掉。外网访问改完重启服务,外网访问这一步是基础,但只做这一步,等于把家门钥匙挂在了门框上。
真正麻烦的是权限表。MySQL的user表里,root默认只允许localhost登录。你得单独建一个账号,Host字段填'%',意思是不限来源IP。SQL长这样:
CREATE USER 'remote'@'%' IDENTIFIED BY '强密码'; GRANT SELECT ON yourdb.* TO 'remote'@'%'; FLUSH PRIVILEGES; 这里有个细节容易被人忽略——如果你用的是云服务器,光改MySQL没用。阿里云、腾讯云的安全组规则默认只放行22、80、443这类端口。你得去控制台手动加一条入方向规则,放行3306,源地址最好限制成你的固定IP,别写0.0.0.0/0。我见过有人图省事全放开了,第二天数据库就被勒索病毒加密了,那哥们儿后来在工位上抽了半包烟没说话。
防火墙那边也别漏了。Ubuntu的ufw或者CentOS的firewalld,记得把3306端口加进白名单。命令不复杂,但顺序错了会白折腾——先加规则再reload,别反着来。
测连通性的时候,别用ping,那玩意儿只测ICMP,测不出TCP端口通不通。用telnet或者nc,比如:
nc -zv 你的服务器IP 3306 如果返回connected,说明网络层通了。这时候再用Navicat或者命令行连,报错的话看提示——Access denied是账号权限问题,Can't connect是网络问题,分清楚能省一小时排查时间。
最后说个容易被忽略的坑:MySQL 8.0默认用了caching_sha2_password插件,老版本的客户端可能连不上。要么升级客户端驱动,要么在创建用户时指定mysql_native_password。我建议直接升级驱动,别用旧认证方式,安全性差一截。
外网访问这事儿,本质就是给数据库开个侧门。门开了,就得装好锁和监控。日志别忘了开,general_log能记录所有连接来源,出事儿能溯源。还有,别用root远程连,权限最小化原则比什么防火墙都管用。









