
最近有个朋友在群里吐槽虚拟机里装好系统、配好网络想在物理机的 Wireshark 上抓虚拟机的流量结果打开 Wireshark 的捕获接口列表翻来覆去只看到物理无线网卡、以太网卡和一堆“Adapter for loopback”愣是找不到想象中应该出现的“虚拟机网卡”。这问题其实特别典型十个用 VMware 抓包的人里至少三四个会在这一步卡住。而且卡住之后的第一反应往往是怀疑 Wireshark 装坏了、Npcap 驱动没装好甚至有人重装了好几遍软件问题依旧。其实根本不是软件的事是虚拟网络的架构决定了 Wireshark 压根“看不见”虚拟机里的那块网卡。想搞清楚这个问题得先从虚拟机网卡的本质说起。这篇东西写给所有在 VMware 里跑虚拟机、想用 Wireshark 抓包做分析的人。不管你是做网络安全、搞协议分析还是单纯想看看自己搭的某个服务到底走了哪些包只要你在“Wireshark 发现不了虚拟机网卡”这件事上犯过嘀咕这篇内容都能帮你把原理捋顺并且给出马上能落地的解决方案——包括到底应该选哪个接口、怎么才能让 Wireshark 正常出包以及各种容易踩的坑。1. 为什么Wireshark发现不了虚拟机网卡1.1 Wireshark的捕获接口本质上对应的是物理机的协议栈先明确一个最核心的事实Wireshark 打开时列出的所有网络接口——什么“以太网”“WLAN”“VMware Virtual Ethernet Adapter for VMnet1”之类的名字——这些接口全部归属于当前这台操作系统的协议栈资源。换句话说你在物理机的 Wireshark 界面上能看到的只能是物理机这一层的网卡和虚拟适配器永远不可能直接看到虚拟机系统内部的 eth0 或者 ens33。原因很简单。Wireshark 抓包依赖 Npcap/WinPcap 驱动它做的事情是在数据链路层把网卡收发的帧复制一份交给上层分析。而它所能挂接的目标必须是一个存在于当前操作系统网络栈里的、具有数据链路层角色的实体。虚拟机里的虚拟网卡比如 VMware 给虚拟机虚拟出来的 e1000 或 vmxnet3是虚拟机操作系统的设备不是物理机操作系统的设备。物理机上的 Wireshark 跟这台虚拟机之间隔着 VMware 的虚拟交换层两者并不直接共享一块网卡。所以“Wireshark 发现不了虚拟机网卡”是必然现象这不是故障是分层架构下的正常表现。就好比你想在二楼的窗户看一楼厨房做了什么菜但监控摄像头装在大门口——你应该去接大门口那路的画面而不是责怪二楼窗户为什么没有视频信号。这里的“二楼的窗户”就是虚拟机里的网卡“大门口的摄像头”才是物理机上能看到的接口。1.2 VMware虚拟网络的三种角色与VMnet适配器搞清楚这一层之后我们再来看 VMware 的虚拟网络组件。VMware Workstation 在安装时会创建若干个虚拟网络默认最常用的就是这三个VMnet0、VMnet1、VMnet8。它们的角色分别是虚拟网络模式物理机上对应的适配器典型用途VMnet0桥接模式无独立适配器直接桥接物理网卡虚拟机接入局域网和物理机同级VMnet1仅主机模式VMware Virtual Ethernet Adapter for VMnet1虚拟机与物理机构成私有局域网不通外网VMnet8NAT模式VMware Virtual Ethernet Adapter for VMnet8虚拟机通过宿主机NAT访问外网宿主机可当作网关这里面有两类网卡很多人会混淆。VMnet1 和 VMnet8 对应的“VMware Virtual Ethernet Adapter for VMnetX”是实实在在出现在物理机的网络连接列表里的它是虚拟交换机在宿主机这一边开的一个口子让物理机可以跟对应虚拟网络里的虚拟机通信。而 VMnet0桥接模式没有独立的宿主机适配器它是把虚拟机的虚拟网卡直接跟物理机的物理网卡桥接在了一起。这时候再回去看 Wireshark你在物理机上能看到的“VMware Virtual Ethernet Adapter for VMnet1/VMnet8”其实只是宿主机接入虚拟交换网络的那一个端点。这个端点上是能抓到一部分流量的但要搞清楚它到底能抓到什么、抓不到什么这就是下一章要讨论的重点——不同模式下 Wireshark 的抓包位置完全不同。1.3 为什么网上教程的截图让你“选VMware网卡”你却连名字都找不到一个高频场景是打开 Wireshark 的接口列表别人截图里有一堆 VMware 开头的适配器自己列表里却只有物理网卡。这不一定是你没装好 VMware更常见的原因是 VMware 的虚拟网络服务没起来或者虚拟网络配置里对应模式没启用。具体来说如果你创建虚拟机的时候选的网络连接方式是 NAT物理机上应该能看到“VMware Virtual Ethernet Adapter for VMnet8”这个适配器。但如果你在虚拟网络编辑器里把 VMnet8 的 NAT 功能关了或者把某个虚拟网络的“连接主机虚拟适配器”选项去掉了那物理机上对应的这个虚拟网卡就直接消失了。Wireshark 自然也就看不到。所以当你发现 Wireshark 列表里没有任何 VMware 字样时不要先急着动 Wireshark先去物理机的“网络连接”里看看 VMware 的虚拟网卡还在不在。如果设备管理器里连“VMware Virtual Ethernet Adapter”都没了那问题出在 VMware 这一层不是 Wireshark 的问题。2. 三种网络模式下Wireshark到底应该抓哪个接口2.1 桥接模式抓物理网卡而不是找“虚拟网卡”桥接模式的流量路径是虚拟机内部网卡 → VMnet0 虚拟交换机 → 物理机网卡 → 物理网络。换句话说虚拟机的流量出了虚拟网卡之后会直接映射到物理机的物理网卡上相当于跟物理机共用了同一块物理网卡去上网。在这种模式下如果你在物理机上开 Wireshark 抓包应该选那块实际连网的物理网卡比如“以太网”或者“WLAN”而不是去找什么“VMware 虚拟网卡”——因为你根本找不到桥接模式本来就没有对应的宿主机适配器。但这里有个容易困惑的点桥接模式下在物理网卡上打开混杂模式之后Wireshark 确实能抓到虚拟机的报文因为数据链路层上它们共享同一个物理口。可如果物理机连的是无线网卡桥接模式下的抓包兼容性往往不如有线网卡那么干净有些无线网卡驱动不支持很好的混杂模式导致抓包的时候只能看到物理机自己的流量虚拟机流量被过滤掉了——这个我们在后面的问题排查章节会具体展开。2.2 NAT模式抓VMnet8才是正确姿势NAT 模式的实际路径是虚拟机网卡 → VMnet8 虚拟交换机 → 宿主机侧的 NAT 服务做地址转换 → 物理网卡 → 外网。这种情况下虚拟机和物理机之间通信走的是 VMnet8 这个虚拟网络。物理机上的 Wireshark 想抓虚拟机的流量有两个选择抓“VMware Virtual Ethernet Adapter for VMnet8”能看到虚拟机和宿主机之间的通信也能看到虚拟机经过 NAT 之后对外访问的流量形态。抓物理网卡虽然也能看到一部分出站的包但看到的是 NAT 转换之后的地址而且入站方向的流量多半看不到。所以 NAT 模式最推荐的方式是直接抓 VMnet8 的宿主机适配器。这里有个操作细节选接口时建议勾选“以混杂模式捕获所有包”不然某些情况下只能看到宿主机自身发往 VMnet8 的包而看不到其他虚拟机发过来的广播帧。2.3 仅主机模式抓VMnet1流量最干净也最容易误解仅主机模式的物理路径是虚拟机网卡 → VMnet1 虚拟交换机 → 宿主机适配器。这个网络默认不提供 NAT也不桥接到物理网卡所以流量完全限制在宿主机和该网络内的虚拟机之间。抓包的时候选择“VMware Virtual Ethernet Adapter for VMnet1”理论上可以看到宿主机与虚拟机之间所有通信。这也是我最推荐新手用来练习抓包的场景因为流量可控、无外部干扰抓到的包非常干净特别适合理解 ARP、ICMP、DNS 这些基础协议。但注意仅主机模式下虚拟机访问外网的流量是走不通的如果你在虚拟机里 curl 外网然后在 VMnet1 上抓包你会发现什么包都没有。这属于模式本身的限制不是 Wireshark 的问题。2.4 一个表格帮你锁定正确的抓包位置虚拟机网络模式物理机上的Wireshark应选哪个接口能抓到的流量范围推荐程度桥接模式物理机实际联网的网卡以太网/WLAN虚拟机与外部网络之间的流量依赖物理网卡混杂模式支持中等NAT模式VMware Virtual Ethernet Adapter for VMnet8虚拟机和宿主机之间、虚拟机经NAT发出的流量高仅主机模式VMware Virtual Ethernet Adapter for VMnet1宿主机与虚拟机之间的私有网络流量高自定义VMnetX对应VMnetX的宿主机适配器该网络中所有设备的广播与单播高这个表建议保存下来。每次有人问我“为什么抓不到虚拟机流量”我第一句话就是先确认你的虚拟网络模式再确认你选中了正确的接口80% 的问题都在这一步。3. 实操让Wireshark正确找到并抓到虚拟机网卡流量3.1 环境检查Npcap、管理员权限、VMware虚拟网络服务正式开始抓包之前先花两分钟做环境自检这套检查流程能规避掉后面绝大多数“抓到不包”的烦恼。第一步确认 Wireshark 的抓包驱动装了没。新版本 Wireshark 安装时会附带安装 Npcap如果在安装时取消了 Npcap或者系统里只有老掉牙的 WinPcap那接口列表大概率是空的。可以在命令行里执行sc query npf sc query npcap如果出现“指定的服务未安装”之类的提示那就需要重新安装 Npcap并且安装时勾选“Support raw 802.11 traffic”以及“WinPcap API-Compatible Mode”这两个选项。第二个选项特别重要因为有些老工具只认 WinPcap 的 API装了兼容模式才不会出幺蛾子。第二步确认 Wireshark 是否以管理员权限运行。Wireshark 抓包需要访问原始套接字和数据链路层接口普通权限下可能看到网卡列表但打开捕获时直接报错或者列表一片空白。右键 Wireshark 图标选“以管理员身份运行”这是最基本的操作但也是最容易被忽略的操作。第三步确认 VMware 的相关服务正在运行。打开了“Windows 服务”管理器找到“VMware NAT Service”和“VMware DHCP Service”确保它们处于“正在运行”状态。如果 NAT 服务没起来VMnet8 的宿主机适配器可能是存在的但虚拟机的网络是断开状态抓包自然什么都没。3.2 方案A直接在虚拟机内部抓包最干净、最推荐如果你只是想分析虚拟机里某个应用产生的流量那最推荐的方案不是物理机上折腾而是直接在虚拟机里安装 Wireshark然后选择虚拟机自己的网卡接口去抓。这样抓到的流量没有任何 NAT 或虚拟交换层的干扰是所有方案里最完整的。具体操作非常简单在虚拟机里下载安装 Wireshark跟物理机装软件没有区别。打开之后接口列表里会出现一块或多块虚拟网卡名字通常是“Ethernet0”“ens33”或“eth0”选中它开始抓包即可。这样做有一个额外的好处你可以抓到来往于虚拟机内部的环回流量、某些只发生在虚拟机本地的 socket 通信这些流量在物理机上抓不到的。缺陷也很明显——会占用虚拟机的 CPU 和内存而且在低配的虚拟机里大流量抓包偶尔会导致虚拟机内网络短暂卡顿。如果你做的实验对性能敏感可以改用方案 B在物理机上抓。3.3 方案B物理机上抓VMnet8网卡NAT模式的完整步骤这个方案适合那些不想在虚拟机里装额外软件、只想在宿主机一侧统一管控抓包的人。以 NAT 模式为例完整步骤如下第一步确认虚拟机的网络模式是 NAT。可以在虚拟机的“虚拟机设置 → 网络适配器”里确认选择的是“NAT 模式”。第二步在物理机上以管理员身份打开 Wireshark进入“捕获选项”或直接点接口列表旁边的齿轮图标。第三步在接口列表里找到“VMware Virtual Ethernet Adapter for VMnet8”勾选它同时在下方勾选“以混杂模式捕获所有包”。这一项很关键如果不勾某些情况下你只能看到物理机主动发往该虚拟网络的包而无法看到虚拟机主动发起的流量。第四步设置完点击“开始”。此时去虚拟机里随便 ping 一个外网 IP比如ping 223.5.5.5或者在虚拟机里打开一个网页。第五步回到 Wireshark在过滤栏输入icmp你应该能看到来自虚拟机 IP 地址的 ICMP 请求包。再看一下源 IP——跟虚拟机内部看到的 IP 一模一样不一定。如果虚拟机走的是 NAT你看到的源 IP 可能是 192.168.x.x虚拟机内网 IP目的地址则是公网 IP。这正好展示了 NAT 模式下虚拟机的网络行为。3.4 方案C桥接模式下抓物理网卡数据的注意事项桥接模式下没有独立的虚拟网卡可抓只能抓物理网卡。但在实际操作中这个方案有个暗坑如果你的物理机用无线网卡上网桥接模式虚拟机的数据帧虽然在 VMware 虚拟交换机内部流转但部分无线网卡驱动不会把所有帧交给抓包工具导致你抓了半天只能看到物理机自己产生的流量。遇到这种情况有三种选择更换为有线网卡再试抓包兼容性最好。如果必须用无线网卡可以试着在 Wireshark 的“捕获选项”里勾选混杂模式并确认无线网卡驱动支持“Monitor Mode”监听模式。但 Windows 下无线网卡对监听模式的支持普遍很弱别抱太大期望。改用 NAT 模式抓 VMnet8绕开无线物理网卡的限制实现在物理机一侧捕获虚拟机流量。桥接模式下抓物理网卡的另一个注意点是你会同时抓到物理机本身的全部流量、虚拟机的流量以及同一局域网内其他设备的广播报文。数据量大过滤很重要建议尽早用过滤表达式锁定目标比如ip.addr 192.168.1.50其中 192.168.1.50 是虚拟机的 IP。这样眼前会立刻清爽很多。4. 常见问题排查与避坑实录4.1 接口列表全空一个接口都看不到这个现象排第一很多人刚装完 Wireshark打开一片空白。原因基本跑不出这三个Npcap/WinPcap 驱动没装好或者安装时没有勾选兼容模式Wireshark 没有以管理员权限运行系统服务里 npf/npcap 服务被禁用了。排查步骤也很直接打开命令行执行sc query npf如果返回 START_PENDING 或 STOPPED可以尝试net start npf如果提示“服务名无效”那就是驱动没装上去 Wireshark 官网重新下载 Npcap 安装即可安装完重启一次系统。记住不要手动把 npf 服务设为“禁用”否则以后每次抓包都要先折腾服务。4.2 能看到VMware适配器但抓不到任何包接口列表里明明有 VMnet8选上之后点了开始界面却很安静一条包都不动。这种情况按顺序排查确认虚拟机是否真的在产生流量。在虚拟机里执行 ping 外网、ping 宿主机确认网络通不通。确认有没有勾选“混杂模式”。只勾选接口但不勾混杂模式虚拟机上发生的大部分单播流量根本不会复制给宿主机适配器。确认你过滤的条件对不对。有人直接输入ip.addr 物理机IP结果虚拟机跟外网通信根本不经过物理机 IP当然过滤为空。正确做法是先不填过滤条件看一眼全部流量再逐步缩小范围。确认抓的是不是正确的 VMnet。VMware 网络编辑器里查看一下虚拟机的网络连接类型如果配的是 VMnet1你选 VMnet8 去抓当然什么都抓不到。4.3 在虚拟机里抓包网络突然变卡甚至断连这个现象也常见特别是老版本的 Wireshark 搭配低配虚拟机时最明显。原因有两个方向一是 Wireshark 开启抓包后网卡进入混杂模式原本应该由硬件网卡按 MAC 地址过滤掉的无关帧也被大量接收导致网卡中断负载飙升二是虚拟机内部 CPU 资源被 Wireshark 的图形界面和抓包缓冲区吃掉网络协议栈处理不过来。应对办法有三个给虚拟机多分配一点 CPU 和内存如果宿主机资源允许。抓包时用-c参数限制捕获包数量或者提前设置好过滤条件减少捕获量。尽量用禁用图形界面的命令行抓包工具例如在虚拟机里装 tcpdump 或者 Wireshark 的 tshark抓完导出 pcap 再用物理机上的 Wireshark 分析。这样做性能损耗小很多。4.4 抓到了包但时间显示不对Wireshark 默认显示的是抓包时的本地时间但如果你自己的物理机时区设置不对或者虚拟机里跑的是 UTC 时间而宿主机是北京时间时间戳就会出现偏差。这时候不是重新抓包的问题直接改显示设置就行进入“视图 → 时间显示格式”选择“日期和时间当地”或者“UTC”。如果你想要的是把 UTC 转成北京时间用相对时间最方便对比也可以在“首选项 → Appearance → Time Format”里调整默认格式。更优雅的做法是在虚拟机里先同步时间再抓包这样 pcap 文件里的时间戳才是全球统一的绝对时间后面做流量分析、日志关联时不会对不上。4.5 抓包时提示“No packets captured”但接口有字节跳动有时候 Wireshark 右下角能看到流量在哗哗走接口列表也有数字跳动但捕获面板一条包都没有。这个情况多半是过滤条件写得太严了或者抓包的时候网卡没有实际处于收发数据的状态。还有一个小概率情况物理机的网卡开启了“RSS接收端缩放”多队列某些老版本 Npcap 驱动不支持多队列部分队列的数据没复制给捕获层。如果你遇到类似情况可以把网卡的“RSS”关掉再试或者更新 Npcap 到最新版本。这个坑在网上讨论得不多但实测在部分 Intel 网卡上确实出现过。5. 实操小结与个人习惯讲完这些最后分享一点我个人做虚拟机流量分析时沉淀下来的操作习惯。第一能进虚拟机里抓的尽量进虚拟机里抓不要贪图省事在物理机上绕。虚拟机内抓包拿到的才是最完整的虚拟网卡收发数据物理机上不管抓 VMnet1 还是 VMnet8本质上都是抓一个“带过滤功能的子集”。第二如果必须在物理机上抓优先选 NAT 模式配合 VMnet8流量集中且可控。第三抓包之前一定先花三十秒确认虚拟网络模式模式没确认清楚就开抓后面大概率白忙。还有一个小技巧我每次搭好一个虚拟机实验环境后会先在虚拟机里对着宿主机 IP 连续 ping 几百个包同时在物理机上用 Wireshark 抓对应 VMnet 接口以此验证抓包通道是通的。这套动作只需要一分钟但能在正式抓包前把所有链路问题暴露干净省去后面排查的时间。你可以试试。