宿主机连接虚拟机MySQL的NAT模式配置指南

发布时间:2026/10/29 20:43:51
宿主机连接虚拟机MySQL的NAT模式配置指南

1. 为什么需要从宿主机连接虚拟机中的MySQL?

在开发环境中,我们经常遇到这样的场景:宿主机运行Windows系统,而开发环境部署在Ubuntu虚拟机中。这种架构带来了几个实际需求:

  • 开发工具兼容性:很多IDE(如VS Code、IntelliJ)在Windows上有更好的性能表现
  • 生产环境一致性:Ubuntu作为服务器主流OS,能保证开发环境与生产环境一致
  • 资源隔离:数据库运行在虚拟机中可以避免污染宿主机环境

NAT模式是VMware/VirtualBox默认的网络连接方式,它通过虚拟网络地址转换(Network Address Translation)实现以下特性:

  1. 虚拟机可以访问外部网络
  2. 外部网络无法直接访问虚拟机
  3. 宿主机与虚拟机之间需要特殊配置才能互通

注意:NAT模式与桥接模式的关键区别在于,桥接模式下虚拟机会获得与宿主机同网段的IP,而NAT模式会创建一个独立的私有网络。

2. 环境准备与基础配置

2.1 虚拟机网络配置检查

首先确认Ubuntu虚拟机的网络适配器设置为NAT模式:

  1. 在VMware中右键虚拟机 → 设置 → 网络适配器
  2. 选择"NAT模式"(不要勾选"启动时连接")
  3. 在Ubuntu中执行ip a查看分配的IP地址,通常为192.168.x.x或10.0.x.x

2.2 MySQL服务安装与验证

在Ubuntu中安装MySQL服务:

sudo apt update sudo apt install mysql-server -y sudo systemctl start mysql sudo systemctl enable mysql

验证MySQL是否正常运行:

sudo mysql -u root -p # 初始安装可能无需密码,直接回车

2.3 防火墙配置调整

Ubuntu默认的UFW防火墙会阻止外部连接:

sudo ufw allow 3306/tcp sudo ufw enable sudo ufw status # 确认3306端口已放行

3. MySQL访问权限配置

3.1 修改MySQL绑定地址

默认情况下MySQL只监听本地连接:

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

找到bind-address配置项,修改为:

bind-address = 0.0.0.0 # 允许所有IP连接

保存后重启MySQL服务:

sudo systemctl restart mysql

3.2 创建远程访问用户

在MySQL shell中执行:

CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%'; FLUSH PRIVILEGES;

安全提示:生产环境应限制用户权限,避免使用%通配符,建议指定宿主机IP

4. 宿主机到虚拟机的端口转发

4.1 VMware NAT端口转发配置

  1. 打开VMware → 编辑 → 虚拟网络编辑器
  2. 选择"NAT模式"对应的网络(通常是VMnet8)
  3. 点击"NAT设置" → 添加端口转发规则:
    • 主机端口:3306(或任意未占用端口)
    • 虚拟机IP:Ubuntu的IP地址(通过ip a查看)
    • 虚拟机端口:3306
  4. 保存所有设置

4.2 VirtualBox的配置差异

如果使用VirtualBox,配置路径为:

  1. 虚拟机设置 → 网络 → 高级 → 端口转发
  2. 添加规则:
    • 名称:MySQL
    • 协议:TCP
    • 主机IP:留空
    • 主机端口:3306
    • 访客IP:Ubuntu的IP
    • 访客端口:3306

5. 宿主机连接测试

5.1 使用MySQL Workbench连接

  1. 在Windows宿主机打开MySQL Workbench
  2. 点击"+"新建连接:
    • Connection Name: Ubuntu MySQL
    • Hostname: 127.0.0.1(因为配置了端口转发)
    • Port: 3306
    • Username: remote_user
    • Password: StrongPassword123!
  3. 点击"Test Connection"验证

5.2 命令行连接测试

在Windows命令提示符中:

mysql -h 127.0.0.1 -P 3306 -u remote_user -p

输入密码后应能成功连接。

6. 常见问题排查

6.1 连接超时问题

如果出现"Can't connect to MySQL server on '127.0.0.1' (10060)":

  1. 检查Ubuntu防火墙状态:

    sudo ufw status
  2. 确认MySQL监听所有IP:

    sudo netstat -tulnp | grep mysql

    应看到0.0.0.0:3306

  3. 验证端口转发规则是否生效:

    telnet 127.0.0.1 3306

6.2 认证失败问题

出现"Access denied for user"错误时:

  1. 确认用户名密码正确
  2. 检查用户是否有远程访问权限:
    SELECT host, user FROM mysql.user;
  3. 可能需要重置密码:
    ALTER USER 'remote_user'@'%' IDENTIFIED BY 'NewPassword123!';

6.3 NAT网络不稳定的处理

如果连接时断时续:

  1. 在VMware中禁用虚拟网络适配器的节能选项
  2. 设置静态IP给Ubuntu虚拟机:
    sudo nano /etc/netplan/00-installer-config.yaml
    添加类似配置:
    network: ethernets: ens33: dhcp4: no addresses: [192.168.122.100/24] gateway4: 192.168.122.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]
    应用配置:
    sudo netplan apply

7. 性能优化与安全建议

7.1 连接性能调优

对于频繁的数据库操作:

  1. 在MySQL配置中增加连接池大小:
    [mysqld] max_connections = 200 wait_timeout = 600
  2. 在Windows宿主机配置hosts文件(C:\Windows\System32\drivers\etc\hosts):
    127.0.0.1 ubuntu-mysql
    然后使用主机名连接,避免DNS解析开销

7.2 安全加固措施

  1. 限制访问IP范围:
    GRANT ALL ON *.* TO 'remote_user'@'192.168.122.%';
  2. 启用SSL加密连接:
    ALTER USER 'remote_user'@'%' REQUIRE SSL;
  3. 定期更换密码:
    ALTER USER 'remote_user'@'%' IDENTIFIED BY 'NewSecurePassword456!';

8. 替代方案对比

8.1 桥接模式 vs NAT模式

特性NAT模式桥接模式
配置复杂度中等(需端口转发)简单(直接获取IP)
网络隔离性高低
跨网段访问需要额外配置直接支持
适用场景开发测试环境生产模拟环境

8.2 SSH隧道方案

作为端口转发的替代方案,可以通过SSH建立安全隧道:

  1. 在Ubuntu启用SSH:
    sudo apt install openssh-server sudo systemctl start ssh
  2. 在Windows使用PuTTY建立隧道:
    • Connection → SSH → Tunnels
    • Source port: 3306
    • Destination: localhost:3306
    • 选择"Local"和"Auto"

这种方式的优势是加密所有传输数据,适合对安全性要求高的场景。