干网络排障这些年,我碰到最多的尴尬场景,不是抓不到包,而是"包抓了一大堆,却找不对该看的那一层"。尤其当一个环境里同时出现深信服安全设备、VMware/Hyper-V 虚拟化和各种叫不上名字的虚拟网卡时,Wireshark 一打开,接口列表里能蹦出七八个名字:以太网、WLAN、VMnet1、VMnet8、vEthernet (Default Switch)……到底该点哪一个,很多老手都得愣一下。
这篇文章就把 Wireshark、深信服、虚拟网卡这三件事串起来讲清楚。适合正在做网络排障、安全应急、虚拟机网络调试,以及刚接触抓包但被虚拟化环境劝退的朋友。文章里不会只给你"选个网卡点开始"这种废话,而是先把原理讲透,再给可复现的抓包步骤,最后把我踩过的坑和排查技巧也一并交底。
1. 先搞清楚:你手里的“网卡”到底是哪种虚拟网卡
1.1 虚拟交换机和虚拟网卡的几种常见形态
“虚拟网卡”这四个字在抓包语境里是个很笼统的说法。你界面上看到的虚拟网卡,可能来自完全不同的机制,抓包时的行为也完全不一样。
第一种是 VMware Workstation/Player 的 VMnet 虚拟网卡。装完 VMware 之后,Windows 的网络连接里会出现 VMnet1 和 VMnet8。VMnet1 对应 Host-Only(仅主机)模式,VMnet8 对应 NAT 模式。VMware 内部会在物理网卡之上构建一个虚拟交换机,虚拟机不管用哪种网络模式,数据都要经过虚拟交换机,再决定走哪个 VMnet 网卡。
第二种是 Hyper-V 创建出的一组 vEthernet 虚拟网卡。当你新建一个外部、内部或专用虚拟交换机时,Windows 会为宿主机自动添加一个对应的 vEthernet (交换机名称) 网卡。这台机器的真实物理网卡往往会被虚拟交换机接管,原来那个"本地连接"可能不见了,只剩一个 vEthernet 名字的入口。
第三种是安全软件、终端防护软件创建的虚拟网卡。有些行为管理、准入控制、终端安全类客户端安装后,会在系统里插入一个虚拟网卡或 NDIS 过滤驱动,用来接管来往流量做识别和管控。深信服的部分终端安全产品就有类似逻辑,安装后你用ipconfig /all能看到多出来一块叫不出厂商名字的虚拟网卡。
第四种是 TAP/TUN 这类通用虚拟设备,常见于各种网络实验和软件定义网络场景。TAP 模拟以太网层,TUN 模拟网络层,特点是在 Wireshark 里都能看到独立的接口,但抓包效果取决于软件是否把真实流量交到这块虚拟网卡上。
搞不清这一点,后面选抓包接口就很容易翻车。抓包之前先执行一下ipconfig /all,把那块带 IP 地址的虚拟网卡和它的网关、DHCP、描述信息都看一遍,心里有个底。
1.2 为什么在物理网卡上抓不到虚拟机流量
很多人习惯性在物理网卡上点"开始捕获",结果等半天只看到自己的广播包,虚拟机里跑了大量业务却毫无踪影。这不是 Wireshark 坏了,而是因为你选错了抓包位置。
虚拟机的数据流从虚拟网卡出来之后,先进虚拟交换机,再由虚拟交换机决定送到物理网卡还是直接走 NAT/仅主机通道。如果虚拟机和宿主机之间走的是 NAT 模式,物理网卡上能看到的是宿主机做了地址转换之后去往外部网络的流量,而虚拟机和宿主机之间、虚拟机和虚拟机之间的流量根本不会出现在物理网卡上。Hyper-V 场景更特殊,外部虚拟交换机会直接把物理网卡接管,物理网卡在宿主操作系统里可能已经不再承担收发包入口的角色,你在那个原本的物理网卡上抓包,自然是什么都抓不到。
还有一个隐蔽原因:像深信服这种安全设备或终端防护软件,多采用 NDIS 过滤驱动来串联网络路径。它们并不是"纯旁观",而是真正拦在网卡和协议栈之间。哪怕你在物理网卡上抓包,过滤驱动已经先一步把某些报文处理掉或改写了,Wireshark 只能看到过滤驱动放行后剩下的部分。这就解释了为什么有时候在设备侧能看到完整包,到了终端上抓包却只有一半。
所以抓包第一原则是:接口选择要围绕“流量实际流过哪块网卡”,而不是“哪块网卡名字像外网出口”。
2. Wireshark 抓包环境准备:Npcap、权限和接口识别
2.1 Npcap 和 WinPcap 怎么选
Windows 上运行 Wireshark,底层抓包驱动只有两种:老牌 WinPcap 和它的继任者 Npcap。新装环境我强烈建议直接选 Npcap。WinPcap 已经很多年不更新,对 Windows 10/11 上的很多虚拟网卡和 NDIS 6 驱动支持不全。Wireshark 4.x 安装包默认也会推荐 Npcap。
安装 Npcap 时有几个选项值得注意。默认勾选"Support raw 802.11 traffic"(支持原始 802.11 流量)可以用,但这个选项不是必需品,如果只是为了抓以太网帧,不必强求。建议勾选"Do not install WinPcap API-compatible Mode"要慎重,因为有些老软件依赖 WinPcap API,保持兼容模式会省事一些。装完 Npcap 之后,如果系统里残留旧的 WinPcap,最好手动卸载干净,两者同时存在偶尔会导致接口识别混乱。
Linux 和 macOS 下一般不需要额外驱动,但要注意抓包权限。Linux 下普通用户抓包会提示权限不足,要么用sudo wireshark执行,要么给dumpcap这个可执行文件设置 setcap 权限。生产服务器上别图省事直接sudo跑图形界面,建议只给抓包命令授权,尽量缩小权限暴露面。
2.2 找不到虚拟网卡时,先开“显示所有接口”
Wireshark 首页的接口列表看似完整,实际上有时会把一些虚拟网卡隐藏掉。遇到 vEthernet、VMnet、TAP 接口没出现在列表里,点首页界面下方的"捕获选项"(Capture Options),或者按快捷键 Ctrl+K,在弹出的窗口左下角找到"显示所有接口"的开关。
还有一种情况,接口出现了,但显示为"没有可用数据"或者"接口处于 down 状态"。这通常不是 Wireshark 的问题,而是虚拟网卡本身没有启用。进 Windows 的ncpa.cpl网络连接窗口,右键查看这一块网卡是不是处于"已禁用"状态,启用后再回到 Wireshark 刷新接口列表。
接口选择里还有一列叫"混杂模式"(Promiscuous Mode)。虚拟机场景下,虚拟交换机端口如果不是镜像模式,即使开了混杂也不一定能把所有虚拟机流量都收进来,这个后面细说。但至少常规抓包时建议保持在默认开启状态,否则可能连广播和多播包都看不全。
2.3 三步验证“到底能不能抓到”
选好接口之后别急着做复杂的业务操作,先用最基础的方式验证链路是否打通。
第一步,接口选好后直接点开始捕获,然后在终端或者浏览器里发起一个最简单的 ICMP 请求,比如ping <网关地址>。第二步,回到 Wireshark 主界面,在显示过滤栏输入icmp,看有没有过滤出对应的回显请求和回显应答。第三步,再试着访问一个域名,过滤条件换成dns,看能否看到查询和应答。
如果能看到 ICMP 和 DNS,说明抓包链路没问题,接下来只需要针对性过滤业务流量。如果什么包都没有,优先检查接口是否选错、权限是否足够、虚拟网卡是否启用。这时候不要继续做高难度操作,先解决基础问题,否则后面所有分析都是在猜。
3. 实战一:VMware 虚拟机环境下用 Wireshark 抓包
3.1 桥接、NAT、仅主机模式下的抓包差异
VMware 三种网络模式在抓包时的接口选择完全不同,直接上表:
| 网络模式 | 流量路径 | 宿主机上推荐抓包接口 | 备注 |
|---|---|---|---|
| 桥接模式 | VM 网卡 → 虚拟交换机 → 物理网卡 | 物理网卡 | 如果宿主机开混杂模式,多数情况下能看到 VM 出口流量 |
| NAT 模式 | VM 网卡 → 虚拟交换机 → VMnet8 | VMnet8 | 宿主机物理网卡只能看到转换后的流量 |
| 仅主机模式 | VM 网卡 → 虚拟交换机 → VMnet1 | VMnet1 | 虚拟机和宿主机之间的流量在此可见 |
桥接模式下,虚拟机直接和物理网络共用网段,数据包从 VMware 的虚拟交换机出来后会真正经过物理网卡。此时在宿主机上抓物理网卡,理论上能看到虚拟机的收发包,但在 VMware 的实现中,混杂模式和交换机的端口行为会影响最终效果。最稳妥的做法还是进入虚拟机内部,在虚拟机自己的网卡上抓包。
NAT 模式下最容易踩坑。很多新手在宿主机上盯着物理网卡抓包,看到虚拟机上网非常流畅,但抓包结果里只有宿主机自身的流量。因为 NAT 本身就是一个三层转换设备,虚拟机流量到 VMnet8 后,会以宿主机的 IP 重新封装,到物理网卡时,源 MAC、源 IP 都变了。你要分析虚拟机里的实际应用报文体,就必须在 VMnet8 或者虚拟机内部抓。
仅主机模式比较小众,一般用于隔离实验环境。它的流量只存在于虚拟机和宿主机之间,在物理网卡上抓包什么都拿不到,抓 VMnet1 就完全够用。
3.2 深信服终端安全软件接入后要注意“驱动打架”
有些环境里,宿主机或虚拟机装的是深信服系列的终端安全客户端。这类软件为了做网络层监控,会在系统中插入过滤驱动或者虚拟网卡。问题在于,Wireshark 的 Npcap 本身也是一个 NDIS 过滤驱动,两类驱动同时存在并挂接在同一网络栈上时,可能会出现抓不到包、虚拟网卡驱动加载失败、甚至应用启动异常的情况。
我遇到过虚拟机里装了深信服终端防护后,某个数学计算软件(类似 MATLAB 场景)无论怎么启动都没反应,任务管理器里有进程但界面不出来。排查一圈发现是终端安全软件的驱动拦截了软件的license通信,而系统里又多出来一块虚拟网卡,把原本的网络路径搞乱了。这种情况下不是马上重装软件,而是先在控制面板的网络连接里看看有没有可疑的虚拟网卡,尝试禁用后重启软件进程,确认是否恢复。如果确认是驱动冲突,再决定是升级驱动版本还是调整安全策略。
VMware 场景下还容易碰到"VMnet8 虚拟网卡装不上,显示错误代码 56"的问题。代码 56 在 Windows 设备管理器里代表"驱动已被阻止加载",常见原因就是第三方安全软件把 VMware 虚拟网卡驱动拦截了。处理办法是进入设备管理器,选中那块打了黄色感叹号的虚拟网卡,右键禁用再启用;不行就卸载后重新扫描硬件改动。实在不行,临时退出安全软件控制再重装 VMware 的虚拟网卡驱动,装好后再恢复。
4. 实战二:Hyper-V 虚拟交换机场景的抓包
4.1 vEthernet 虚拟网卡到底能抓到谁的流量
Hyper-V 和 VMware 最大的区别在于,它的虚拟交换机跟物理网卡的关系更"霸道"。当你创建一个外部虚拟交换机并绑定到物理网卡后,Windows 会把这台物理网卡当作 Hyper-V 虚拟交换机的上行链路,宿主操作系统想上网,也得通过新生成的那个 vEthernet 虚拟网卡。
这就出现了一个有趣的现象:在 vEthernet 网卡上抓包,看到的是宿主机申请到的 IP 地址相关的流量,以及一部分经过虚拟交换机转发的外部流量。但要注意,它不等于你就能看到所有虚拟机的完整收发。虚拟交换机内部的数据转发,不会全部镜像给宿主机的 vEthernet 网卡,只有跟宿主机通信的流量才会完整经过这块网卡。
如果目标是抓取某个虚拟机的完整流量,我给你的建议优先级是:第一选择,进入虚拟机内部,直接在那台虚拟机的网卡上抓包,最干净也最真实。第二选择,用 Hyper-V 的端口镜像功能,把目标虚拟机的流量镜像到另一台专门跑 Wireshark 的虚拟机上。第三选择,在外接交换机上做远程端口镜像,把对应物理端口的流量复制一份到抓包机。
4.2 用 PowerShell 给虚拟网卡做端口镜像
端口镜像的具体做法是在 Hyper-V 宿主机上用管理员权限打开 PowerShell,针对源虚拟机和目标虚拟机分别设置。
先查看目标 VM 的网卡信息:
Get-VMNetworkAdapter -VMName "WebServer" | Select-Object Name, MacAddress, SwitchName设置源端,让目标 VM 的网卡作为镜像源:
Set-VMNetworkAdapter -VMName "WebServer" -PortMirroring Source再指定一台专门负责抓包的虚拟机作为镜像目标,在这台抓包机的网卡上开启 Destination:
Set-VMNetworkAdapter -VMName "CaptureVM" -PortMirroring Destination设置完成之后,在 CaptureVM 虚拟机里用 Wireshark 选择对应网卡抓包,就能看到 WebServer 网卡的收发包。不再使用时记得把两边的 PortMirroring 都改成 None,避免持续产生额外的虚拟交换机负载。
注意:端口镜像只能拷贝经过虚拟交换机的流量,如果在 Hyper-V 里做了 VLAN 隔离或者网络策略筛选,镜像出来的报文中会包含原始 VLAN 标签,分析时要注意对应过滤。
4.3 桥接到物理网卡后,抓包机放哪个位置
经常会有人问"虚拟交换机桥接物理网卡后,我把 Wireshark 装在宿主机上抓物理网卡是不是最全"。答案是:你以为的物理网卡,已经被虚拟交换机接管了,你在宿主系统里看到的物理网卡接口,其实只是虚拟交换机下行端口的一小部分视图。
真正想抓桥接出去的完整流量,物理位置应该是放在交换机的另一侧。比如虚拟机跑了 HTTP 服务,客户端在外部网络,那你可以在承载外部流量的交换机上配置端口镜像,把上行口或虚拟机所在的接入端口镜像到一台独立电脑的网卡上。宿主机的虚拟网卡抓包,只在调试宿主机到虚拟机的通信时比较有效,别把它当成全流量抓包点。
5. 实战三:深信服防火墙/上网行为管理设备场景
5.1 用 Wireshark 抓防火墙前后流量
深信服的防火墙和上网行为管理设备,在部署上大多处于网关或旁路位置。想用 Wireshark 分析这类设备前后的流量,核心思路是:在设备的上行和下行各放一个抓包点。
最简单的搭法是用一台笔记本,分别接到防火墙的上行口对应交换机和下行口对应交换机,或者在同一台可管理交换机上做两个端口镜像。上行流量看的是离开设备去往外部方向的处理结果,下行流量看的是设备交给内部网络的还原结果。两边的报文做对比,能快速判断问题出在设备之前还是设备之后。
抓包时注意给两边抓包文件分别命名,比如upstream-20260212.pcapng和downstream-20260212.pcapng,并且最好在同一时刻打上时间戳。分析时把两个 pcap 文件导入 Wireshark,用ip.addr、tcp.port这类过滤条件圈定同一会话,就能精确看到报文字段在穿越设备前后有没有被修改、丢弃或丢失。
5.2 深信服设备自带的报文捕获怎么和 Wireshark 配合
不是每个排障场景都适合在网线上插一台电脑。深信服防火墙、上网行为管理设备的管理界面通常自带了报文捕获工具,可以直接在设备上抓一次原生的接口报文。具体入口在不同版本有差异,一般在"系统设置"、"网络诊断"或"运维工具"里搜索"抓包"或"报文捕获",选择接口、协议、源目 IP 就能开抓,抓完下载 pcap 文件,再用 Wireshark 分析。
设备自带抓包的好处是能捕获到物理接口收到的原始帧,还原度高,不受中间链路干扰。缺点是一次性抓包文件可能很大,别直接在设备上长时间全量抓,最好在抓包参数里把过滤条件写窄。我一般会在管理界面设置只抓目的端口或源 IP 的包,并限制单个文件大小,抓个几十秒就足够定位问题。
下载回来的 pcap 文件放到 Wireshark 里,使用tcp.stream或http这类分析思路和普通抓包完全一致。如果你在设备侧抓到某个 SYN 包被丢弃,再回到终端侧对比 Wireshark 里的抓包,看这个包是否真的发出去、有没有被重传,就能快速判断策略拦截还是链路故障。
5.3 802.1X 认证抓包流程速查
802.1X 认证场景在校园网和企业网络中很常见,抓包难度不大,关键是抓对位置、选对过滤词。
终端侧,在用户接入网络的网卡上抓包,过滤器输入eapol,你会看到 EAPOL 的开始、请求、响应报文。如果用户根本没发 EAPOL-Start,那要先查终端上的认证客户端配置、网卡是否启用了认证。如果看到 EAPOL 请求但没有继续走后续流程,通常是证书或用户名密码环节出问题。
设备侧,在认证服务器或者接入设备上抓包,过滤器输入radius,重点看 RADIUS Access-Request、Access-Accept 和 Access-Reject 三个报文。EAP 的用户名信息是封装在 RADIUS Attribute 里的,字段不对会导致认证直接失败。
两边时间同步很重要。终端抓包显示发出 EAPOL 响应的时间,和服务器收到 RADIUS 请求的时间如果差很多,可能就是链路或策略处理耗时超限。具体排障时用eapol与radius两个过滤词分别看两侧,对照着分析,比单侧抓包有效得多。
6. 常见问题与排查技巧实录
6.1 虚拟网卡不存在或被禁用怎么办
这个问题的典型表现有两种:一是ncpa.cpl里根本找不到虚拟网卡;二是虚拟网卡显示被禁用或者带有黄色感叹号。
先处理"找不到"的情况。Windows 的设备管理器默认会隐藏非即插即用设备,虚拟网卡可能被藏起来了。打开设备管理器,菜单栏点"查看"→"显示隐藏的设备",再到"网络适配器"下找找。如果 VMware 的 VMnet1/VMnet8 不见了,可以到"服务"里确认 VMware NAT Service 和 VMware DHCP Service 是否在运行,手动启动后再去网络连接窗口刷新。Hyper-V 场景下,vEthernet 不见了通常是因为虚拟交换机被删了或者 Hyper-V 功能被禁用,到"启用或关闭 Windows 功能"里勾选 Hyper-V,重启后重新创建虚拟交换机。
"被禁用"的虚拟网卡处理相对简单,直接右键启用,然后重新插拔网线或重启虚拟设备。如果启用时报错 56,说明驱动被安全软件拦截,按上面的思路处理。
6.2 长时间抓包怎么操作才不爆盘
抓包最怕跑了一整夜,第二天发现磁盘满了或者因为文件太大打不开。Wireshark 的长时间抓包要善用"缓冲选项"。
在捕获选项窗口里找到"输出"标签,勾选"写入到多个文件",设置每个文件的大小,比如 50MB 或 100MB。再把"使用环形缓冲区"设置为 10 到 30 个文件。这样 Wireshark 会按照设定循环覆盖旧文件,最多占用几十 GB 空间,既保证连续抓包,又不会拖垮磁盘。
长时间抓包还建议减小不必要的采集面。如果问题设备只涉及某台服务器,就提前在捕获过滤器里限定host 192.168.1.10,只抓这台主机相关的报文,数据量能下降好几个数量级。捕获过滤器是 BPF 语法,和显示过滤器不一样,注意别把tcp.port这种显示过滤语法写进去,那是无效的。
6.3 PyShark 和 Python 脚本抓包的几个坑
用 Python 调 PyShark 写自动化抓包脚本时,最容易出的问题反而不在代码逻辑,而在环境没有配对好。
第一,PyShark 本身并不负责抓包,它只是调用 Wireshark 自带的tshark.exe和dumpcap.exe。如果 PyShark 找不到这两个可执行文件,或者路径处理不对,就会报 API 版本错误或者直接抓不到数据。建议在代码里显式指定 TShark 路径:
import pyshark cap = pyshark.LiveCapture(interface='WLAN', tshark_path=r'C:\Program Files\Wireshark\tshark.exe') cap.sniff(timeout=10)第二,Python 进程权限不足。dumpcap 抓包需要管理员权限,以普通用户运行 Python 脚本,接口能列出但抓不到包。Windows 下需要以管理员身份打开终端再运行脚本,别只在 PyCharm 里点 Run。
第三,新旧版本兼容性。Python 2.7 配新版 PyShark 基本已经不推荐,很多方法和参数都变了。如果你的环境只能固定用老版本,建议锁定 PyShark 0.4.x 左右的版本,并确保 Wireshark 版本别太新,否则 TShark 输出格式变化也会引发解析异常。
6.4 抓包文件分析的小技巧:先看基础协议,再翻业务层
拿到一个 pcap 文件,不要一上来就盯着 HTTP 状态码或者 TCP 重传,我习惯先花几分钟看基础协议。
先用dhcp过滤看终端拿到的 IP、DNS、网关是否正确。DHCP 报文的 Option 字段里藏着很多网络问题的根源。再过滤arp,确认二层地址学习是否正常,出现大量 ARP 请求可能是 IP 地址冲突或二层环路。最后看dns,大部分“能上网但打不开网页”的问题,都出在 DNS 解析环节,而不是 HTTP 层。
这套顺序适合绝大多数网络故障排查。基础协议正常,再逐层向上翻业务,出错范围会小很多。
再送一个小技巧:Wireshark 的"统计"菜单里有个"流量图"(Flow Graph)功能,选中某个会话生成时序图,能很直观地看出谁先发起连接、谁回了 RST、谁在频繁重传。搭配右键追踪 TCP 流,比一帧帧翻报文快得多。排障时我不建议一次开太多会话,针对一个明确问题抓一次包、过滤一个会话、画一张流量图,往往比全量乱看更早得出结果。