虚拟机网络模式完全指南:NAT、桥接、仅主机的原理与排障
你有没有遇到过:虚拟机里跑了个代理,宿主机的网络却跟着挂了?或者虚拟机里能上网但宿主机不能?理解虚拟机网络模式,是排查这类"诡异"故障的前提。
一、虚拟机网络的三种基本模式
虚拟机本身没有物理网卡,它通过虚拟化技术借用宿主机的网卡来通信。不同的"借用方式"就是不同的网络模式。
VMware、VirtualBox、Hyper-V 等主流虚拟化软件都支持以下三种基本模式:
┌─────────────────────────────────────────────────────┐ │ 宿主机 (Host) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 物理网卡 │ │ VMnet1 │ │ VMnet8 │ │ │ │ (真实网络)│ │ 仅主机 │ │ NAT │ │ │ └─────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ ┌─────┴───────────────┴───────────────┴─────┐ │ │ │ 虚拟机 (Guest) │ │ │ │ 桥接模式 → 直接连物理网卡 │ │ │ │ NAT 模式 → 通过 VMnet8 共享主机 IP │ │ │ │ 仅主机 → 通过 VMnet1 只能和宿主机通信 │ │ │ └───────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘二、桥接模式(Bridged)—— 虚拟机就是局域网里的一台独立设备
2.1 原理
桥接模式下,虚拟机通过宿主机的物理网卡直接连接到物理网络,相当于在路由器上多插了一根网线。
┌──────────────────────────────────────────┐ │ 局域网 192.168.1.0/24 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌─────────┐│ │ │ 宿主机 │ │ 虚拟机 │ │ 路由器 ││ │ │ .100 │ │ .200 │ │ .1 ││ │ └──────────┘ └──────────┘ └─────────┘│ │ ↑ ↑ │ │ └──────┬──────┘ │ │ 同一个物理交换机/路由器 │ └──────────────────────────────────────────┘2.2 特点
| 特性 | 说明 |
|---|---|
| IP 地址 | 由物理路由器 DHCP 分配,和宿主机同一网段 |
| 网络可见性 | 局域网内所有设备都能看到这台虚拟机 |
| 上网方式 | 虚拟机直接通过物理路由器访问互联网 |
| 宿主机通信 | 通过物理交换机/路由器转发,和普通局域网通信一样 |
| 适用场景 | 需要虚拟机提供局域网服务(如 Web 服务器、NAS) |
2.3 常见问题
- 公司网络 MAC 地址绑定:虚拟机有自己独立的 MAC 地址,可能被交换机拒绝
- IP 地址冲突:如果手动设了和局域网其他设备相同的 IP
- Wi-Fi 环境限制:大部分 Wi-Fi 驱动不支持桥接,需要特殊配置
三、NAT 模式(Network Address Translation)—— 虚拟机"藏"在宿主机后面
3.1 原理
NAT 模式下,虚拟化软件创建了一个私有子网(如 192.168.56.0/24),宿主机充当这个子网的"路由器",做地址转换。
┌─────────────────────────────────────────────────────┐ │ 外部网络 │ │ ↑ │ │ │ 所有虚拟机流量都显示为 │ │ │ 宿主机的 IP 地址 │ │ ┌────┴──────────────────────────┐ │ │ │ 宿主机 │ │ │ │ 物理网卡: 192.168.1.100 │ │ │ │ VMnet8: 192.168.56.1 (网关) │ │ │ │ ↑ │ │ │ │ │ NAT 子网 │ │ │ │ ┌────┴──────┐ │ │ │ │ │ 虚拟机 │ │ │ │ │ │ 192.168.56.128 │ │ │ │ └───────────┘ │ │ │ └───────────────────────────────┘ │ └─────────────────────────────────────────────────────┘3.2 NAT 转换过程
虚拟机 (192.168.56.128:50000) → 发包到 baidu.com:80 ↓ 宿主机 VMnet8 (192.168.56.1) 接收 ↓ 宿主机做 NAT:将源 IP 替换为 192.168.1.100:60000 ↓ 通过物理网卡发到互联网 ↓ 百度回复到 192.168.1.100:60000 ↓ 宿主机查找 NAT 表 → 转发到 192.168.56.128:500003.3 特点
| 特性 | 说明 |
|---|---|
| IP 地址 | 虚拟化软件 DHCP 分配,与宿主机不同网段 |
| 网络可见性 | 局域网内其他设备看不到这台虚拟机 |
| 上网方式 | 通过宿主机做地址转换,共用宿主机 IP |
| 宿主机通信 | 可以通过 VMnet8 网关 IP (如 192.168.56.1) 互通 |
| 适用场景 | 日常开发调试,不需要对外暴露服务 |
四、仅主机模式(Host-Only)—— 与世隔绝的实验环境
4.1 原理
仅主机模式下,虚拟机和宿主机通过一个内部虚拟交换机连接,这个交换机不通外网。
┌──────────────────────────────────────┐ │ 宿主机 │ │ VMnet1: 192.168.174.1 │ │ ↑ │ │ │ 虚拟交换机(无外网出口) │ │ ┌────┴──────┐ │ │ │ 虚拟机 │ │ │ │ .128 │ ❌ 无法访问互联网 │ │ └───────────┘ │ └──────────────────────────────────────┘4.2 特点
| 特性 | 说明 |
|---|---|
| 能否上网 | 不能 |
| 与宿主机通信 | ✅ 可以 |
| 虚拟机之间通信 | ✅ 可以 |
| 适用场景 | 恶意软件分析、漏洞测试、隔离实验 |
五、三种模式对比总结
| 对比维度 | 桥接 (Bridged) | NAT | 仅主机 (Host-Only) |
|---|---|---|---|
| 虚拟机能否上网 | ✅ | ✅ | ❌ |
| 局域网设备能否访问虚拟机 | ✅ | ❌ | ❌ |
| 宿主机 ↔ 虚拟机互通 | ✅ (经路由器) | ✅ (经 VMnet8) | ✅ (经 VMnet1) |
| 虚拟机之间互通 | ✅ | ✅ (同一 NAT 子网) | ✅ |
| IP 地址来源 | 物理路由器 DHCP | 虚拟 DHCP | 虚拟 DHCP |
| 对宿主机网络的"侵入性" | 中 | 低 | 极低 |
六、虚拟机的代理如何影响宿主机?
一个常被忽视的场景:虚拟机里跑代理,宿主机网络断了。这不是 bug,而是 NAT 模式 + Allow LAN 的组合效果。
6.1 场景还原
假设你在 VirtualBox 里运行了一个 Linux 虚拟机,并在虚拟机中启动了一款网络代理软件:
┌──────────────────────────────────────────────────┐ │ Windows 宿主机 (192.168.1.100) │ │ │ │ 系统代理设置: 192.168.56.101:7890 ←──┐ │ │ │ │ │ ┌─────────────────────────────────────│───┐ │ │ │ Kali 虚拟机 (NAT 模式) │ │ │ │ │ VMnet8 IP: 192.168.56.101 │ │ │ │ │ │ │ │ │ │ 代理软件: │ │ │ │ │ Allow LAN: ✅ 开启 │ │ │ │ │ 监听地址: 0.0.0.0:7890 ←────────┘ │ │ │ │ 转发服务: 💀 全部超时 │ │ │ │ └──────────────────────────────────────┘ │ └──────────────────────────────────────────────────┘6.2 为什么宿主机会受影响?
Allow LAN 的作用:代理软件的 Allow LAN(允许局域网连接)选项,使代理端口监听
0.0.0.0(所有网络接口),而不仅仅是127.0.0.1。这意味着来自 VMnet8 子网的连接也会被接受。NAT 模式的双向通信:VMnet8 虚拟网卡使宿主机(
192.168.56.1)能和虚拟机(192.168.56.101)互通。这种互通是双向的——宿主机可以连接虚拟机的端口。三要素齐备:
- 宿主机手动设置了代理地址为
192.168.56.101:7890(指向虚拟机的代理软件) - 虚拟机的代理软件开启了 Allow LAN,接受外部连接
- 虚拟机的代理软件转发服务失效
- 宿主机手动设置了代理地址为
结果:宿主机浏览器 → 连接虚拟机 7890 端口 → 连接成功 → 但节点挂了 → 请求超时 → 宿主机"断网"。
6.3 排查方法
# 在宿主机 Windows 上检查是否能连接到虚拟机代理端口netstat-ano|findstr7890# 如果看到 ESTABLISHED 到 192.168.56.x → 确认是虚拟机代理# 查看当前系统代理设置netsh winhttp show proxy6.4 修复方法
- 在虚拟机中:关闭代理软件的 Allow LAN 开关
- 在宿主机中:关闭系统代理开关
- 完全隔离:将虚拟机网络改为"仅主机"模式(但这样虚拟机也上不了网了)
七、TUN 模式的跨虚拟机影响
TUN 模式比 Allow LAN 更危险,因为它修改的是系统路由表而不是代理设置:
Kali 虚拟机中代理软件开启虚拟网卡模式: → Kali 的路由表被修改 → 但由于虚拟机是隔离的,路由修改只影响 Kali 内部 → 宿主机不受直接影响 但如果虚拟机的 TUN 网卡配置了错误的网关: → 在 NAT 模式下,可能导致 VMnet8 子网的路由混乱 → 宿主机通过 VMnet8 访问虚拟机时出现路由环路结论:TUN 模式的跨虚拟机影响较小(路由表是隔离的),Allow LAN 的影响更大(端口监听暴露到了虚拟网络接口)。
八、实战:检查虚拟网卡的跃点数
Windows 中,当你同时有多个网卡(物理网卡 + VMnet1 + VMnet8 + VPN 虚拟网卡),系统通过**跃点数(Metric)**决定走哪个:
# 查看路由表及跃点数route print-4示例输出:
IPv4 路由表 =========================================================================== 目标 网络掩码 网关 接口 跃点数 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.100 25 0.0.0.0 0.0.0.0 192.168.56.1 192.168.56.1 50越小的跃点数优先级越高。如果 VMnet8 的默认路由跃点数比物理网卡还小(不常见但可能被手动修改过),流量就会错误地发往虚拟机。
手动修改接口跃点数
控制面板 → 网络和共享中心 → 更改适配器设置 → 右键 VMnet8 → 属性 → Internet 协议版本 4 → 属性 → 高级 → 取消"自动跃点" → 设为 50 或更高九、总结
| 知识点 | 核心要点 |
|---|---|
| 桥接模式 | 虚拟机 = 局域网独立设备,有独立 IP,对外可见 |
| NAT 模式 | 虚拟机藏在宿主机后面,共享宿主机 IP,对外不可见 |
| 仅主机模式 | 与世隔绝,只有宿主机和虚拟机之间能通信 |
| Allow LAN | 代理监听所有网络接口,通过 NAT 反向暴露给宿主机 |
| 跃点数 | 多网卡时决定走哪条路由,数字越小越优先 |
| 虚拟机代理影响宿主机 | NAT 双向通信 + Allow LAN + 手动代理设置 = 宿主机"被断网" |
虚拟机网络的复杂性在于看似隔离实则连通。理解了 NAT 模式的双向通信本质,就能理解为什么虚拟机里的代理会影响到宿主机。
本文是"网络故障排查系列"的第三篇。下一篇将讲解:DNS 域名解析的完整原理,以及 DNS 故障的系统排查方法。