从宿主机(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+X → Y → Enter。

然后重启 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 用户的 host 为 localhost,表示只允许本地登录。

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);
相关推荐
为思念酝酿的痛5 小时前
MySQL表的连接
数据库·mysql
万联WANFLOW5 小时前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
OPEN-F5 小时前
Ubuntu 自动登录后 GNOME 远程桌面连不上?一次登录钥匙环锁定的排查与永久修复
linux·运维·ubuntu
bksczm5 小时前
MySQL之存储引擎
数据库·mysql
AlanAshley6 小时前
Windows 中导致延迟的软硬件及协议比重
windows
计算机毕设定制辅导-无忧学长6 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
yuezhilangniao6 小时前
win10中文 以及 PowerShell 开发日常
windows·powershell
Decay__7 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
雪芽蓝域zzs7 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
余槐i8 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化