VirtualBox NAT 网络实现三台虚拟机互联踩坑实录
摘要: 本文记录了在 VirtualBox 中使用 NAT 网络模式实现 Ubuntu 24、Windows 11、Windows Server 三台虚拟机互联的完整过程,重点分析了"网络地址转换(NAT)"与"NAT 网络"的区别,以及 Windows 虚拟机之间互 ping 不通的排查思路。
一、实验环境
| 组件 | 版本/型号 |
|---|---|
| 宿主机 | Windows 10/11 |
| 虚拟机软件 | VirtualBox 7.x |
| 虚拟机1 | Ubuntu 24.04 LTS |
| 虚拟机2 | Windows 11 |
| 虚拟机3 | Windows Server 2025 |
二、需求分析
实验要求三台虚拟机能够互相通信,同时可以访问外网。VirtualBox 提供了多种网络模式,但不同模式的适用场景差异很大:
| 网络模式 | 虚拟机互访 | 访问外网 | 宿主机访问虚拟机 |
|---|---|---|---|
| NAT(网络地址转换) | ❌ 不能 | ✅ 能 | ❌ 默认不能 |
| NAT 网络 | ✅ 能 | ✅ 能 | ❌ 默认不能 |
| 桥接网卡 | ✅ 能 | ✅ 能 | ✅ 能 |
| 内部网络 | ✅ 能 | ❌ 不能 | ❌ 不能 |
| 仅主机(Host-Only) | ❌ 不能 | ❌ 不能 | ✅ 能 |
关键区别: "网络地址转换(NAT)"是每台虚拟机独立的 NAT,虚拟机之间完全隔离;而"NAT 网络"是多台虚拟机共享同一个虚拟 NAT 路由器,处于同一局域网内,天然支持互访。
三、配置步骤
3.1 创建 NAT 网络
打开 VirtualBox 管理器 → 管理 → 网络 → NAT 网络 → 点击右侧 创建 按钮:
- 网络名称 :
NatNetwork(可自定义) - 网络 CIDR :
192.168.56.0/24 - 启用 DHCP:✅ 必须勾选,让虚拟机自动获取 IP
NAT网络创建示意图
3.2 配置虚拟机网卡
对三台虚拟机分别执行:设置 → 网络 → 网卡 1
| 配置项 | 值 |
|---|---|
| 启用网络连接 | ✅ 勾选 |
| 连接方式 | NAT 网络(注意不是"网络地址转换(NAT)") |
| 名称 | NatNetwork |
| 控制芯片 | Intel PRO/1000 MT 桌面 (82540EM) |
| 混杂模式 | 拒绝 |
| 接入网线 | ✅ 勾选 |
⚠️ 重要 :修改完设置后必须完全关闭虚拟机(不是保存状态),再重新启动才能生效。
3.3 验证 IP 分配
启动三台虚拟机,检查是否获得 192.168.56.x 网段的 IP:
Ubuntu 24:
bash
$ ip addr show | grep "inet 192.168.56"

Windows 11 / Server:
powershell
> ipconfig | findstr "192.168.56"


