ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

抓包工具全解析:Charles、Fiddler、Wireshark等五款工具选型与实战

抓包工具全解析:Charles、Fiddler、Wireshark等五款工具选型与实战 1. 工具全局对比与选型思路抓包这件事说穿了就是把网线上跑来跑去的数据拦下来看一眼。不管是前端联调、后端排障还是测试同学需要验证接口返回大家的第一反应都是“开个抓包工具看看”。市面上工具一大堆常用的其实就那么几类Charles 和 Fiddler 偏向应用层调试Wireshark 走的是底层报文分析路线Proxyman 是近几年在 Apple 生态里成长起来的新选择TraceEagle 则代表了一批轻量化、带自动化能力的后起之秀。我工作这些年电脑里这几个软件基本都装过但真正长期留下来用的其实看场景。Windows 环境下做接口调试Fiddler 顺手macOS 下跑移动端 App 联调Charles 是主流要查 TCP 握手、确认丢包和延迟Wireshark 几乎不可替代如果主要面向 iPhone 和 iPad 做调试Proxyman 的原生手感要比 Charles 流畅不少而 TraceEagle 这类工具则更适合有自动化回归需求的团队追踪接口变更和做批量回放比较省事。可以说没有哪一款工具是万能的选型取决于你每天面对的问题。这篇文章不会只讲界面操作我会把这些工具背后的工作方式、抓包链路、证书机制、以及踩过的问题都掰开来讲方便大家直接对着自己的场景挑工具而不是每款都装了又卸载。2. 核心细节解析五款工具的配置逻辑与关键参数2.1 Charles移动端调试的主力选手Charles 是一个基于 Java 的抓包工具界面分成左右两栏左边是连接列表右边是请求详情。它的核心能力是作为中间人转发节点把客户端的请求截到本地再发往真实服务器拿到响应后回传客户端。这个过程中所有 HTTP 明文请求可以直接看而 HTTPS 则需要安装并信任 Charles 的根证书才能解密出明文内容。配置 SSL 解密是 Charles 使用中最重要的一个环节。默认情况下Charles 只展示 CONNECT 请求看不到具体的请求头和响应体。你需要点击菜单栏的“Proxy”里的“SSL Proxying Settings”勾选“Enable SSL Proxying”并添加一个 LocationHost 填*Port 填443这样就能对任意域名做 HTTPS 解密。如果只想监听特定域名Host 填具体域名例如api.example.com避免把所有流量都解密一遍带来的性能浪费。连接手机时先让手机和电脑处于同一个局域网电脑端在“Help”菜单里查看本机 IP然后打开手机的 Wi-Fi 设置在网络入口配置里把服务器地址填成电脑 IP、端口填成 8888。注意 iPhone 上填写时IP 和端口要切换成非默认选项才能输入。手机首次连接时访问 chls.pro/ssl 下载并安装证书再到系统设置里启用证书信任。这里最容易被忽略的是iOS 14 以上版本需要在“设置 通用 关于本机 证书信任设置”里手动打开开关否则即使装了证书也解密不了。Charles 另一个高频率功能是 Map Local。我在联调时经常遇到接口数据被改、服务端返回不符合预期的情况直接用 Map Local 把某个接口的响应替换成本地 JSON 文件比等后端改完再测要高效得多。配置方式是右键目标请求选择“Map Local”指定本地文件路径同时可以让 Charles 保持请求的原始 URL 不变。Map Remote 则适合把线上域名临时指向测试环境域名前后端分离开发时非常实用。2.2 FiddlerWindows 生态下的规则中枢Fiddler 分为 Classic 和 Everywhere 两个版本。Classic 免费适合 Windows 单独使用Everywhere 是跨平台商业版界面更现代但很多人用得并不如 Classic 顺手。Fiddler 的所有流量都经过一个本地转发监听点默认端口 8888监听本机 127.0.0.1 上的流量。因此无论浏览器还是桌面客户端只要走了这条入口都会被 Fiddler 捕获。Fiddler 最大的优势是它的“规则”体系。左侧会话列表选中任意请求右侧“Inspectors”面板能看到完整的请求和响应底部“FiddlerScript”直接编辑脚本逻辑比如修改响应头、伪造返回体、延迟返回时间等。配合“AutoResponder”功能你可以把某个 URL 的响应预设为指定返回实现接口 mock。这也是我早期做前端绕过后端联调的主要方式。解密 HTTPS 时菜单栏“Tools Options HTTPS”勾选“Decrypt HTTPS traffic”Fiddler 会提示安装根证书。需要注意Fiddler 在解密的同时可能会把证书替换成 Fiddler 的 CA 证书因此如果你的程序有证书固定校验请求会直接被拒。Windows 系统里安装证书时建议选“当前用户”和“受信任的根证书颁发机构”存储区不然有些应用识别不到。FiddlerScript 是 Fiddler 拉开和其他工具差距的地方。举个实际栗子后端接口返回字段里有时间戳前端希望直接改成当前时间你可以在脚本的OnBeforeResponse方法里写几行 C# 代码处理响应体。这个能力在 Charles 里需要装插件或者手动改文件Fiddler 里则随时可以在 UI 上调试适合喜欢写一点脚本、希望抓包过程中自动加工数据的人。2.3 Wireshark从报文里看懂网络底层Wireshark 和上面几款工具的层级完全不同。Charles、Fiddler 这些工具工作在应用层通过转发链路能直接看到 HTTP 请求语义Wireshark 则直接抓取网卡上的原始数据帧分析的是链路层、网络层、传输层的数据因此能看到 TCP 三次握手、TLS 握手细节、丢包重传、乱序、延迟等信息。它的定位不是“接口调试”而是“协议排障”。Wireshark 上手的第一步是选对抓包网卡。Windows 下如果开了无线通常会看到“WLAN”和“以太网”两张网卡选择实际连外网的那张macOS 下常见的是“Wi-Fi: en0”。双击网卡名称即可进入抓包。默认抓包会捕获大量数据界面信息非常多因此用好过滤器是 Wireshark 的核心技能。捕获过滤器写在启动前的输入框里例如tcp port 443只保留 443 端口数据显示过滤器写在顶部工具栏例如http.request只看 HTTP 请求tcp.flags.syn 1只看 SYN 包。这里要特别提醒一个新手误区Wireshark 默认只能看到所有流量的包结构而 HTTPS 流量在报文里是加密的无法直接读出来。如果你需要 Wireshark 解密 TLS就必须让程序导出会话密钥。方法是设置环境变量SSLKEYLOGFILE指向一个可写的文件路径然后重启浏览器。Chrome 和 Firefox 支持该变量浏览器访问 HTTPS 页面时会把每个连接对应的主密钥写入文件Wireshark 再通过“Preferences Protocols TLS”指定这个日志文件就能自动解密抓包数据了。如果你接手的是一份.pcap抓包文件Wireshark 也支持离线分析。用菜单“File Open”打开文件后同样可以使用显示过滤器定位问题。比如两个 IP 之间的所有纯文本用右键“Follow TCP Stream”可以还原整段对话内容适合排查应用层协议异常。2.4 Proxyman拥抱 Apple 生态的轻量工具Proxyman 是 macOS 上非常流行的一款抓包工具近几年在 iOS 开发者中口碑增长很快。它提供的功能与 Charles 高度重叠但整个界面是原生 SwiftUI 写的操作时很少出现 Java 应用那种卡顿感。如果你平时用 Mac 做开发同时经常需要调试 iPhone 上的 AppProxyman 是一个值得认真尝试的选择。Proxyman 的 SSL 解密可以自动处理。安装后打开它会提示你安装并信任根证书连接 iPhone 时同样需要配置网络入口指向电脑 IP 和端口默认 9090。相比 CharlesProxyman 在首次连接时对证书信任的处理引导更清晰少了“装了证书但不明所以”的情况。它还内建了“Sniffer”模式可以直接捕获指定 App 的流量而不必全局监听这在排查单一应用问题时体验更好。工具内置了 Map Local 和 String Replace。String Replace 适合替换请求或响应中的指定字符串例如把沙箱域名直接替换成正式域名省得改代码。实际工作中我用它做过接口返回里的图片 URL 批量改走本地服务比 Charles 的 Map Local 更快捷因为不需要额外准备文件只要填入期望替换的两段文本即可。Proxyman 还支持脚本自动化。在“Scripting”面板可以写 JavaScript 或者 Swift 脚本对请求做条件处理。例如你可以写一段脚本遇到某个路径自动添加一个 Header这是很多后端联调场景里反复需要的动作。2.5 TraceEagle偏自动化和回归场景的后起之秀TraceEagle 在五款工具里相对小众它给我的感受是目标用户不是“单次排障”而是希望在抓包基础上做接口自动化回归的团队。它更像一个把抓包能力与接口对比、场景回放、批量校验结合起来的工具而不是传统意义上的纯手工抓包器。这类工具的价值在于团队协作场景。多人联调时每个人都能把抓到的请求集合导出为用例脚本后续跑回归时直接回放校验接口返回是否符合预期。相比 Charles 那边靠手动保存 sessionTraceEagle 更强调用例的组织与复用。如果团队里测试同学日常需要维护一批接口用例这类轻量化工具可能比一上来就搭建 Postman Newman 的门槛低很多。在实际选择时TraceEagle 适合作为辅助工具。遇到核心疑难杂症我仍然会用 Wireshark 做底层分析日常调试移动端接口Charles 或 Proxyman 顺手得多但如果团队已经有了自动化和回归流程用 TraceEagle 做契约校验和变更追踪是可取的补充。3. 实操过程从配置到出包的一次完整抓包流程3.1 用 Charles 抓取手机上的 HTTPS 请求以最常见的场景举例iPhone 连接 Charles抓取 App 的 HTTPS 接口。整个流程可以分为四步。第一步电脑端开启 SSL 解密。打开 Charles在“Proxy”菜单里选择“SSL Proxying Settings”勾选 Enable SSL Proxying在 Location 列表里添加*:443。这里如果只想抓某个域名可以只填该域名避免大量无关流量刷屏。第二步安装并信任证书。电脑端先通过菜单“Help SSL Proxying Install Charles Root Certificate”完成本机证书导入并确保证书显示为受信任。手机端安装证书方法让手机连接同一个 Wi-Fi配置好网络入口后用 Safari 打开chls.pro/ssl下载证书到手机然后到系统设置里手动信任。iOS 的信任路径是“设置 通用 关于本机 证书信任设置”把 Charles 证书对应的开关打开。第三步检查端口监听状态。Charles 默认监听 8888 端口可以在“Proxy Proxy Settings”里确认。手机 Wi-Fi 网络入口里填写的 IP 必须是电脑当前在局域网中的实际 IP。如果一直无法抓到请求先 ping 一下这个 IP 是否通再确认电脑防火墙是否放行了 8888 端口。防火墙问题我在 Windows 上遇到比较多macOS 上基本不会弹窗阻拦。第四步定位并查看请求。打开手机上的 App触发目标接口Charles 左侧会出现对应的域名条目。展开后选中某个请求右侧切到“Contents”标签可以看到完整的请求头、请求体以及响应数据。如果接口返回的是 JSONCharles 会格式化显示层级非常清晰。这里我会顺手推荐一个习惯把常用域名加到菜单“Proxy SSL Proxying Settings”里做精确匹配并且用“Current Settings”里的聚焦功能只看这一个域的流量效率会高很多。3.2 用 Wireshark 分析一个 TCP 连接失败问题有一次用户反馈某个客户端连不上服务器重试很多次都失败但又没有任何报错日志。用应用层抓包工具看了很久发现请求根本没有到达业务层。于是我打开 Wireshark选择对应的网卡在捕获过滤器里填上host 服务器IP and tcp port 443再让客户端重试一次问题立刻水落石出。我在结果里看到客户端发出 SYN 包但服务端始终没有回应连续几次 SYN 重传后连接超时。这说明服务器入口可能在防火墙层面直接丢弃了连接。如果服务端返回的是 RST 包那问题多半在端口服务没监听如果能看到 SYN-ACK 但后面握手失败则要检查中间链路设备或本地防火墙策略。这就是 Wireshark 的应用层工具替代不了的价值——它能定位到握手层最基础的交互状态。用 Wireshark 看这类问题关键是掌握几个快捷操作。看到抓包列表后右键任意 TCP 包选择“Follow TCP Stream”就能把整个连接的数据流还原出来想确认握手是否正常时在显示过滤器中输入tcp.flags.syn 1看 SYN 包输入tcp.flags.reset 1看 RST 包。只要把这两个标志位抓到大多数连接类问题都能有个大致方向。3.3 用 Fiddler 做接口 mock 和自动响应Fiddler 在开发阶段最常用的是 AutoResponder。假设后端GET /api/user/info接口还没实现但前端需要联调页面我可以在 Fiddler 左侧找到一个已抓到的同域名请求右键“Save Responses Save Response Body”保存返回数据为本地文件然后到右侧“AutoResponder”标签页勾选“Enable Rules”添加一条规则请求 URL 匹配regex:.*\/api\/user\/info响应内容选择刚才保存的 JSON 文件。这样再访问页面时前端拿到的是本地假数据联调不再被后端阻塞。如果每个接口都要手动保存文件效率还是低。FiddlerScript 可以批量处理。打开“FiddlerScript”标签在OnBeforeResponse里写上判断逻辑例如if (oSession.HostnameIs(api.example.com)) { oSession.utilDecodeResponse(); var body oSession.GetResponseBodyAsString(); body body.Replace(\env\:\dev\, \env\:\test\); oSession.utilSetResponseBody(body); }这样当响应体包含特定字段时工具会自动做文本替换整个联调环境的公共返回内容就能保持一致性。实际调试时这种“自动改写”比到处改配置文件更符合开发者的心智。4. 从原理层面理解工具差异避免“换了工具还是抓不到”4.1 中间人转发与 TLS 解密的天然边界应用层抓包工具能够看到明文请求靠的是中间人机制。客户端和服务器之间的有效连接被工具一分为二客户端先和工具完成一段 TLS 握手工具再和服务器建立另一段 TLS 连接。因为工具持有自己的根证书并生成了对应域名证书所以两段连接都可以解密。但这一切的前提是客户端愿意信任工具的根证书。这里会遇到一个非常常见的限制证书固定。很多 App 会内置服务器证书的公钥或指纹信息客户端在发起请求时只认内置证书见到工具签发的证书直接中断连接。Charles、Proxyman、Fiddler 都会在这一步失效抓包结果表现为“请求发送出去但没有响应”或者在 Wireshark 里看到一堆 TLS Alert。这种情况不是工具本身的问题而是一种安全机制在发挥作用。开发阶段如果确实需要查看加密请求有两个相对正规的方向一是把 App 调试包的网络配置改为信任用户证书二是找客户端代码里对证书固定逻辑做开关处理。我自己遇到这类问题时通常优先联系客户端组确认调试包是否开放了网络入口配置而不是去处理系统证书省时省力。另外要注意 Android 7 以后系统默认不信任用户证书。装了证书也解不了 App 的 HTTPS 包时先检查一下是否受这个策略影响。国内不少开发者在测试机上直接 root 后把证书放到系统证书目录里这确实能绕过 Android 的默认限制但会带来设备安全问题。日常开发中很多企业测试机会提供专门关闭证书校验的构建版本这是更推荐的路径。4.2 应用层抓包和链路层抓包的边界解释清楚一个常见困惑为什么 Wireshark 能看到 TCP 握手的包而 Charles/Fiddler 看不到。原因是两者监听的位置完全不同。Charles 这类应用层工具是“接入链路”式的客户端流量先经过工具的监听端口再由工具转发出去能看到的仅限这个端口上的 HTTP/HTTPS 内容。Wireshark 是直接抓网卡数据所有进出网卡的帧都能看到因此协议栈里发生的事情基本一览无余。这也带来另一个常见误解有人用 Charles 抓包时以为能像 Wireshark 那样看到 UDP 或 ICMP 报文结果发现根本没有。因为应用层工具依赖 TCP 转发机制UDP 流量不走这个逻辑自然捕获不到。反过来Wireshark 能看到所有报文但它不懂 HTTP 语义没法像应用层工具那样直接列出 URL、请求参数和响应字段。两个方向想兼顾最实用的做法是组合使用先用应用层工具定位业务线索再用 Wireshark 深挖链路层细节。举例来说我排查过一个偶发超时问题。Charles 里看请求和响应花费了 8 秒但服务器日志显示处理只有 50ms那剩下的时间去哪了这时用 Wireshark 重新复现一次观察 TCP 数据包里的 ACK 和重传情况我很快发现是网络链路中某个节点反复丢包导致重传积压。如果只看 Charles 的耗时可能还会一直怀疑服务端处理慢方向会跑偏。5. 高频问题与排查技巧实录5.1 手机抓不到包只看到 CONNECT 请求这是移动端调试最经典的问题。安装好证书、完成网络入口配置后却发现 Charles 里只有密密麻麻的 CONNECT看不了请求内容。原因基本有两种一种是 SSL 解密没有开启或者 Location 范围不对只抓到了 TLS 隧道建立前的 CONNECT 报文解不了后续加密内容第二种是证书没有真正被信任手机端访问chls.pro/ssl下载了证书但没在系统设置里打开信任开关。排查步骤是先确认“SSL Proxying Settings”里有*:443规则然后打开手机浏览器访问一个普通 HTTP 网站测试 Charles 是否能抓当前流量再切换到一个 HTTPS 网站并检查是否能看到 Content-Type 等明文请求头。如果 HTTP 能抓到、HTTPS 只能看到 CONNECT那问题基本锁定在证书信任环节如果连 HTTP 都抓不到就要检查网络入口配置或防火墙了。需要注意的是部分 App 会直接使用系统网络设置之外的长连接通道也可能用了证书固定这类情况即使上述步骤全部正确也抓不到内容。这两种属于应用层的主动限制不是抓包工具能轻易突破的应回到开发维度去处理。5.2 HTTPS 解密后提示证书不受信任电脑上首次开启 Fiddler 或 Charles 的 HTTPS 解密时系统会弹出“证书不受信任”的警告。这不是工具坏了而是你还没把根证书加入系统受信任区。Windows 上导入 Fiddler 根证书有一个细节证书应该放到“本地计算机”的“受信任的根证书颁发机构”存储区而不是“当前用户”区。如果装了证书但 Chrome 仍然报错多半是位置不对。macOS 上安装 Charles 证书后还需要在“钥匙串访问”里找到该证书并标记为始终信任。这里有个常见坑只双击证书完成安装却没有修改信任策略结果所有应用仍然对该证书有疑问。正确操作是打开“钥匙串访问”找到 Charles 或 Fiddler 证书展开“信任”选项把“使用此证书时”改成“始终信任”再关闭窗口。这一步做完解密才真正生效。5.3 Windows 卸载 Fiddler 后无法上网这个问题我在公司同事的电脑上遇到过。卸载 Fiddler 之后浏览器打开任何网页都提示无法访问。原因在于 Fiddler 卸载时没有把系统网络入口中的残留配置清理干净。Fiddler 在运行时会在系统网络设置里挂一个本地转发入口指向本机 8888 端口。卸载程序时如果没有正常退出并移除这个入口系统流量就会一直被导到一个已经不存在的监听端口上。解决办法很简单打开“设置 网络和 Internet 代理”把“使用代理服务器”关掉或者把本地地址列表清空。如果你用的是 Win10 或 Win11还可以在“Internet 选项 连接 局域网设置”里取消勾选地址类的配置。清完之后重启浏览器即可恢复正常。这个问题也提醒大家不要在抓包工具运行状态下直接强杀进程卸载最好先退出工具让系统设置恢复正常。5.4 Wireshark 里报文太多找不到关键内容Wireshark 能看的数据太多反而是一大负担。我建议三步走。第一抓包前先思考目标如果只看某台机器的流量先把捕获过滤器写好例如host 10.0.0.5这样抓包文件会小很多。第二抓包时随手做标记看到可疑现象时按快捷键CtrlM做一个标记。第三分析阶段多用显示过滤器http看 HTTPtls.handshake.type 1看 TLS ClientHellodns看 DNS 请求tcp.analysis.retransmission看重传。如果仍然觉得列表滚动费力可以右键某条报文选择“Conversation Filter”直接只看这个连接相关的所有包。这个操作比任何过滤器都更快适合在杂乱的抓包文件里快速聚焦目标会话。5.5 证书固定导致抓包工具直接失效应用层抓包工具面对证书固定几乎无解。常见表现是证书已安装、配置都已生效但 App 一启动就报网络错误或者 TLS 握手失败。用 Wireshark 也能看到大量 Alert 包。此时不必再跟工具较劲优先确认 App 是否有调试模式或者是否有测试环境专门关闭证书校验。很多大厂 App 的测试包都内置了这类开关需要在开发阶段提前申请。此外部分 App 会同时做双向校验即使客户端信任根证书服务器也不认客户端。这时候抓包工具只能看到客户端请求发出但服务器直接断开。定位问题的方式是观察 TLS 握手包的内容看是证书校验失败还是客户端没有发送客户端证书。这两种情况在处理方式上完全不同前者往往能通过配置文件放开后者则是安全策略设置需要后端配合确认。6. 我最后留下的使用习惯工具用多了以后我发现最值钱的不是某一款工具的功能有多全而是脑子里有一套清晰的选择逻辑。日常移动端接口调试我首选 Charles因为团队里其他人都在用导出会话文件互相看比较方便在 mac 上如果只是快速看一眼某个请求我反而会打开 Proxyman启动速度和流畅度都比 Java 应用好Windows 办公机上处理紧急问题我打开 Fiddler 最稳妥规则脚本临时改起来快一旦问题下沉到网络底层我会毫不犹豫开 Wireshark把应用层通通放一边只看报文。TraceEagle 这类新工具我会建议测试团队在搭建自动化体系时认真评估。它可以帮你把手工抓包积累下来的请求集合转化为可回放的用例脚本减少回归测试时重复造数据的时间。这类工具未来会不会替代传统三件套我觉得短期不太可能但作为补充角色它在团队协作这个短板上是真的有用。还有两个小技巧想分享给刚入门的同学。一个是抓到包之后不管什么工具都养成“导出并保存”的习惯把会话记录保存为.chls、.saz或.pcap文件方便事后翻查也方便发给同事时附上证据。另一个是把工具“拉干净”证书不用了要及时移除系统网络入口配置改完要记得恢复避免出现卸载工具后上不了网那种乌龙。抓包工具说到底只是顺手的尺子真正关键的是理解和定位问题的思路。掌握每一款工具的背后原理知道它们各自能看哪一层、弱点在哪遇到问题时就不会手忙脚乱地装了卸、卸了装。
返回列表