ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Wireshark发现不了虚拟机网卡?三类场景与排查方案

Wireshark发现不了虚拟机网卡?三类场景与排查方案 Wireshark打开后接口列表里安安静静虚拟机那块网卡就像根本没存在过一样——这种问题我碰过不止一次。很多人第一反应就是重装驱动、重装Wireshark甚至把虚拟机删了重建但折腾一圈回来还是老样子。实际上“发现不了虚拟机网卡”这句话背后至少藏着三种完全不同的故障场景而每种场景的解决路径几乎不重叠。如果你也卡在这一步先别急着换工具花几分钟把下面这套排查思路过一遍大概率能省下半天时间。1. 三种“发现不了”场景先定位你卡在哪一步1.1 场景A宿主机上看不到VMnet适配器在Windows宿主机上装VMware Workstation后系统网络连接里会多出两个虚拟网卡VMnet1Host-Only专用和VMnet8NAT专用。Wireshark的接口列表里也应该能看到这两个名字。如果列表里压根没有它们说明问题出在VMware虚拟适配器本身而不是Wireshark。判断方法非常直接WinR打开运行框输入ncpa.cpl打开网络连接窗口看看里面有没有VMnet1和VMnet8。如果没有去VMware的“虚拟网络编辑器”菜单栏编辑 - 虚拟网络编辑器里检查把左下角“更改设置”权限打开后确认VMnet1和VMnet8对应的“将主机虚拟适配器连接到此网络”是否勾选了。没勾选就勾上然后应用宿主机的网络连接里会重新出现对应的适配器。1.2 场景B虚拟机内部看不到eth0/ens33这是最容易被误判的一种。你在虚拟机里装了Linux命令行里敲ip addr能看到网卡有IP地址但打开Wireshark却看不到这张网卡。这种情况和宿主机没关系纯粹是虚拟机内部权限、驱动或Npcap服务的问题。Linux下Wireshark图形界面要正常枚举网卡通常需要当前用户对/sys/class/net下的接口有读权限或者直接用sudo权限运行。很多人用普通用户启动Wireshark网卡列表为空但用sudo wireshark启动就一切正常。另外如果虚拟机网卡类型是VMXNET3而Linux内核里没有加载vmxnet3驱动模块网卡在系统里都不会出现更不用说被Wireshark发现了。1.3 场景C接口列表有网卡但一个包都抓不到这类问题最隐蔽表象是“发现了”但实际功能完全不可用。选中虚拟机网卡后点开始界面滚动的都是些断断续续的包或者干脆零包。这往往不是Wireshark的锅而是虚拟机网卡和虚拟交换机之间的链路没有真正打通或者你抓错了接口。提示先做连通性验证再做抓包验证。在虚拟机里ping一下宿主机或网关如果ping不通Wireshark怎么抓都白搭如果ping通了但抓不到包再检查混杂模式和驱动问题。2. Wireshark为什么看不到网卡接口枚举、驱动服务与权限问题2.1 Wireshark列出网卡的底层机制Wireshark本身不直接操作网卡它在Windows上依赖Npcap旧版本是WinPcap在Linux/macOS上依赖libpcap。启动时Wireshark调用pcap_findalldevs_ex枚举所有网卡设备这个过程完全由底层抓包驱动完成。也就是说底层驱动看不到这张网卡Wireshark的界面就绝不会出现这张网卡。Windows环境里Npcap安装后会产生一个名为npcap的驱动服务。你可以用管理员身份打开命令提示符执行sc query npcap如果服务状态不是RUNNING或者提示服务不存在Wireshark基本不可能正常枚举任何网卡。这时需要重新安装Npcap安装时右键选择“以管理员身份运行”安装完成后重启一次系统。2.2 Wireshark界面变成“空白”的隐藏原因无管理员权限Windows下Wireshark枚举网卡还有一个高频坑——UAC权限隔离。即使用户在账户列表里是Administrator双击Wireshark图标启动的进程也默认是标准权限。Npcap在Windows Vista以后的系统上对权限要求更严格接口列表可能只显示一部分甚至什么都不显示。遇到这种问题建议固定用这两种启动方式之一右键Wireshark图标 → 属性 → 兼容性 → 勾选“以管理员身份运行此程序”或每次启动时右键 → “以管理员身份运行”Linux下的等效问题则是用户组权限。把当前用户加入wireshark组不同发行版可能叫pcapsudo usermod -aG wireshark $USER然后重新登录普通用户就能正常枚举网卡了不用每次sudo启动。2.3 Npcap安装选项对VMware网卡可见性的影响Npcap安装过程中有几个选项其中一个叫“Support raw 802.11 traffic (and monitor mode) for wireless adapters”还有一个是“Restrict Npcap to administrative users”。如果你是做虚拟化网络实验的建议安装时不要勾选“Restrict Npcap to administrative users”否则普通用户的Wireshark就是一张网卡都看不到。另外Npcap为了兼容老工具提供了“WinPcap API compatibility”选项。某些抓包场景依赖旧版WinPcap的调用方式所以安装时顺手勾上这个兼容模式能省掉很多莫名其妙的列表为空问题。3. 虚拟机网卡的特殊性虚拟交换机、混杂模式和VMnet适配器的关系3.1 虚拟交换机让“抓包”这件事变了味道很多人把在虚拟机上抓包理解成“在物理网卡上抓包”这其实是两个完全不同的概念。VMware的虚拟网卡并不直接挂在物理网卡上而是挂在一个软件实现的虚拟交换机vSwitch上。虚拟交换机同样有端口、有MAC地址表而且它有自己独立的转发逻辑。举个例子两个桥接模式的虚拟机A和B互ping数据帧从A的虚拟网卡出去后进入虚拟交换机虚拟交换机查看目标MAC地址发现目标在B的虚拟端口直接把帧从B端口转出去整个过程完全不经过物理网卡。你在宿主机物理网卡上开Wireshark自然一个包都看不到。正因为这样很多“抓不到虚拟机流量”的问题根源是流量根本就没走你正在抓的那块网卡。3.2 VMware三种网络模式与可见流量范围网络模式虚拟交换机VMware虚拟网卡是否参与能抓到什么流量桥接模式VMnet0宿主机物理网卡只能看到物理网卡实际收发的帧VM间互访流量可能完全不经过物理链路NAT模式VMnet8宿主机有VMnet8虚拟适配器能看到NAT网关和VM间经虚拟交换机广播的帧单播帧取决于虚拟机是否发往宿主机Host-OnlyVMnet1宿主机有VMnet1虚拟适配器能看到宿主机与VM之间、同一虚拟交换机上VM间经广播传播的帧这张表的核心结论是如果你非要抓“所有虚拟机之间的互访流量”最省心的方式不是去宿主机物理网卡那里等而是直接在虚拟交换机上做镜像或者在虚拟机内部抓包。3.3 混杂模式虚拟交换机安全策略默认就是关的在物理网络里只要网卡开启混杂模式通常能收到交换机泛洪到这个端口的所有帧。但虚拟交换机不一样它有独立的安全策略VMware ESXi里叫“安全策略”VirtualBox里叫“混杂模式”选项VMware Workstation的虚拟交换机也有自己的转发行为。ESXi环境下默认策略是“混杂模式拒绝”。也就是说即便你在虚拟机网卡上开了混杂模式虚拟交换机也不会把一个不属于该虚拟端口MAC地址的帧送进来。你要抓同一个vSwitch上其他VM的包必须在ESXi的vSwitch安全策略里把“混杂模式”改成“接受”。这一步不改Wireshark里选什么都没用。VirtualBox用户则要检查虚拟机“网络”设置里的“高级”选项把“混杂模式”从“拒绝”改成“全部允许”。这一步在默认配置下是个隐藏比较深的开关很多人找半天都没找到。4. 四套从“看不见”到“抓得到”的实战方案4.1 方案一修复宿主机Windows的VMnet接口枚举如果你确认VMnet1/VMnet8在网络连接里存在但Wireshark列表里不显示按顺序做以下操作以管理员身份重新运行Npcap安装包勾选WinPcap兼容模式修复安装。以管理员身份打开命令提示符执行net stop npcap net start npcap重启抓包驱动。禁用再启用VMnet适配器打开ncpa.cpl找到VMnet8右键禁用再右键启用。重启Wireshark管理员身份运行。如果Wireshark仍然看不到再检查一个容易被忽略的点Windows的网络服务里“VMware Bridge Protocol”是否勾选。在VMnet适配器属性窗口里选择“配置”然后在“高级”标签页检查有没有VMware相关协议选项。桥接服务异常时虚拟适配器的枚举状态会处于半瘫痪状态Wireshark是有可能看不到的。4.2 方案二直接在虚拟机内部抓包如果你需要抓的本来就是虚拟机自身的进出流量最稳妥的方案是在虚拟机内部直接跑Wireshark或tcpdump。这个方案最大的优点是简单、完整不需要折腾宿主机也不受虚拟交换机安全策略影响。Linux虚拟机里优先用命令确认网卡能被识别tcpdump -D这个命令会列出所有可抓包接口比如eth0、ens33、any。如果输出为空说明当前用户的权限不够用sudo执行sudo tcpdump -D如果sudo下能看到接口说明是权限问题按前面提到的加入wireshark用户组解决。如果连sudo都看不到接口那就要检查虚拟机网卡驱动了。建议在虚拟机的VM设置里把网卡类型从E1000改成VMXNET3VMXNET3是VMware的半虚拟化驱动性能更好识别率更高前提是虚拟机系统里装了VMware Tools。Windows虚拟机里抓包注意装Npcap的时候同样用管理员身份Wireshark也用管理员身份启动。另外Windows虚拟机的防火墙可能拦掉一些入站流量抓包前先关掉Windows防火墙或者配好放行规则不然Wireshark里只能看到出站包。4.3 方案三Wireshark远程抓包——让宿主机帮虚拟机“代抓”如果你不想在虚拟机内部装任何东西又要抓虚拟机网卡上的包可以考虑Wireshark的远程抓包功能。Wireshark内置了SSH远程抓包支持本质上是借助远程主机上的tcpdump来采集数据。举一个实际场景宿主机是Linux上面跑了若干KVM虚拟机。你在Wireshark里打开“捕获选项”在“管理接口”里配置远程接口填上ssh://root宿主机IP连接后接口列表会把宿主机上的物理网卡、虚拟网桥接口都枚举出来比如eth0、br0、virbr0。选中对应的虚拟网桥就能抓到虚拟机的流量。命令行版本更简单ssh root宿主机IP tcpdump -i br0 -U -w -然后用Wireshark的“从文件读取实时数据”功能打开管道或者用tshark直接解析ssh root宿主机IP tcpdump -i br0 -U -w - | tshark -i -这套远程抓包方式对“不想在VM里装软件”“VM系统太精简连网卡驱动都勉强”的场景尤其好用。但注意必须确保远程主机上有tcpdump命令并且SSH账户有执行权限。4.4 方案四在ESXi虚拟交换机上开混杂模式或端口镜像如果你用的是vSphere/ESXi环境抓包目标是想看到多台虚拟机之间的所有流量标准做法是调整虚拟交换机安全策略。步骤如下登录vSphere Web Client。进入对应的主机 → 网络 → 选择虚拟交换机vSwitch0或其他。编辑设置 → 安全 → 把“混杂模式”从“拒绝”改为“接受”。同时在“虚拟机端口组”里同样把“混杂模式”改为“接受”。改到这里连接到该端口组的虚拟机的Wireshark才能看到同交换机下其他VM的单播流量。还有一种更精准的做法是做端口镜像Port Mirroring在分布式交换机上配置镜像会话把源端口设置为需要监控的VM端口目的端口设置为你抓包跳板机所在的端口。这样做的好处是不影响生产环境的转发行为只复制一份流量给抓包机。注意修改vSwitch安全策略会影响整个虚拟交换机的网络行为生产环境慎用。修改完尽快抓包抓完立刻改回“拒绝”避免不必要的安全风险。5. 验证抓包结果以及排错最后一公里的经验5.1 抓包前先会生成流量别干等很多人开好了Wireshark就开始等等半天抓不到包误以为抓包失效。实际上很多虚拟网卡在没有跨网段流量时非常安静仅靠周期性广播包看起来就像死了一样。建议抓包前主动制造流量用最通用的ICMP包验证虚拟机里ping网关ping 192.168.1.1同时Wireshark里设置显示过滤器icmp如果能看到ICMP回显请求和应答链路就是通的。如果只看到请求没看到应答说明流量有去无回问题往往出在防火墙或路由而不是抓包工具。5.2 网卡列表可见、但捕获零包的排查顺序这种半死不活的状态比完全看不见更折磨人。我的排查顺序通常是这样先看Wireshark左下角状态栏确认捕获是否真的在跑有绿色小车图标在动。再看“捕获过滤器”是否误设了过滤规则捕获过滤器写错会把所有包都过滤掉。关闭Windows防火墙或Linux iptables排除防火墙干扰。在虚拟机网卡属性里查“卸载TCP/IP校验和”相关选项某些网卡驱动的高性能卸载特性会导致抓包工具只能看到校验和失败的包显示为黑色背景的坏包。还有一个特别容易踩的坑Hyper-V与VMware共存。Windows宿主机一旦启用了Hyper-V或者“虚拟机平台”功能所有网卡的抓包路径都会被Hyper-V的虚拟交换机强制接管Npcap在这种状态下抓包会变得时灵时不灵。如果你装了VMware又开了Hyper-V建议在“Windows功能”里把Hyper-V相关组件卸载或禁用否则很多网卡异常问题根本说不清。5.3 一张能直接照抄的排查清单症状优先检查项解决办法Wireshark接口列表为空Npcap服务 / 管理员权限管理员安装Npcap管理员运行WiresharkLinux虚拟机看不到网卡用户组权限 / 网卡驱动加入wireshark组换VMXNET3网卡类型宿主机Wireshark看不到VMnetVMware虚拟网卡未启用虚拟网络编辑器里勾选主机虚拟适配器并应用抓到包但全是坏包网卡校验和卸载高级属性里关闭TCP/UDP校验和卸载抓不到其他虚拟机流量vSwitch安全策略ESXi开混杂模式VirtualBox开“全部允许”接口正常但零包捕获过滤器误设检查捕获过滤器暂时清空后重试5.4 最后聊点实操体会我自己的习惯是能命令行解决的不开图形界面。排查虚拟网卡问题时tshark -D或tcpdump -D比Wireshark图形界面更能暴露底层问题。接口枚举成功后会直接打印设备名失败时会给出更明确的报错信息比如权限不足、驱动不存在等而不是界面上一张空白列表让你猜。另外抓包前把虚拟机“迁移”“快照恢复”这类动作先停一停。有些虚拟网卡在Windows VM里被“热插拔”过之后枚举状态会一直残留在一个半失效状态Wireshark能看到网卡但数据包死活不进来。这时候不要反复调试抓包工具直接重启虚拟机或者禁用再启用虚拟网卡往往比改半天配置更有效。虚拟机网络抓包这套东西说难不难但坑位非常固定。只要确认了“流量到底走在哪条路径上”“虚拟交换机是否把包送给了你的抓包接口”剩下的大半问题都能顺着逻辑推出来。下次再遇到Wireshark发现不了虚拟机网卡别再删虚拟机了按上面的链路从上往下捋一遍你大概率能找到那个让你卡了一个小时的开关在哪里。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进