从宿主机(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);
相关推荐
Database_Cool_2 小时前
阿里云 RDS MySQL 降本增效实战:从规格选型到成本优化,月成本降低64%全攻略
mysql·阿里云·云计算
广州灵眸科技有限公司10 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒12 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
用户713335851562415 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
王维同学16 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
用户713335851562416 小时前
MySQL - InnoDB 的 Buffer Pool
mysql
YCOSA202516 小时前
雨晨 Windows 11 IOT 企业版 LTSC 24H2 轻装 2合1 26100.8968
windows·物联网
汤姆yu17 小时前
CodeGeeX 4完整安装与实操使用全指南
人工智能·windows·ai·智能体·视频模型
通信小小昕17 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
欲速不达882017 小时前
Mysql并发DML锁等待的优化
数据库·mysql