免费抓包工具实战指南:Wireshark、Fiddler与mitmproxy全解析
发布时间:2026/9/9 4:07:10 作者:尧图编辑部 阅读量:1,286

1. 抓包这件事先搞清楚自己到底要什么先说一个很常见的场景接口联调出问题了前端说参数没问题后端说返回没问题两边对着屏幕僵持不下。这时候谁也别争直接抓包看一眼实际走了什么数据问题往往三分钟就浮出水面。抓包工具这个领域说大不大说小不小但凡是跟网络打交道的人迟早都得用上。这篇东西主要是给这么几类人看的刚入行的后端开发排查接口问题找不到头绪前端同学想确认请求头和响应体有没有被改移动端开发要调试 App 的加密请求还有做测试、做物联网硬件协议的工程师想在链路层面看清楚数据长什么样。不管你是哪一类只要想把“网络里跑的字节”从黑盒变成白盒这篇文章能给你一个比较完整的工具选型和实操参考。我个人的经验是选抓包工具不能只看“哪个名气大”而要看你要抓的流量长什么样。这里说的“全平台”有两个层面的意思一个是工具本身能不能跑在 Windows、macOS、Linux 上另一个是能不能覆盖不同设备的流量入口。很多人一开始上来就装 Wireshark结果发现抓 HTTPS 全是密文折腾半天证书还是不解密回头又换 Fiddler发现命令行环境下根本跑不起来。工具没有绝对的好坏只有跟你当前场景匹配不匹配的问题。这一篇我就按“免费 全平台 场景匹配”三个维度把主流的抓包工具一个一个拆开讲从原理到实操从选型到避坑一次性给你捋清楚。2. 主流免费抓包工具逐个拆解2.1 Wireshark协议分析的老大哥如果你只想用一个抓包工具那大概率是 Wireshark。它是个开源的协议分析器支持 Windows、macOS、Linux 全平台免费的能抓能存能看几百种协议。它的定位不是“Web 调试工具”而是“网络链路层面的通用显微镜”。Wireshark 的核心是 WinPcap / Npcap / libpcap 这套底层抓包机制。Windows 上装 Wireshark 的时候会自动帮你装 Npcap这个驱动负责把网卡上经过的数据包复制一份给上层应用。要注意的是现在新版 Wireshark 默认是装 Npcap老教程里让你去单独装 WinPcap那个项目已经很久没维护了能不用就别再用。它的强项是深度分析比如你怀疑某个 TCP 连接被重置了、某个 DNS 解析超时、某个请求重传频繁Wireshark 里的时间戳、序列号、往返时间统计都能帮你把问题钉死。但它的短板也很明显交互式界面对于 HTTPS 解密不友好默认情况下你看到的只是 TLS 密文流需要导入私钥才能看明文而且配置起来有点绕。如果你只是想做 HTTP/HTTPS 接口调试用 Wireshark 会感觉杀鸡用了牛刀。我建议把 Wireshark 当作“兜底工具”。遇到任何网络层疑难杂症打开 Wireshark 抓一把 pcap先看底层链路通不通再做上层分析。但在日常接口联调、App 调试这些场景里可以优先用后面要讲的那些更贴合 Web 场景的工具。2.2 FiddlerWindows 平台上的 Web 调试常青树Fiddler 是 Telerik 出的抓包代理主打 HTTP/HTTPS 调试。它本质上是一个本地代理服务器你在 Fiddler 里开启 HTTPS 解密后它会给自己的根证书签发一个本地 CA手机或者客户端信任这个 CA 之后所有流量都会经过 Fiddler 中转它就能解密看到明文。Fiddler 有两个分支经典版 Fiddler 2只有 Windows和新版 Fiddler Everywhere跨平台但部分能力收费。如果你坚持要完全免费的方案Windows 上用经典版就够了功能非常完整。它内置了 Composer可以直接构造请求发包这个功能比 Postman 在某些场景下还好用因为你能直接基于抓到的原始请求改参数重发不用重新填一堆 Headers。经典版 Fiddler 的界面相对老旧但好在资源占用不大而且脚本能力很强。你可以用 FiddlerScript 在请求前后自动断点、修改响应、模拟弱网测试场景下非常顺手。缺点是它默认只抓 HTTP/HTTPS 流量如果你想抓非 HTTP 协议比如 MySQL 协议、Redis 协议需要额外装扩展或者直接用 Wireshark。2.3 mitmproxy程序员最爱的命令行抓包工具如果你是一个天天在终端里工作的人mitmproxy 你一定不能错过。它同样是一个代理型抓包工具跨平台免费开源最爽的一点是支持 Python 脚本控制请求和响应。mitmproxy 提供了三个能力层一是mitmproxy本身是个交互式命令行界面能用键盘操作看请求内容二是mitmdump是纯数据流模式适合把抓到的数据转发给脚本处理三是mitmweb会起一个浏览器界面适合不太习惯终端操作的人。这三个对应同一个核心引擎用的都是同一套拦截和导出机制。我最常用的是 mitmdump 加 Python 脚本做自动化。比如线上有个接口需要定时调用但签名逻辑写在 App 里直接从服务端调不方便我就可以用 mitmdump 搭一个反向代理在脚本里把请求头、签名参数按规则重写一遍相当于把 App 的核心逻辑复制成了一个可编程接口。这类活儿 Fiddler 也能做但论灵活度还是 Python 生态里来得顺手。需要注意的是mitmproxy 的 HTTPS 解密一样要装证书。工具安装后首次打开时会提示访问http://mitm.it下载对应平台的证书iOS、Android、Windows、macOS 都有对应安装包。装完证书后记得在系统设置里把证书标记为“完全信任”否则系统浏览器会弹警告。2.4 Charles虽付费但功能强大的跨平台选手严格说 Charles 不是免费的它有 30 分钟试用限制超过时间会退出。但它在移动端调试上确实有不可替代的体验很多团队还是愿意付费买正版。因为我这篇主题是“免费工具大全”Charles 我只简单带一句它适合那些就是愿意花钱买省心的同学界面比 Fiddler 现代证书安装流程也要顺畅一些在 iOS 模拟器上还有一个一键打开 SSL 代理的入口效率很高。如果你愿意花点时间配置完全可以用 mitmproxy 加一条命令替代 Charles 的核心功能。我的建议是先把免费工具用透确定哪些功能是你真的高频需要的再考虑要不要上付费工具。2.5 tcpdump没有图形界面的底牌最后一个不能忘的是 tcpdump这是一个命令行抓包工具几乎所有的 Linux 发行版和 macOS 都会预装。它没有图形界面输出格式也比较原始但它在服务器排障时是不可替代的。生产环境上你不能为了抓包去装 Wireshark 图形界面这时候 tcpdump 就是你唯一的选择。常用姿势是这样的# 抓 eth0 网卡上的 80 端口流量保存到文件 sudo tcpdump -i eth0 -nn -s 0 port 80 -w http.pcap # 抓 eth0 网卡上与某个 IP 的 TCP 流量显示 ASCII 内容 sudo tcpdump -i eth0 -nn host 192.168.1.100 and tcp -A抓下来的 pcap 文件可以拷到本地用 Wireshark 打开分析。这就形成了一个很好的组合生产环境用 tcpdump 采集原始数据本地用 Wireshark 做交互式分析。不用在生产机上安装任何多余的东西安全干净可靠。3. 移动端、USB、蓝牙等特殊场景的抓包方案3.1 手机 App 与微信小程序的抓包套路移动端抓包和 Web 端有本质区别因为流量不从你的电脑网卡走。通用的做法是让手机和电脑连同一个局域网然后把手机代理指到电脑的 8888 端口抓包工具在这个端口上做中间人解密。Fiddler 默认 8888mitmproxy 默认 8080Charles 默认 8888具体端口可以自己改。微信小程序抓包的难点在于微信对网络安全有约束很多小程序会开启证书校验直接代理看不到请求。这个时候有几个思路如果你的测试环境能改代码就把校验关了如果不行就要用 Frida 之类的高阶手段去 hook 证书校验逻辑这个属于逆向范畴一般只在安全测试的时候会用到。正常 App 调试场景下我觉得最好用的还是 mitmproxy 加 iOS 模拟器或者 Android 模拟器。模拟器可以直接通过宿主机的回环地址访问 mitmproxy配置代理后装证书就完事比真机方便不少。Windows 上跑 Android 模拟器比如 MuMu、雷电在里面打开 Wi-Fi 设置把代理改为手动主机 IP 填你电脑的局域网 IP端口填 8080访问http://mitm.it装证书基本三两分钟就能通。这里有个细节Android 7.0 之后系统默认不信任用户安装的 CA 证书只有 App 自己在代码里声明信任用户证书的才能解密。所以有时候你装了证书还是抓不到某个 App 的 HTTPS 明文这是平台的限制不是工具的问题。应对办法一般是反编译改 manifest或者用 Android 模拟器把证书装到系统分区这些操作有专门的演练方案篇幅关系先不展开讲。3.2 USB 抓包工具怎么选USB 抓包通常不是“网络”流量但实际工作中经常会碰到。比如你自己做了一个 USB 外设或者排查 USB 摄像头枚举失败、U 盘掉盘问题这时候需要一条专门的链路来分析 USB 总线上跑的请求。Windows 平台推荐用 Wireshark 加 USBPcap 这个驱动USBPcap 装完后会在 Wireshark 的“接口列表”里多出一个 USB 总线接口选中它就可以开始监听。Linux 平台则可以直接用usbmon模块Wireshark 原生支持读取usbmon的实时数据不需要额外的驱动。macOS 在这件事上比较痛苦自带工具比较弱一般要借助虚拟机的 Linux 环境来做 USB 抓包或者直接用硬件分析仪。USB 抓包能看到的东西很多比如枚举过程中的控制传输、批量传输的端点数据、设备的描述符。如果你在做 HID 键盘、UAC 声卡这类设备的固件开发USB 抓包几乎是调试的必备手段。但要注意的是USB 抓包很容易产生海量数据而且 Wireshark 对 USB 协议栈的支持目前还不是所有类都解析得特别好遇到漂亮的设备描述符信息还好遇到厂商自定义的 vendor 定义命令还是得靠 Hex 视图硬看。3.3 蓝牙抓包的基本思路蓝牙抓包是另一个比较细分的场景多用于调试 BLE低功耗蓝牙设备、排查连接断开、发现广播包异常这类问题。如果只是要抓 HCI 层的数据Ubuntu 上用btmon命令就能从蓝牙控制器里拿到日志配合 Wireshark 打开带 HCI 解析的 Log。这种方案免费但只能在 Linux 上跑而且看不到物理层的信息。如果想抓物理层的空中数据包那需要专门的硬件比如 Nordic 的 nRF Sniffer、Telink 的调试板它们能配合 Wireshark 做 BLE 抓包分析。硬件和软件配合到位你可以看到真实的广播报文、连接事件还能分析跳频序列。这类方案已经不便宜了但在做低功耗蓝牙协议开发时这笔投入我觉得是值得的。作为一个普通开发你日常用到最多的可能还是 HCI 层的日志分析和手机端的nRF Connect模拟扫描工具。先用软件层面把问题缩小到一定范围再考虑要不要上硬件抓包器这是成本和效率的平衡点。4. 抓包的核心原理与实操要点4.1 HTTPS 解密到底是怎么做到的很多人配置 HTTPS 解密会失败根本原因是不理解中间人代理的工作机制。我用一个简单的比方来解释正常你和服务器之间是一条直连隧道中间人代理就是在隧道中间偷偷加了一个“检查站”你发给服务器的数据先到检查站检查站拆开看一眼再用自己和服务器的连接重新发给服务器服务器返回的数据同理。关键在于检查站得让你的客户端认为它是服务器又得让服务器认为它是客户端。这个“双重身份”是靠代理自己生成的根证书实现的。你在抓包工具里开启 HTTPS 解密时工具会生成一个 CA 证书你的设备需要信任这个 CA。当你的设备请求某个 HTTPS 站点时代理服务器会临时生成一个该站点的证书并且用这个 CA 签名你的设备因为信任了 CA就认为这个证书是合法有效的于是建立起加密通道。实操上我建议按这个顺序来先用抓包工具抓一个 HTTP 网站确认代理本身通不通。再开启 HTTPS 解密安装根证书。用设备的浏览器访问一个 https 站点看证书是否被正确信任。如果浏览器提示证书错误去系统设置里手动信任该证书iOS 需要在“关于本机 - 证书信任设置”里打开完全信任开关。最后才去试那些 App 的请求因为很多 App 不信任用户 CA失败也不能全怪工具。4.2 抓包工具里的核心过滤语法Wireshark 的显示过滤器语法值得好好掌握几个基础规则很多新手一上来就被密密麻麻的包吓退其实就是没搞懂过滤。常用的就这么几个# 只看某个 IP 的流量 ip.addr 192.168.1.1 # 只看 HTTP 协议 http # 只看 TCP 端口 443 的流量 tcp.port 443 # 只看带特定 Host 字段的 HTTP 请求 http.host example.com # 只看 HTTP 状态码为 500 的响应 http.response.code 500还有一个细节ip.src和ip.dst只匹配源地址或目标地址ip.addr是匹配两端任意地址实际用ip.addr居多写起来省事。Fiddler 和 mitmproxy 也有自己的过滤机制。Fiddler 主界面左下角的快速过滤框可以直接输入?example.com来筛选 Host 包含 example.com 的请求。mitmproxy 里可以用f进入过滤模式支持~u example.com这样的语法过滤 URL。各工具的过滤语法虽然不统一但核心思想都是“缩小范围”先过滤出目标流量再做深度分析效率会高很多。4.3 抓到的包到底怎么看才算看懂拿到一堆数据包之后怎么定位问题很多人会卡在这一步。我自己的流程基本是三步走第一步先看链路。在 Wireshark 里用tcp.stream关联出一个完整的 TCP 流确认三次握手有没有完成、有没有重传、有没有乱序。这个阶段能排查掉大量的网络层问题比如连接超时、DNS 解析慢。第二步看请求和响应。对应到 HTTP/HTTPS 场景找到请求行、请求头、请求体再看 HTTP 状态码、响应头、响应体。前后端联调的问题九成以上在这一步就能看出来不是参数没传就是响应结构变了。第三步对比预期。如果是接口拼接错误把实际请求和接口文档里的样例并排对比别用肉眼硬看用命令或者脚本把两个请求做 diff定位会快很多。像 Fiddler 里的 Inspectors 面板就能直接切换 Raw / JSON 视图Wireshark 里可以用“导出为 JSON/CSV”把数据带出去进一步处理。5. 常见问题与排查技巧实录5.1 证书装了还是提示不安全这是一个出现频率极高的问题。如果你确认代理配置正确但浏览器或者 App 还是提示证书错误按这几个顺序排查第一确认抓包工具的根证书有没有被系统信任。Windows 上需要把证书导入到“受信任的根证书颁发机构”macOS 上要双击证书并在钥匙串里改为“始终信任”Android 9 上要分“用户证书”和“系统证书”用户证书默认不参与部分 App 的信任链iOS 上要检查“证书信任设置”里有没有打开开关。第二确认是否因为 App 做了证书固定Certificate Pinning。如果 App 在代码里写死了服务器公钥或证书哈希那你临时生成的证书就算被系统信任App 还是不认识。这种情况要么改 App 代码要么用 hook 工具绕过属于另一个进阶话题了。第三检查代理模式是否选对。有些抓包工具既支持全局代理也支持局部规则如果规则里把你访问的域名排除了那流量直接放行当然也就解不了密。5.2 为什么抓不到包或丢包严重抓不到包的常见原因有几个网卡选错了、代理端口没通、防火墙拦截了。Windows 上如果你插着有线网卡又连着 Wi-FiWireshark 默认抓的是第一个接口但流量可能走了另一个所以要先确认要抓的接口是哪一个再用-i参数指定。代理模式下抓不到包最常见的是代理端口被占用或者主机 IP 写错了。我习惯在命令行先telnet 192.168.x.x 8080测一下端口通不通不通就去看防火墙通了再去排查证书和过滤条件。丢包严重的情况多发生在高并发场景比如线上压力测试。Wireshark 的默认缓冲区可能不够会导致内核丢包。这个时候可以在 Wireshark 的“ Capture Options ”里把 Buffer Size 调大单位是 MB我一般直接拉到 256。Linux 下用 tcpdump 也可以加-B参数设置缓冲区大小在高流量链路抓包时是必备选项。5.3 手机抓包时无法上网手机连上代理之后就上不了网很多时候不是代理工具有问题而是代理地址或者端口填错或者电脑防火墙没有放行对应端口。这里有个小技巧先让手机浏览器访问一个纯 HTTP 的站点比如http://mitm.it能看到证书下载页面说明代理链路基本通了。如果访问 HTTP 站点都超时那基本就是网络层问题如果 HTTP 能通但 HTTPS 报错那就是证书信任问题。Windows 用户还要注意一个坑有些安全软件或者系统防火墙会把抓包工具的进程网络访问拦截掉。别急着怀疑工具坏了先把防火墙规则检查一遍给对应程序放行是很有必要的。6. 写在最后的一点个人体会玩抓包这几年最大的感受是工具数量再多真正核心的还是你对自己应用协议的理解。Wireshark 再好你搞不懂 TCP 三次握手和 TLS 握手过程抓一万个包也看不出门道mitmproxy 再灵活你抓到了接口却看不懂字段含义依然定位不了问题。所以我建议大家刚开始接触抓包时别贪多就拿一款趁手工具反复练。想快速上手走 Web 调试方向就从 Fiddler 或 mitmproxy 入手想在协议底层深入钻研就一门心思吃透 Wireshark 的过滤语法和统计能力要处理服务器生产环境的问题tcpdump 的基本功必须扎实。工具只是一个入口分析思路和数据敏感度才是真正值钱的地方。最后分享一个小技巧抓到可疑请求后我习惯随手导出一份 HAR 文件。HAR 是 HTTP 请求导出的标准格式后端出了问题把 HAR 文件直接丢给同事他在自己的工位就能完整还原现场省得来回截图和口述。这比在聊天软件里发十张截图要有用得多也更专业。