从宿主机(Windows)通过 NAT 模式连接虚拟机(Ubuntu)中的 MySQL

宿主机(NAT 模式)连接虚拟机 MySQL 完整记录

环境:Windows 宿主机 + VMware Workstation(Ubuntu 虚拟机,NAT 网络)

目标:从宿主机通过本地网络连接虚拟机内的 MySQL,并允许 Java 等程序远程访问。


1. 查看本地网络 IP

  • Windows 宿主机 :WIN+R 打开 CMD,输入
    ipconfig
  • Linux 虚拟机 :CTRL+ALT+T 打开终端,输入
    ifconfig

记录下双方的 IPv4 地址(例如虚拟机 IP 为 192.168.31.16)。

2. 测试网络连通性(ping)

在宿主机上 ping 虚拟机 IP:

ping 192.168.31.16

同样可在虚拟机内 ping 宿主机 IP。

如果 ping 不通,检查虚拟机网络适配器是否为 NAT 模式,并关闭防火墙测试。

3. 测试 MySQL 端口(3306)是否可达

使用 telnet 命令(Windows 需在"启用或关闭 Windows 功能"中安装 Telnet 客户端):

telnet 192.168.31.16 3306

若出现黑屏或提示连接成功,说明端口开放;若提示无法连接,继续后续步骤。

mysql可能处于本地监听状态

成功

4. 检查虚拟机内 MySQL 服务状态

sudo systemctl status mysql

确保状态为 active (running)

5. 查看 MySQL 监听的端口和地址

sudo netstat -tulnp | grep 3306

初始输出示例:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld

表示只监听本地回环地址(127.0.0.1),无法远程访问。

6. 修改 MySQL 配置文件,允许监听所有网络接口

编辑配置文件:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到以下行:

bind-address = 127.0.0.1

修改为:

bind-address = 0.0.0.0

保存退出:Ctrl+XYEnter

然后重启 MySQL:

sudo systemctl restart mysql
sudo systemctl status mysql

再次执行 sudo netstat -tulnp | grep 3306,确认变为:

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN ...

7. 检查 MySQL 用户权限

登录 MySQL:

sudo mysql

查询用户表:

SELECT host, user FROM mysql.user;

通常 root 用户的 hostlocalhost,表示只允许本地登录。

8. 创建远程访问用户(授予远程权限)

注意:以下命令已修正原笔记中的语法错误。测试环境可使用简单密码,生产环境请务必加强。

在 MySQL 中执行:

sql 复制代码
sql
-- 降低密码策略(仅测试环境)
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;

-- 创建用户,允许从 192.168 网段连接(也可用 '%' 允许任意 IP)
CREATE USER 'root'@'192.168.%' IDENTIFIED BY '123456';

-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.%' WITH GRANT OPTION;

-- 刷新权限
FLUSH PRIVILEGES;
--如果想允许任意 IP 访问,将 'root'@'192.168.%' 替换为 'root'@'%'。

9. 从宿主机远程连接测试

退出 MySQL 后,在宿主机 CMD 中执行(需安装 MySQL 客户端):

sql 复制代码
mysql -h 192.168.31.16 -u root -p

输入密码 123456,若成功进入 MySQL 命令行,则表示远程连接配置成功。

10. 在 Java 程序中连接远程 MySQL

java 复制代码
String url = "jdbc:mysql://192.168.31.16:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
相关推荐
巧妹儿2 小时前
AI Agent 实战:MySQL 监控指标查询 Skill|华为云 + 腾讯云双兼容可直接复用
python·mysql·ai·大模型·华为云·腾讯云
Wait....2 小时前
MySQL事务知识复习
数据库·mysql
高兴就好20482 小时前
ClaudeCode在windows 11安装方法(2026年4月)
windows
公子小六2 小时前
基于.NET的Windows窗体编程之WinForms布局简介
windows·microsoft·c#·.net
i建模2 小时前
华为MateBook X Pro 2020款在Ubuntu系统中直接使用原生的杜比全景声效果
linux·ubuntu·华为
我真会写代码3 小时前
MySQL高频面试题(含详细解析):从基础到高级,备战面试不踩坑
数据库·mysql·面试
众创岛3 小时前
windows下的一些命令汇总
windows
塞北山巅3 小时前
Windows 下基于 MSYS2 搭建 C++ 开发环境:从安装到配置全指南
开发语言·c++·windows
qq_283720053 小时前
MySQL 8.0新特性高频面试题 30 道(超详细答案)
数据库·mysql·面试·mysql8·高频试题