必须将bind-address设为0.0.0.0(或指定ip),否则mysql 8.0默认监听127.0.0.1导致远程请求根本无法到达服务端;还需创建指定mysql_native_password插件的用户、开放防火墙及云安全组3306端口,并刷新权限。

bind-address 必须设为 0.0.0.0,否则请求根本进不来
MySQL 8.0 默认只监听 127.0.0.1:3306,外网流量连 TCP 握手都触发不了——不是连不上,是压根没收到。别指望改用户权限或防火墙能绕过这一层。
配置文件位置因系统而异:/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)、/etc/my.cnf(CentOS/RHEL)、C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(Windows)。在 [mysqld] 段下确认或添加:
bind-address = 0.0.0.0
注意:bind-address = :: 或留空会被 MySQL 8.0 静默忽略,回退到 127.0.0.1;改完必须重启服务:sudo systemctl restart mysql(Linux)或 net stop mysql80 && net start mysql80(Windows)。
验证是否生效:运行 ss -tlnp | grep :3306,输出中必须含 *:3306 或 0.0.0.0:3306,不能只有 127.0.0.1:3306。
CREATE USER 必须显式指定 mysql_native_password 插件
MySQL 8.0 默认用 caching_sha2_password,但绝大多数外网测试工具(Navicat、DBeaver、旧版 PyMySQL、PHP mysqli)不兼容,直连会卡在认证阶段,报错 ERROR 2059 (HY000)。
不要碰 root 用户,也不要执行 UPDATE user SET host = '%'(MySQL 8.0 会报 ERROR 1396 并损坏系统表):
- 新建专用用户,限定来源 IP 段更安全:
CREATE USER 'test_user'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2026'; - 若测试环境需从任意公网 IP 连接(仅限临时外网调试),可用
'test_user'@'%',但务必搭配强密码和最小权限 - 授权后立刻执行:
FLUSH PRIVILEGES;(权限缓存在内存,不刷新等于没生效) - 验证插件是否正确:
SELECT user, host, plugin FROM mysql.user WHERE user = 'test_user';,plugin列必须是mysql_native_password
防火墙和云安全组必须双向放行 3306
即使 MySQL 配置全对,连接仍可能卡在 TCP 层——现象是 ERROR 2003 (HY000): Can't connect to MySQL server,但 MySQL 错误日志里完全没记录,这是典型的静默丢包。
两处必须同时检查:
- 本地防火墙:
ufw allow 3306(Ubuntu)、firewall-cmd --permanent --add-port=3306/tcp(CentOS),改完记得ufw reload或firewall-cmd --reload - 云服务器安全组(阿里云/腾讯云/AWS):控制台里添加入方向规则,协议选
TCP,端口填3306,源 IP 建议写具体测试机公网 IP(如203.208.60.1/32),禁用0.0.0.0/0
测试连通性时,先用 telnet your-server-ip 3306 或 nc -zv your-server-ip 3306 确认端口可达,再试数据库客户端。
外网暴露 ≠ 开放所有权限,最小化原则不能妥协
生产环境严禁 GRANT ALL ON *.*,外网测试环境同样不能放松——哪怕只是临时用两天。一旦被扫描到,弱密码 + 全库权限 = 数据直接清空。
授权语句必须精确到库和操作:
- 只给业务需要的库:
GRANT SELECT, INSERT, UPDATE ON myapp_dev.* TO 'test_user'@'192.168.10.%'; - 禁止跨库访问:
GRANT ... ON *.*或ON %.*是高危行为 - 避免使用
@'%',优先用@'192.168.10.%'或具体 IP;如果真要外网连,至少加个临时 IP 白名单 - 考虑配合
mysql_secure_installation删除匿名用户、禁用 root 远程登录、移除 test 库
最常被忽略的一点:MySQL 本身不加密传输,外网走明文 MySQL 协议风险极高。如果测试必须走公网,强烈建议套一层 SSH 隧道或用 Cloudflare Tunnel 代理,而不是裸开 3306。











