
我经常看到有人在群里问类似的问题“App里的接口老是报错后端非说没问题怎么证明”“Windows上有没有免费的抓包工具”“我自己的小程序能不能抓包看看请求数据”这些问题听着是工具问题实际上都绕不开网络抓包。所谓抓包说白了就是把设备通过网卡、Wi-Fi、USB口、蓝牙口发出的数据流量“截下来”再按协议拆开看内容。对开发、测试、运维、网络排查、硬件调试的人来说这是刚需中的刚需。这篇我会把市面上真正免费、真正全平台的抓包软件按场景拆开讲包括Wireshark这类老牌协议分析工具Fiddler、mitmproxy这类带HTTPS解密能力的代理抓包工具以及移动端、小程序、安卓模拟器、USB外设、蓝牙设备这些被问得极多的细分场景。文末会附一套我自己的选型表和避坑清单保证你照着能用、能用得明白。1. 先搞清楚抓包在抓什么三种最常见的抓包场景很多人一上来就开软件抓包抓了半天发现全是看不懂的乱码要么干脆什么都抓不到。这通常不是工具的问题而是没搞清楚“你要看的是哪一层流量”。1.1 HTTP/HTTPS请求与响应这是开发、测试群里问得最多的场景。你在浏览器里打开一个网页在手机上刷一个小程序在App里点一个按钮背后就是一串HTTP或HTTPS请求在客户端和服务端之间来回传递。如果请求地址不对、参数多传少传、返回数据格式变了肉眼很难发现抓包就能把请求头、请求体、响应头、响应体全部摊开看。这类场景用的工具多为“代理型”抓包工具比如Fiddler、mitmproxy、Charles。它们的工作原理是在本机启动一个HTTP代理然后把系统或浏览器的代理指向它。相当于给客户端和服务器之间加了一个“中间人”所有请求必须先经过它它复制一份出来给你看再把请求原样发给服务器。1.2 底层网络协议与流量特征有时候问题不在应用层而在TCP连接上。比如页面加载慢可能是某个TCP连接一直重传视频卡顿可能是丢包率高接口偶尔超时可能是DNS解析时间太长。这类问题必须看底层报文也就是“数据包”级别的信息。这时候要请出Wireshark和tcpdump。Wireshark通过操作系统的抓包接口把网卡上经过的数据链路层、网络层、传输层报文全部复制出来再按协议栈逐层解析。它和代理型工具是两套思路代理型抓的是“约定好走代理的应用流量”Wireshark抓的是“物理网卡上真实流动的所有数据”。1.3 非IP类流量USB与蓝牙外设另一个常被忽略的场景电脑和手机之间走USB传数据鼠标键盘走蓝牙智能手表走BLE。这些流量不走传统网卡和TCP/IP协议栈但同样需要调试。USB外设驱动装不上、蓝牙耳机声音断断续续、遥控器和接收器偶尔失灵都有可能要从报文层面找原因。对应的抓包工具和上面又不一样。Windows上USB抓包主要靠USBPcap配合Wireshark使用Linux下可以用usbmon接口。蓝牙抓包在Windows和macOS上可以先抓系统自带的蓝牙HCI日志再导进Wireshark分析如果需要抓BLE空口数据包通常还要配合硬件嗅探器。这些“冷门”场景后面我会单独展开。2. Wireshark和tcpdump真正意义上的全平台抓包基石要说全平台免费抓包软件Wireshark绝对绕不开。Windows、macOS、Linux都有官方安装包而且开源免费背后还有庞大的协议解析器库能识别上千种协议。2.1 Wireshark的基本用法和上手思路安装Wireshark本身不难但有两个细节新手容易栽跟头。第一在Windows上安装时会问你要不要装Npcap这个必须装它是Windows底层的抓包驱动不装的话Wireshark什么都抓不到。第二在Linux上启动Wireshark时通常需要sudo权限因为读取网卡原始数据包属于敏感操作普通用户默认没有权限。Ubuntu和Debian上可以执行sudo apt install wireshark安装时选择允许非root用户抓包之后把当前用户加入wireshark组重登一下就好。打开Wireshark后选择要监听的网卡。我自己的习惯是不确定流量走哪块网卡时先选“WLAN”或“以太网”中最活跃的那个然后直接回车开始抓。抓包之后满屏的五颜六色报文很容易让人懵但你真正要关心的不是每条报文而是筛选后的子集。最实用的入门过滤条件有这么几个过滤某个主机ip.addr 192.168.1.100过滤HTTP请求http过滤DNS请求dns过滤TCP端口tcp.port 443只看本地回环loopback注意Wireshark的显示过滤器写在工具栏那个绿色框里不是写在捕获设置里。写错了会有红底提示改对了才显示数据。2.2 tcpdump服务端排查的杀手级工具Wireshark有图形界面但实际生产服务器上往往没有桌面环境或者你只有SSH终端权限。这时候tcpdump是最可靠的方案。它几乎存在于所有Linux发行版里macOS也自带基础版本只需要一行命令就能抓包sudo tcpdump -i any -w /tmp/debug.pcap这段命令的意思是监听所有网卡把原始报文写入/tmp/debug.pcap文件。抓一段时间后按CtrlC停止再把pcap文件下载到本地用Wireshark打开。这样做的好处是不需要直接在服务器上装图形界面也不影响线上服务非常适合排查偶发问题。我遇到过很多次“线上接口偶发超时日志里啥也没有”的情况都是靠tcpdump抓了几分钟包然后用Wireshark打开看TCP重传和握手时延才定位到是某个中间链路的问题。所以在我的工具清单里tcpdump和Wireshark永远是一对黄金搭档。2.3 Wireshark抓不到HTTPS明文怎么办一直有人问“我抓包看到了TLS加密流量但看不到里面请求内容是不是工具不行”不是Wireshark抓的是链路层真实数据HTTPS内容本身是加密的Wireshark不会主动解密给你看。它有解密能力但需要你告诉它密钥。一种做法是把浏览器或应用导出的TLS会话密钥配置到Wireshark里。设置方法是在Wireshark的“协议”里选TLS然后指定一个包含密钥的文件路径同时设置环境变量SSLKEYLOGFILE指向同一个文件。这个方案对很多应用并不通用因为不是所有软件都会输出密钥日志。所以如果你真正想看的是HTTPS的明文请求和响应首选不是Wireshark而是Fiddler或mitmproxy这类代理抓包工具。它们用“中间人”的方式完成HTTPS解密体验上更贴近应用调试。3. 能解密HTTPS的代理型工具Fiddler、mitmproxy该选谁代理型抓包工具的核心有两个一是让目标流量主动走你的代理二是让目标设备信任你的CA根证书。这两点做不到后面全是白扯。3.1 HTTPS解密的底层逻辑先说原理。HTTPS本身分两层第一层是TCP连接第二层是TLS加密。代理工具要做的事情是在客户端和服务器之间建立两条连接客户端先把请求发给代理代理再用自己的身份去连接服务器。如果客户端不信任代理的证书请求会在客户端本地就被拦下来。所以代理抓包工具的套路都是给你生成一张根证书你把它安装到本机或手机的“受信任的根证书颁发机构”里。安装后代理工具为每个HTTPS网站临时签一张“网站证书”客户端一验证发现发证机构是你信任的根证书就放行了。这样代理工具就能解密看到明文再转发给真正的服务器。这套机制对调试自己开发的接口、自己的小程序、自己的App都是合法且常规的操作。但如果目标App做了证书锁定SSL Pinning它在代码里只信任特定的服务端证书你就算安装了根证书也解不开。这种情况已经超过“免费抓包工具”能解决的范围了。3.2 Fiddler Classic与Fiddler Everywhere的取舍Fiddler是一个有年头的老牌Windows抓包工具很多教程里说的“Fiddler抓包工具”就是它。Fiddler Classic目前仍然是免费软件但它只支持Windows不算全平台。如果你想在macOS或Linux上继续用Fiddler这套界面就得用Fiddler Everywhere。Fiddler Everywhere是跨平台桌面应用Windows、macOS、Linux都支持操作风格和Fiddler Classic一脉相承。它的免费版和商业版之间有功能差异但对个人开发和测试来说免费的日常调试功能基本够用。启动后在Tools里开启HTTPS解密首次会提示安装根证书确认即可。用Fiddler抓HTTPS的完整步骤可以概括为启动Fiddler在设置里打开HTTPS解密开关。安装根证书首次打开时会弹窗提示。重启Fiddler或浏览器让证书生效。在浏览器访问一个HTTPS站点看到会话列表里出现内容就说明成功了。Fiddler的优势是上手门槛低、界面直观左侧会话列表、右侧请求详情和响应详情的布局非常适合新手。缺点是对Linux的依赖库偶尔会有兼容性问题如果你主要在Linux服务器或开发机上我更建议试试mitmproxy。3.3 mitmproxy命令行党的最爱mitmproxy是一套开源免费的Python工具支持Windows、macOS、Linux而且它不只是简单的图形化抓包还自带一套可编程接口。它有三种启动形态mitmproxy交互式命令行界面mitmwebWeb界面浏览器里查看和过滤请求mitmdump纯命令行适合脚本化处理我最常用的是mitmweb因为它在浏览器里展示数据看起来比命令行更直观同时保留了Python脚本扩展的能力。启动命令很简单mitmweb --listen-port 8888启动后它会告诉你Web界面地址默认是http://127.0.0.1:8081代理端口是8888。然后你把浏览器或手机的代理改成当前机器的IP加8888端口再用浏览器访问 http://mitm.it 按设备类型下载根证书安装。装证书后刷新页面就能在mitmweb界面上看到所有经过代理的HTTPS请求。mitmproxy真正的杀手锏是“加脚本”。比如你想批量修改某个请求参数或者自动记录某个接口的响应Python脚本可以直接挂在代理上跑不需要手动点界面。3.4 Charles为什么被很多人提起但不在免费清单里Charles是全平台抓包工具里知名度很高的一款。它的界面优雅App端联动也方便很多移动端开发团队把它当成标配。但必须说明Charles是收费软件不是免费工具虽然提供30天试用期。有人在博客里把Charles列进“免费全平台软件”这很容易误导新人。如果你不想付费个人建议优先考虑免费的Fiddler Everywhere或开源的mitmproxy。如果只是临时用一下Charles做演示试用版也够看效果但别默认它能一直免费用。4. 场景化抓包实操微信小程序、安卓模拟器与移动端真机全平台不等于只覆盖电脑。现在大量业务跑在手机端微信小程序、安卓App、iOS App都有各自的抓包需求。下面这几个场景我在调试中反复用过重点说实操。4.1 微信小程序抓包为什么Wireshark看不到明文先说结论微信小程序的网络请求绝大多数走HTTPS直接在电脑上拿Wireshark抓只能看到TLS密文看不到明文因为Wireshark不知道微信进程的TLS密钥。真正的微信小程序抓包工具组合是“代理工具 微信开发者工具或真机代理”。如果你是开发者最简单的做法是直接在微信开发者工具里看Network面板里面有请求地址、请求头、请求体和响应数据不用外挂任何工具。这个面板对小程序的调试已经非常友好。如果你要做真机预览调试就需要代理抓包了。流程是电脑上启动mitmweb或Fiddler开启HTTPS解密手机和电脑连同一个局域网手机Wi-Fi设置里把HTTP代理指向电脑IP和端口手机浏览器访问mitm.it或Fiddler的证书下载地址下载并安装根证书然后在微信里打开小程序预览就能在抓包工具里看到完整请求。这里有个细节微信小程序的请求域名需要在小程序后台配置合法域名否则真机调试可能报错。开发者工具里可以在“详情—本地设置”勾选“不校验合法域名”但真机上一般需要在开发版小程序里打开“开发调试”模式。这个问题经常被误判成抓包工具失败实际不是一回事。4.2 Windows下安卓模拟器MuMu/雷电等抓包“Windows MuMu抓包工具”这个搜索词出现频率很高。安卓模拟器本质上是个在Windows上运行的Android系统抓包思路和真机类似。我以MuMu为例过程分为三步。第一步获取宿主机局域网IP在Windows命令行里输入ipconfig查看。第二步在模拟器设置里进入Wi-Fi设置长按已连接的Wi-Fi修改网络把HTTP代理设为“手动”主机名填你Windows机器的IP端口填代理工具的端口比如mitmweb的8888。第三步给模拟器里的安卓系统安装根证书。安卓7.0以上版本默认不信任用户安装的CA证书所以你会出现“证书装了但HTTPS还是显示不安全”的情况。解决办法有两种一是用支持在应用内信任用户证书的调试版本App二是把证书复制到系统证书目录。在MuMu这种带root权限的模拟器里可以用adb root后把证书push到/system/etc/security/cacerts/再把权限改成0644重启模拟器生效。这个操作对老手来说几分钟新手建议先走第一种方式因为改系统证书目录容易把模拟器搞出问题。4.3 移动端真机抓包iOS与Android的证书差异iOS真机抓包时手机下载证书描述文件后还要去“设置—通用—关于本机—证书信任设置”里把对应的根证书打开完全信任否则抓包工具会和服务器建立连接失败。这个步骤很多人漏掉。Android真机抓包时不同品牌差异很大。原生Android在Wi-Fi代理设置里直接填IP和端口就行但部分国产ROM会把“代理设置”入口藏得比较深有的甚至不允许用户对WLAN手动配置代理。遇到这种情况可以考虑用adb命令来设置代理adb shell settings put global http_proxy 192.168.1.100:8888调试完成后记得清除代理设置adb shell settings put global http_proxy :0证书问题依然是Android的重点。同样因为用户证书在自带App里不受信任开发者自己写的App如果没在networkSecurityConfig里开放用户证书代理抓包也会失败。这个属于开发配置层面的问题不属于工具能解决的范畴。5. USB抓包与蓝牙抓包设备联调时会用到的特殊抓包方案热词里有“usb抓包工具哪个最好用”和“蓝牙抓包工具”这俩确实容易让人懵因为它们和传统网络抓包差异很大而且能讲清楚的人不多。5.1 USB抓包USBPcap加WiresharkUSB流量不是IP报文它跑的是USB协议传统网卡驱动根本采集不到。Windows上最常用的免费USB抓包工具是USBPcap它安装时会在系统里加一个虚拟驱动Wireshark启动后可以把USBPcap识别成网卡一样的捕获接口。实际使用流程是先安装USBPcap再打开Wireshark在捕获接口列表里选择USBPcap接口开始抓包。然后你把USB设备重新插拔或主动执行一次操作Wireshark里就会看到USB请求和响应的URB报文。如果需要过滤可以按usb.device_address或usb.transfer_type来筛选。如果你只想确认某个USB设备是否被正确枚举用系统自带的设备管理器就能看但如果要分析底层交互细节比如设备为什么频繁复位、固件命令是否超时USBPcap加Wireshark就是目前Windows上最好用的免费组合。Linux下同样可以用Wireshark但底层接口换成了usbmon加载方式不同思路完全一致。5.2 蓝牙抓包系统日志与硬件嗅探蓝牙抓包比USB复杂因为蓝牙分为传统蓝牙和低功耗蓝牙(BLE)物理上也存在大量信道跳频想“全听”需要专门的硬件。最简单的免费方案是抓系统蓝牙协议栈日志。在Windows上可以通过“设置—隐私和安全性—诊断数据”里收集蓝牙相关日志或者用Microsoft Message Analyzer这类工具读取ETW事件macOS上可以通过打开系统Report目录下的bluetooth.log来分析。这些日志导入Wireshark后Wireshark自带的蓝牙解析器可以把HCI事件、ATT数据、GATT协议内容解析出来。如果你想抓最底层的BLE空口数据包就要用硬件嗅探器了比如Ubertooth One、nRF Sniffer这类设备。它们是硬件设备不是纯软件价格也不算便宜。对绝大多数开发者来说先抓系统蓝牙日志再用Wireshark分析已经能解决90%的问题。5.3 蓝牙和USB调试的具体场景价值为什么“USB抓包工具哪个最好用”会变成搜索热词我猜问这个问题的多半不是在抓存储设备而是在调预研阶段的外设驱动或嵌入式开发板。比如你写了一个自定义HID设备PC识别不到只靠设备管理器根本看不出是哪一步断了抓一次URB可能就能看到设备描述符请求失败。同样无线鼠标跳帧、蓝牙手柄连接后按键不识别在蓝牙日志里也都有迹可循。6. 全平台免费抓包工具选型表哪款适合你的场景这一节把我常用的工具整理成一张表直接抄作业。每个工具后面我会标注平台、免费情况和适合场景方便你快速定位。工具平台是否能解密HTTPS免费情况最适合的场景WiresharkWindows/macOS/Linux需要配置TLS密钥不直观免费开源底层协议分析、网络排查、USB/蓝牙日志分析tcpdumpLinux/macOS/Unix否免费开源服务器端离线抓包、远程排查Fiddler ClassicWindows是免费Windows上Web/App的HTTPS调试Fiddler EverywhereWindows/macOS/Linux是免费版有限制跨平台Web/API调试mitmproxy/mitmwebWindows/macOS/Linux是免费开源跨平台HTTPS解密、Python脚本自动化CharlesWindows/macOS/Linux是收费有试用移动端App调试如果预算允许USBPcapWindows不适用免费开源USB协议抓包看这张表其实能得出一个结论没有一把抓包工具能通吃所有场景。我做技术选型时基本遵循“组合拳”思路在电脑上日常看HTTP/HTTPS优先用mitmweb或Fiddler Everywhere要做底层网络分析开Wireshark要查线上服务器接口抖动就先用tcpdump抓pcap文件再下载到本地用Wireshark分析。如果你只愿意装一个工具那我会推荐Wireshark因为它能看的东西最多配合TLS密钥日志也能看HTTPS。但如果你是个前端或移动端开发整天要看接口数据那“Fiddler Everywhere或mitmweb”的体验会明显更顺手别强求自己一开始就啃Wireshark的所有功能。7. 我在实际抓包中踩过的坑和几个非常规排查思路工具选得再好实操中还是会遇到各种“抓不到包”的情况。下面这些坑都是我亲身踩过、问过一圈前辈才搞明白的。7.1 抓不到包时第一个该检查的永远是代理和网卡新手说“我开了抓包工具但浏览器里没有请求”90%的原因是代理没生效。Fiddler/mitmweb启动后系统不会自动把流量交给它需要检查浏览器或系统是否明确配置了代理。macOS上容易犯的错是只给Wi-Fi配了代理但浏览器开着系统代理时没勾选“使用系统代理设置”。Windows上则要检查浏览器是否装了某些代理扩展比如自动切换到全局代理模式把流量转走了。如果你用的是Wireshark抓不到本机HTTP流量还要确认是不是选错了网卡。访问本机服务时流量可能走的是loopback接口而不是有线或无线网卡。Windows下还要注意Npcap是否启用。7.2 HTTPS报TLS错误不要急着怀疑工具用了代理抓包工具后浏览器突然出现证书错误或ERR_CERT_AUTHORITY_INVALID通常不是工具坏了而是根证书没有被系统信任。iOS上还要记得去“证书信任设置”里开开关Android上要确认App是否信任用户证书。遇到这个报错时我建议按顺序排查系统时间是否正确、根证书是否已经安装、证书信任开关是否打开、当前App是否做了证书锁定。7.3 高流量环境下抓包丢包怎么办在公司办公网或高并发接口下抓包Wireshark偶尔会提示丢包。你可以在捕获设置里把文件改成环形缓冲区按文件大小和时间切分避免把内存耗尽。tcpdump也可以用-s 0抓全包但文件会很大我一般用-s 96抓每个包的头部96字节足够看到TCP头信息又不会撑爆磁盘。7.4 关于合规边界说两句实在话抓包工具本身是中性的就像螺丝刀。你可以用它调试自己开发的接口、排查自家服务器故障、分析自己买来的智能设备是否在传奇怪的数据。但不要用它去截取别人未授权的通信内容也不要破解不属于自己的App和账号体系。很多抓包工具是开源的学习它、研究它、扩展它都可以使用范围必须局限在自己有权限的设备上。最后分享一点我的个人习惯我现在日常调试的“主力”是mitmweb加Wireshark的组合。mitmweb用来快速看接口请求和响应Wireshark用来处理那些代理工具解释不了的底层网络问题。对于新人我的建议是别看太多工具先把其中一个玩熟比如先拿Wireshark抓一次网页浏览请求再用Fiddler或mitmweb抓一次自己写的小接口。抓包这件事动手过一次之后后面基本不会再忘。如果再细说一步我会建议你从“抓浏览器打开百度的流量”开始。目标明确、流量小、容易验证。抓到你就能看到无数个DNS请求、TCP三次握手包、TLS握手包最后才是HTTP请求和响应。把这一段看明白了网络从URL输入到页面渲染之间发生了什么你会比大部分后端开发都清楚。