Ubuntu虚拟机中MySQL无法响应外部客户端连接请求求助
MySQL远程连接失败排查(Ubuntu 20.04.5 LTS)
问题描述
在全新Ubuntu 20.04.5 LTS虚拟机上安装MySQL服务器后,出现以下问题:
- 虚拟机内部可通过
mysql命令用指定用户名密码正常访问,但外部远程连接完全失效 - 已完成的配置:
ufw防火墙启用3306端口,iptables添加3306 TCP规则- 检查MySQL配置未找到显式的本地地址绑定项
- 可通过同一IP地址SSH访问虚拟机,但无法连接MySQL
- 目标用户已配置允许
%地址访问,采用标准密码认证,授予全部权限
- 远程连接报错:
- JetBrains Rider(JDBC):
Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. - MySQL Shell:
ArgumentError: X protocol error: MySQL server has gone away Classic protocol error: MySQL Error 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
- JetBrains Rider(JDBC):
可能的原因及解决方法
1. MySQL隐式绑定回环地址
即使未找到显式的bind-address配置,MySQL 8.0在Ubuntu环境下默认仍会绑定127.0.0.1,拒绝外部连接:
- 搜索所有MySQL配置文件中的绑定规则:
sudo grep -r "bind-address" /etc/mysql/ - 若输出
bind-address = 127.0.0.1或bind-address = localhost,编辑对应配置文件(通常为/etc/mysql/mysql.conf.d/mysqld.cnf),修改为:bind-address = 0.0.0.0 - 重启MySQL服务生效:
sudo systemctl restart mysql
2. 验证MySQL监听状态
确认MySQL是否真的监听所有IP的3306端口:
sudo netstat -tulpn | grep mysql
- 若输出为
127.0.0.1:3306,说明绑定未修改成功,回到第一步检查配置 - 若输出为
0.0.0.0:3306或:::3306,则监听状态正常
3. 防火墙规则冲突或未生效
虽然配置了ufw和iptables,但规则顺序或重置问题可能导致端口被拦截:
- 重置并重新配置ufw规则:
sudo ufw reset sudo ufw allow ssh sudo ufw allow 3306/tcp sudo ufw enable - 验证规则优先级:
确保sudo ufw status numbered3306/tcp允许规则排在所有拒绝规则之前
4. 用户权限配置未完全生效
即使设置了%访问权限,可能存在用户匹配优先级或权限未刷新的问题:
- 登录MySQL内部,检查用户的主机绑定:
确认目标用户的SELECT user, host FROM mysql.user;host字段为%,而非localhost或其他限制值;若存在同名不同host的用户,MySQL会优先匹配更严格的主机规则 - 刷新权限:
FLUSH PRIVILEGES;
5. 虚拟机网络模式限制
若虚拟机使用NAT模式,外部主机无法直接访问虚拟机私有IP,需配置端口转发:
- 在虚拟机管理软件(VMware/VirtualBox)中设置端口转发,将宿主机的某个端口(如3307)映射到虚拟机的3306端口
- 远程连接时使用宿主机IP和映射端口,例如:
mysql -u your_user -p -h 宿主机IP -P 3307
6. MySQL 8.0认证插件兼容性问题
MySQL 8.0默认使用caching_sha2_password插件,部分旧JDBC驱动或客户端可能不兼容:
- 检查用户的认证插件:
SELECT user, plugin FROM mysql.user; - 若目标用户使用
caching_sha2_password,切换为兼容的mysql_native_password:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Xeo
相关产品推荐
相关产品推荐

