尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

虚拟机网络模式选型:桥接、NAT、Host-Only原理与排坑指南

虚拟机网络模式选型:桥接、NAT、Host-Only原理与排坑指南 刚装完虚拟机的人十个里有九个会卡在同一个问题上虚拟机装好了网络不知道选哪个。点开VMware的“网络适配器”下拉菜单桥接、NAT、仅主机三个词看着都认识但真要选的时候心里没底。我在帮同事排查“虚拟机突然上不了网”这类问题时遇到过太多因为一开始选错模式、后面又来回切换导致环境越搞越乱的案例。这个坑不用反复踩这篇文章就把桥接、NAT、Host-Only三种模式的原理讲透顺便把热搜里那些高频问题比如桥接获取不到IP、仅主机模式想上网、NAT模式下端口不通一并拆掉。我默认你用的是VMware Workstation或VirtualBox虚拟机能正常装完也能打开。下面从底层讲起不跳步骤。1. 先搞清楚三兄弟共享的那块“虚拟网卡”1.1 虚拟机里的网卡其实是一段模拟出来的硬件虚拟机里的网卡不是真实存在的硬件它是虚拟机软件用代码模拟出来的一块网络接口比如VMware默认虚拟机用户常用的Intel PRO/1000E1000网卡、VirtualBox里的虚拟Intel PRO/1000 MT以及更现代的virtio-net半虚拟化网卡。虚拟机里的操作系统收到这块“假网卡”之后会和真网卡一样处理数据包该发IP包发IP包该收ARP回应收ARP回应完全不知道自己活在模拟环境里。这一点很重要因为三种网络模式的差别本质上不是“网卡”不同而是“这块虚拟网卡接到了什么地方”。你可以把虚拟机里的网卡想象成一根网线插头插到哪台交换机上决定了这台虚拟机能和谁说话。桥接、NAT、Host-Only的差别就在于虚拟网卡插的那个“交换机”不一样。1.2 VMware和VirtualBox各自怎么组织这些虚拟网络VMware在安装时会创建几个虚拟网络分别用VMnet编号表示。默认情况下VMnet0桥接模式用的虚拟交换机它负责把虚拟机的网卡和你的物理网卡比如有线网卡或无线网卡“桥”起来。VMnet1仅主机Host-Only模式用的虚拟交换机它只允许虚拟机和宿主机之间通信。VMnet8NAT模式用的虚拟交换机它除了交换机本身还自带一台“虚拟路由器”负责地址转换。VirtualBox的命名不同默认的NAT是一个“内部网络伪装网关”的组合不单独暴露一个VMnet编号如果要Host-Only需要手动创建vboxnet0这样的宿主机虚拟网卡桥接模式则直接复用你的物理网卡接口。命名不一样但底层的逻辑模型是通用的。1.3 为什么说三种模式本质是“把网卡插到不同的交换机上”理解了上面这个模型很多疑问会迎刃而解。桥接模式的核心是“虚拟交换机VMnet0把虚拟机的网卡和物理网卡连到了同一个二层网络里”所以虚拟机看起来就像插在你家路由器上的另一台真实电脑。NAT模式的核心是“虚拟交换机VMnet8后面接了一个虚拟路由器虚拟机的流量要先经过这个路由器做地址转换再通过你的物理网卡出去”。Host-Only模式则是一个“孤岛交换机”VMnet1上的虚拟机只能和宿主机、同交换机上的虚拟机通信默认没有出口。这就像你家客厅里摆了一张桌子三个人共用一个人直接坐在饭桌边上吃饭桥接一个人通过服务员端菜进来NAT还有一个在隔壁包间里自己吃门是关着的Host-Only。记住这个比喻下面每个模式就好理解了。2. 桥接模式相当于在客厅里加了一张小桌子2.1 桥接到底“桥”了什么桥接这个叫法来源于网络里的“网桥”设备。VMware的桥接模式本质上就是把虚拟机这块虚拟网卡“桥”到你的物理网卡所接入的那个局域网里。数据从虚拟机发出来VMnet0这个虚拟交换机不修改任何东西直接把数据帧扔进物理网络反过来物理局域网里的广播包、别人发给这个虚拟机的数据也会原封不动地送进虚拟机。结果就是虚拟机里的操作系统如果开启了DHCP它就会向您家里的无线路由器或者办公室的光猫、交换机申请一个独立的局域网IP。这个IP和宿主机拿到的IP在同一网段比如宿主机是192.168.1.5虚拟机可能分到192.168.1.6。从局域网里其他设备看这台虚拟机和一台真实的物理电脑没有任何区别。2.2 什么时候必须用桥接桥接模式最大的价值是让虚拟机“以独立身份”出现在局域网里。现实中你必须用桥接的场景我总结下来有三类要在虚拟机里搭建对外提供服务的应用比如Web服务器、NAS共享、游戏服务端、内网穿透的客户端需要让局域网里其他手机、电脑能直接访问虚拟机。要做网络实验比如在虚拟机里配置多个服务、测试局域网组播、研究ARP、搭DHCP服务器这些场景要求虚拟机必须真实参与二层网络交互。虚拟机需要从上级路由器获得独立IP并且需要被路由器分配端口映射、做MAC绑定、被远程桌面连接。如果你只是想在虚拟机里上网根本不打算让外面访问它那桥接反而不是最优选因为它在物理网络上占了一个真实IP名额在办公网、校园网这种IP管理严格的环境里还会给自己惹麻烦。2.3 桥接的实操配置与静态IP写法在VMware里选桥接模式时如果你有多块物理网卡比如笔记本同时有有线和无线一定要在“虚拟网络编辑器”里确认VMnet0桥接到了哪块网卡。默认“自动”通常没问题但有时候它会把桥接指向一个没有连接的接口导致虚拟机一直分不到IP。如果是Ubuntu Server这种没有图形界面的虚拟机想设静态IP用netplan是很干净的做法。假设物理局域网网段是192.168.1.0/24网关192.168.1.1可以写# /etc/netplan/01-netcfg.yaml network: version: 2 ethernets: ens33: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 192.168.1.1 - 223.5.5.5然后执行sudo netplan apply。前提是和宿主机确认好这个IP没被占用。2.4 桥接模式最爱翻车的几个位置桥接模式踩坑频率最高的地方其实不是虚拟机而是物理环境。第一个坑是校园网、酒店Wi-Fi、公司办公网这类有认证或IP绑定的网络。它们通常会限制每个端口只能有一个MAC地址或者不允许出现陌生设备虚拟机一旦用桥接接入要么分不到IP要么分到了也上不了网。这时候别怪虚拟机软件换NAT模式立刻就好。第二个坑是无线路由器的“AP隔离”功能。很多家用路由器默认开了AP隔离虚拟机的桥接网卡即使拿到IP也访问不了局域网里的其他设备因为路由器把无线设备之间的通信封掉了。排查的时候先看路由器管理后台。第三个坑是物理网卡本身就是虚拟的。我这里特别提醒一句别把虚拟机桥接和路由器/光猫的“桥接设置”搞混了。你在光猫后台看“桥接模式”那是让光猫只做光信号转换、把PPPoE拨号交给路由器虚拟机的桥接是让虚拟机直连物理网络。这是两个完全不同的“桥接”概念热搜里好多人在问光猫桥接其实是问错地方了。3. NAT模式躲在后台的隐形路由器3.1 NAT模式的工作原理用一个电话转接台来理解NAT模式的全称是Network Address Translation网络地址转换。VMware实现它的方式是VMnet8这个虚拟交换机后面接了一个虚拟路由器这个路由器自己有一个内网网段常见的是192.168.x.0/24其中虚拟路由器的网关IP通常是192.168.x.2。拿打电话来打比方。你虚拟机在公司里想打外线电话不可能每个人都有自己的外部号码于是所有电话都拨到前台虚拟路由器前台帮你转接出去回电也先到前台再转给你。外面的人根本看不到你的分机号他只知道前台的号码。NAT模式干的正是这件事虚拟机发出去的流量源IP会被改写成宿主机物理网卡对应的IP和随机端口回包再由虚拟路由器转回内网的虚拟机。3.2 NAT模式最适合谁NAT模式适合绝大多数日常使用场景特别是你只在虚拟机里跑开发环境、装数据库、测试软件并不需要外部设备主动连接虚拟机。物理网络有身份认证、MAC绑定、IP限制桥接模式根本拿不到IP。你用的是笔记本经常在不同网络环境之间切换家里、公司、咖啡馆NAT模式不需要关心底层物理网络怎么变的。我自己的习惯是拿NAT模式当“默认选项”除非确认需要对外提供服务否则一律先用NAT把环境跑起来。这样做的好处是物理网络换了、网线拔了插了虚拟机网络基本不受影响省去大量重配IP的烦恼。3.3 想做端口转发让外面访问NAT虚拟机方法在这里NAT模式的一个常见痛点是“外面访问不进来”。但这不是绝对的虚拟路由器支持端口转发Port Forwarding相当于让前台记住“打给某个分机号的外线电话接到指定分机”。如果你在虚拟机里跑了SSH端口22希望局域网里的电脑用宿主机IP加端口2233来访问虚拟机可以在VMware的“虚拟网络编辑器”→NAT设置里添加宿主机端口 2233 - 虚拟机IP 192.168.x.130 虚拟机端口 22在VirtualBox里路径是“设置→网络→高级→端口转发”规则写法类似名称: ssh 协议: TCP 主机IP: 127.0.0.1 主机端口: 2233 客户机IP: 10.0.2.15 客户机端口: 22配好之后外部访问宿主机IP的2233端口数据就会被转发到NAT网络里的虚拟机22端口。这个机制对研发场景非常实用等于给“封闭内网”开了一扇可管控的门。3.4 WSL、Docker这些“同类技术”其实都在用NAT如果你在Windows上用WSL2或者Docker Desktop你会发现它们的网络模型也是NAT这一套。Windows有一个叫WinNAT的服务Windows NAT Driver专门负责把WSL2、Hyper-V虚拟机、Docker容器的流量做地址转换。热搜里有“win 10 nat服务”“wsl的nat模式与镜像模式”背后都是这段逻辑。也就是说理解了VMware的NAT模式你其实就顺手理解了WSL2的默认网络方式。很多人说WSL2比WSL1慢、端口访问有问题多半是因为NAT模式下从Windows访问WSL的localhost需要额外转发。WSL2后来推出的“镜像网络模式”mirrored mode就是想减少这种NAT带来的别扭感。3.5 NAT模式下的常见毛病和解决办法NAT模式的常见问题我按频率排一下虚拟机里的DNS解析不了但ping IP能通。通常是虚拟机里的DNS服务器设置不对把它指向虚拟网关地址比如VMware的192.168.x.2一般就能解决。宿主机防火墙拦掉了NAT服务的端口。Windows防火墙在必要时会拦截端口转发进来的连接排查时先试着临时关掉防火墙确认通了再加白名单规则。WinNAT服务被禁用。之前在装了Docker的Windows机器上遇到宿主机突然连不上WSL查了一圈发现是基于NAT的winnat服务停掉了。服务名是SharedAccess或者叫Windows NAT Driver手动启动即可。虚拟机开了服务监听127.0.0.1外面通过端口转发也访问不到。这个问题根源在虚拟机内部服务只听本机回环地址改成监听0.0.0.0就好了。4. Host-Only模式没有出口的私密会议室4.1 Host-Only模式到底提供了什么Host-Only模式只做一件事把你、宿主机和虚拟机圈在一个封闭的虚拟局域网里。VMware用VMnet1实现它VirtualBox则通过手动创建宿主机网卡通常叫vboxnet0来实现。这个网络里有一个虚拟交换机没有虚拟路由器这意味着没有默认网关没有地址转换也没有DNS转发虚拟机默认出不去外网。就像一间私密会议室墙是隔音的门是锁的房间里的人能互相说话能和会场工作人员宿主机交流但外面的人和外面的网络资源一步也接触不到。4.2 Host-Only能干什么、不能干什么Host-Only模式非常适合几类场景安全实验环境测防火墙规则、分析恶意样本、研究病毒行为虚拟机需要联网但不希望连到真实网络。多虚拟机组网测试在VMnet1里搭一套完整的虚拟集群三台虚拟机之间互相通信宿主机也能管理它们但整个集群对外是透明的。离线开发环境人物进行数据库测试、代码调试不想让流量和外部网络有关联。它不能做的事情也很明确默认情况下Host-Only里的虚拟机访问不了Internet外部设备也访问不了它。如果你需要“既隔离又在必要时能出去”那就不是纯Host-Only能做到的需要额外做共享上网。4.3 想让Host-Only的虚拟机也访问外网有一条现实可行的路子我在项目里经常要搭一套“半隔离”环境几个虚拟机在私有网段里跑服务又要定期去外网更新代码、拉镜像。这时候我会给Host-Only网络加一个“出口”最常见可行的是用宿主机做NAT转发。在Windows宿主机上可以把物理网卡比如正在上网的Wi-Fi网卡的Internet连接共享开启然后指定共享目标为VMnet1对应的虚拟网卡。设置路径是控制面板→网络和共享中心→更改适配器设置→右键正在上网的网卡→属性→共享选项卡→勾选“允许其他网络用户通过此计算机的Internet连接来连接”下拉选中VMnet1。开启后Host-Only里的虚拟机会自动拿到一个192.168.137.x的IP网关指向宿主机这个网卡。如果你用的是Linux宿主机思路一样用iptables做SNAT。有同事在精简版Linux环境里执行iptables时报过“cant initialize iptables table nat”这样的错这通常是内核没加载nat表的模块比如缺少nf_nat相关的内核模块或者iptables-legacy和nftables版本不对。遇到这个问题先看内核模块再考虑命令本身。4.4 仅主机模式下最容易踩的坑DNS和网关Host-Only模式默认没有DHCP的DNS配置所以当你在虚拟机里执行ping域名时很可能是通的IP但解析不了名字。最好的办法是手动改虚拟机DNS指向宿主机在VMnet1里的IP或者指向一个外部DNS比如223.5.5.5。注意默认网关不要乱填如果网络里没有真实路由器填了也会超时反而影响其他通信判断。另外我提醒一句Host-Only模式的虚拟机IP最好设成静态。因为这个封闭网络里的DHCP服务经常不启动或者重启后分配结果变了导致宿主机上的脚本连不上固定的虚拟机IP。在VMware里如果不想每次重启都处理IP变化直接在虚拟网络编辑器里把VMnet1的DHCP服务关掉全用静态IP最干净。5. 一张表认清三兄弟选型其实很简单5.1 三种模式的核心差异对照用一张表把三兄弟的脾气列清楚选型的时候照着看就行对比项桥接模式NAT模式Host-Only模式虚拟机能否访问外网能能默认不能虚拟机是否拥有局域网独立IP是与宿主机同网段否属于私有虚拟网段否属于私有虚拟网段外部设备能否直接访问虚拟机能默认不能需端口转发不能虚拟机之间能否互访能能同一VMnet内能同一VMnet内受物理网络环境影响大受认证/MAC绑定/AP隔离影响小物理网络换了也能用不受影响适合场景对外提供服务的服务器、组播/ARP实验日常开发测试、快速上网安全隔离、多虚拟机内部组网这张表不是死的实际使用中还可以组合、自定义但先把这个基础记住后面的变化不会跑偏。5.2 给不同需求的人一个最直接的选型建议如果你刚入门只有一个诉求“虚拟机里要能上网”选NAT。这不是妥协是正确选择。NAT模式把物理网络的复杂性全部隔离在外面你只需要关心虚拟机内部。如果你要做网站或者API服务测试希望手机也能连虚拟机去验证页面效果选桥接。前提是物理网络环境允许没有MAC限制、没有认证。如果你在搞病毒分析、网络攻防实验、防火墙策略测试不想让任何东西漏到真实局域网选Host-Only或者在此基础上再手动加NAT转发做可控出口。还有一种更讲究的做法一个虚拟机装两个虚拟网卡一张桥接对外提供服务一张Host-Only做管理维护。这种拓扑在真实的服务器运维里很常见虚拟机里两张网卡同时存在互不干扰。5.3 一台电脑上三种模式可以同时用吗可以而且这是虚拟机软件最值钱的地方之一。VMware允许你同时配置VMnet0、VMnet1、VMnet8并存不同虚拟机可以分别接不同的网络。比如你正在跑三个虚拟机一台桥接模式模拟生产服务器一台NAT模式做编译构建机一台Host-Only模式做隔离测试区三套网络在同一物理机上同时工作完全没问题。这种灵活性让“模拟真实IDC环境”成为可能。你可以给每台虚拟机的网卡数量都加到两个以上然后通过自定义虚拟网络把整个测试拓扑搭建起来。这也是为什么很多网络工程师喜欢拿虚拟机做实验——一台物理机器就能模拟一个小型局域网。6. 实战排雷从热搜里翻出的高频问题汇总6.1 桥接模式获取不到IP先查物理环境再查虚拟网络配置这是热搜里出现频率最高的问题之一。每次遇到这种情况我排查的顺序基本是固定的先确认物理环境是否支持把虚拟机切到NAT模式如果NAT能上网桥接却不行说明问题在物理链路或认证层。检查VMnet0桥接的目标网卡是否选对了在多网卡笔记本上虚拟网络编辑器里可能要手动指定桥接到当前正在使用的Wi-Fi或以太网卡。在虚拟机里运行ipconfig /renewWindows或sudo dhclient -vLinux强制重新申请IP看有没有DHCP应答。如果所有配置都正常还是拿不到IP检查路由器后台是否有“隔离”“MAC绑定”之类的限制。普通家用路由器取消AP隔离后通常立刻就能恢复。我在这一步见过很多人反复卸载重装虚拟机软件其实根本原因是公司网络对陌生MAC的限制。先做上面的排查比重装高多了。6.2 切换网络模式后虚拟机为什么突然上不了网很多人会在桥接上不了网之后把虚拟机切到NAT模式结果发现网还是不通。这很可能是切换前后虚拟机里的网卡设备名变了或者IP还是旧配置。尤其Linux里的网卡名称比如eth0变成了ens33或者ens37配置对不上就上不了网。更稳妥的操作是在虚拟机“关机”状态下切换网络模式开机后在虚拟机内重新走一遍DHCP获取流程。如果是Linux的netplan或CentOS的NetworkManager切换后最好把旧IP清掉执行一下sudo systemctl restart systemd-networkd或者用图形界面重新激活网卡。切换模式后立刻能上网的概率高很多。6.3 虚拟网络适配器VMnet1/VMnet8消失如何处理打开Windows的“网络连接”发现VMnet1、VMnet8不见了这不算罕见。常见原因是VMware的虚拟网络服务没有启动或者Windows在系统更新后改了网络适配器状态。处理方法是打开“服务”管理器确认下面这几个服务处于运行状态VMware NAT ServiceVMware DHCP ServiceVMware Bridge Protocol桥接协议通常在物理网卡属性里勾选如果服务都在但适配器还消失可以在VMware的“虚拟网络编辑器”里点“恢复默认设置”它会重新创建VMnet1、VMnet8等虚拟网络。注意这个操作会把自定义网络一并重置有自定义网络的话先备份。6.4 一套顺手的“网络模式自测三板斧”每次给虚拟机改完网络模式我都会按下面这三步快速自测一两分钟就能定位问题在哪一层ping虚拟网关NAT模式下是192.168.x.2Host-Only模式下是宿主机虚拟网卡IP桥接模式下是物理路由器IP通了说明虚拟网卡和链路层没问题。ping一个公网IP比如223.5.5.5通了说明路由和NAT出口没问题。ping一个域名比如baidu.com能解析说明DNS配置没问题。如果第一步通了、第二步不通问题多半在网关路由如果第二步通了、第三步不通问题就在DNS。这套方法对三种模式都适用属于最朴素但最有效的链路排查思路。我在实际项目中最常用的是NAT加Host-Only的组合NAT负责和外界通信、拉取工具包Host-Only负责搭内部测试网。桥接模式反而用得更克制只在需要对外提供服务、或者做二层网络实验时才启用。搞清楚每种模式的性格网络问题就不是玄学。
返回列表