三台虚拟机 IP 分别为:
- Ubuntu:
192.168.56.5 - Windows 11:
192.168.56.6 - Windows Server:
192.168.56.4
四、连通性测试与踩坑
4.1 第一轮测试:跨系统通信
Windows Server ping Ubuntu:
powershell
> ping 192.168.56.5
正在 Ping 192.168.56.5 具有 32 字节的数据:
来自 192.168.56.5 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.56.5 的回复: 字节=32 时间=1ms TTL=64
# ... 4 次回复,0% 丢失
Windows 11 ping Ubuntu:
powershell
> ping 192.168.56.5
Reply from 192.168.56.5: bytes=32 time=5ms TTL=64
Reply from 192.168.56.5: bytes=32 time=1ms TTL=64
# ... 正常
结论:Windows 与 Linux 之间通信正常,NAT 网络本身工作良好。
4.2 第二轮测试:Windows 之间互 ping(踩坑)
Windows Server ping Windows 11:
powershell
> ping 192.168.56.6
正在 Ping 192.168.56.6 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。
# 100% 丢失
Windows 11 ping Windows Server:
powershell
> ping 192.168.56.4
Request timed out.
Request timed out.
Request timed out.
Request timed out.
# 100% loss
现象:Windows 虚拟机之间互相 ping 不通,但各自都能 ping 通 Ubuntu。
4.3 问题定位
这个"Windows 与 Linux 通,Windows 之间不通"的现象非常典型,说明 NAT 网络本身没有问题,问题出在 Windows 系统自身的安全机制 上。
即使关闭了 Windows 防火墙,Windows 仍可能因以下原因拦截 ICMP:
- 网络配置文件类型为"公用网络":公用网络有比专用网络更严格的隐性限制
- 防火墙规则未完全生效:图形界面的"关闭防火墙"可能未彻底关闭所有配置文件
- 高级安全 Windows Defender 防火墙 的入站规则仍拦截 ICMP 回显请求
4.4 解决方案
在两台 Windows 虚拟机上都执行以下操作:
方法 1:彻底关闭防火墙(临时测试)
powershell
# 管理员 PowerShell
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
方法 2:允许 ICMP 回显请求(推荐)
powershell
# 为所有配置文件添加 ICMPv4 入站规则
New-NetFirewallRule -DisplayName "Allow ICMPv4-In" -Direction Inbound -Protocol ICMPv4 -IcmpType 8 -Action Allow -Profile Any

方法 3:将网络改为专用网络
powershell
Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private
方法 4:图形界面操作
- 设置 → 网络和 Internet → 高级网络设置
- 点击当前网络 → 网络配置文件类型 → 专用网络
- Windows 安全中心 → 防火墙和网络保护 → 高级设置
- 入站规则 → 找到 "文件和打印机共享(回显请求 - ICMPv4-In)" → 右键启用
执行上述任一方法后,再次测试:
powershell
> ping 192.168.56.4
来自 192.168.56.4 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.56.4 的回复: 字节=32 时间<1ms TTL=128
# ... 0% 丢失 ✅
五、完整连通性验证
最终三台虚拟机互 ping 结果:
| 源 \ 目标 | Ubuntu (56.5) | Win11 (56.6) | Server (56.4) |
|---|---|---|---|
| Ubuntu | --- | ✅ 通 | ✅ 通 |
| Win11 | ✅ 通 | --- | ✅ 通 |
| Server | ✅ 通 | ✅ 通 | --- |
六、踩坑总结
| 坑点 | 现象 | 解决方案 |
|---|---|---|
| 选错 NAT 模式 | 所有虚拟机无法互访 | 必须选"NAT 网络",不是"网络地址转换(NAT)" |
| 虚拟机未完全重启 | IP 未更新,配置不生效 | 关闭虚拟机(非保存状态)后重新启动 |
| Windows 防火墙拦截 | Windows 之间 ping 不通 | 关闭防火墙或添加 ICMP 入站规则 |
| 网络配置文件类型 | 即使关防火墙仍不通 | 将网络从"公用"改为"专用" |
| 未启用 DHCP | 虚拟机获取不到 IP | 创建 NAT 网络时勾选"启用 DHCP" |
七、核心思路提炼
本次实验的成功关键在于分层排查法:
- 确认网络模式正确:NAT 网络 vs NAT 是本质区别,选错一切白搭
- 验证 IP 分配:确认三台机器都在同一网段(192.168.56.x)
- 跨系统测试:先测 Windows→Linux,隔离网络层问题
- 同系统测试:再测 Windows→Windows,定位系统级安全策略问题
- 精准修复:根据"跨系统通、同系统不通"的特征,锁定 Windows 防火墙/网络配置文件
这种从全局到局部、从通用到特殊的排查逻辑,是网络故障诊断的核心方法论。
如果这篇文章对你有帮助,欢迎点赞收藏!有问题欢迎在评论区交流。