ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

五大抓包工具深度对比:选型、配置与排障

五大抓包工具深度对比:选型、配置与排障 桌面上一口气装着Charles、Fiddler、Wireshark、Proxyman、TraceEagle五个抓包工具大概是很多人的常态。装这么多不是因为闲而是每次打开它们的时候心里都清楚这次该干的事未必是上次那个工具能干好的。这篇东西不打算把官方文档复述一遍只讲我实际使用中怎么选、怎么配、怎么排障。先说清楚一个基本事实这五个工具虽然都被叫“抓包工具”但“抓包”两个字在不同人嘴里完全是两码事。前端说的抓包是看接口请求参数测试说的抓包是做弱网和Mock网络工程师说的抓包是看TCP握手、看协议栈异常。这篇文章会把这几个维度拆开讲把五个工具的主战场、上手步骤、常见坑都过一遍。适合刚入门想选工具的人也适合已经用着某个工具但经常被问题卡住的开发者。1. 先想清楚这五个工具根本不是同一个物种1.1 应用层代理与链路层分析别把螺丝刀当电钻Charles、Fiddler、Proxyman、TraceEagle是一类Wireshark是另一类这是理解整个选型问题的第一道门槛。前面四个工具本质上是HTTP/HTTPS代理服务器。它们的工作方式是在你的客户端和目标服务器之间插一脚手机或者浏览器把请求发给这个代理代理再转发给真正的服务器响应回来的时候同样经过它。因为流量都从它身上过它自然能把你发出的请求、收到的响应完整摊开给你看。这也是为什么“代理”这个词会频繁出现在这些工具的配置里。这里说的代理是本地调试代理纯粹为了解决“流量从哪走、能不能被看到”的问题。Wireshark不一样。它不代理任何流量而是靠网卡的混杂模式去复制链路上经过的数据帧。说得生动一点前面那四个工具是“进饭店后厨帮你看看菜是怎么做的”Wireshark是“坐在饭店门口看所有进出的人手里提了什么”。它能看到的东西更多、更底层但它不会替你把菜端上桌也不会参与你的请求过程。这个区别直接决定了你的使用场景。你在联调接口时发现参数不对打开Wireshark一顿找是能找着但效率极低反过来网络丢包、TCP重传、DNS解析失败这类问题你用Charles去看只会一头雾水因为代理工具根本不展示网络层信息。1.2 一张表看清五个工具的主战场做工具对比最怕的就是列一堆参数看完更懵。我用一句话加一个场景的方式把五个工具的主战场先摆出来工具工作层级主要平台最擅长的场景最常听人吐槽的点CharlesHTTP/HTTPS代理Windows / macOS / Linux移动App抓包、弱网模拟、Mock数据Java界面老旧License不便宜FiddlerHTTP/HTTPS代理Windows为主Windows桌面客户端抓包、脚本扩展、系统级代理操作卸载后容易留下代理残留ProxymanHTTP/HTTPS代理macOS / iOSiOS/macOS开发调试界面现代模拟器友好生态和资料比Charles少Wireshark链路层/网络层全平台协议分析、网络排障、CTF流量分析功能太深新手容易劝退TraceEagleHTTP/HTTPS代理桌面端轻量快速抓包资源占用小社区小教程少这不是什么严格参数表而是我日常使用之后的经验划分。你会发现这五个工具里没有一个是“全都能打”的真正的差别是你手里的流量从哪条路走以及你想看到第几层的信息。1.3 从使用场景反推工具而不是从名气挑工具我给团队新人做工具推荐时从来不说“你用Charles吧大家都用”这种话而是先问他要解决什么问题在调App接口想看请求参数、响应体、错误码选Charles或Proxyman。在Windows上调试桌面程序或者想用脚本批量改请求选Fiddler。某个接口偶尔超时怀疑是网络问题开Wireshark抓TCP别在代理工具里瞎猜。只是临时想确认一个请求返回了什么东西不想开重型工具TraceEagle这种轻量方案能帮上忙。在参加比赛或者分析一份pcap流量包Wireshark是唯一能打的。选工具的逻辑就一句话你先搞清楚流量是从哪条路走的再决定打开哪个软件。2. Charles老牌代理抓包工具的高频用法和我踩过的坑2.1 代理原理弄不明白后面全是玄学Charles默认监听本地的8888端口。启动之后它会主动把自己设置为系统代理所以你打开浏览器访问网页请求会先到Charles再由它转出去。这也是为什么Charles没关、系统代理还开着的时候浏览器可能直接没网。明白这个原理再看两个最常见的现象就不会慌为什么手机抓包要先在WiFi里填电脑的IP和8888端口因为你要把手机的流量也引到Charles这个代理上来。为什么有些App装了Charles的证书还是看不到HTTPS内容因为那个App可能设置了SSL Pinning也就是只信任自己内置的服务器证书系统里的根证书对它是无效的。这一点要靠逆向或者框架绕过不在工具配置范围。代理抓包的前提是流量愿意从它这里走这句话我每次排障都会默念一遍。2.2 手机抓包三件套代理、证书、SSL Proxying手机抓包是Charles最高频的使用场景。完整走一遍通常是这样的电脑和手机连到同一个局域网。电脑上执行ipconfigWindows或ifconfigmacOS/Linux确认局域网IP。手机WiFi设置里找到“HTTP代理”或者“代理”选择手动填上电脑IP和端口8888。手机浏览器访问chls.pro/ssl下载并安装Charles的根证书。在Charles菜单里打开Proxy - SSL Proxying Settings勾选Enable SSL ProxyingLocation里填*:*表示所有域名和端口都解密。iPhone用户注意装完证书之后还要到“设置 - 通用 - 关于本机 - 证书信任设置”里把Charles的证书开关打开。不做这一步你看到的依然是密密麻麻的CONNECT请求点进去全是黑洞。这一步最坑的地方是顺序。很多人先配了代理、再装证书结果发现只要Charles一开手机就上不了网或者开了代理之后App一直转圈。这种情况九成是证书没装好或者没信任先退回去看证书状态。Android 7.0以上还有另一个大坑默认情况下App不信任用户证书。你明明装了证书Charles里却看不到解密内容。普通解决方案是让开发在networkSecurityConfig里允许用户证书或者用已root设备把证书装进系统证书目录。这个属于Android安全机制不是Charles的问题但排查时要能想到。2.3 弱网模拟和Mock数据是Charles的日常价值很多人把Charles当成“看请求”的工具其实它的强项是模拟一个不那么友好的网络环境。弱网测试在Proxy - Throttle Settings里勾选Enable Throttling之后可以设置带宽、往返延迟RTT和丢包率。我调App的超时逻辑时经常把延迟调到500ms以上带宽压到256kbps然后盯着页面看loading状态、超时提示、重试机制是否按预期工作。这会暴露很多在办公室WiFi下根本发现不了的问题。Mock数据这件事Charles提供了Map Local、Map Remote、Rewrite三套能力Map Local把某个URL的请求直接映射到本地文件。联调时后端接口还没写好我就在本地放一个JSON文件先让前端把页面流程跑通。Map Remote把线上环境请求重定向到测试环境多用于切域名调试。Rewrite允许你直接改请求头、响应头、请求体里的某些字段不需要改代码。举一个实际例子有一次后端接口偶发返回500前端要复现异常页面的样式但一直等不到。我用Map Local把那个接口指到本地一个固定返回500的JSON页面样式直接复现。这里的思路是工具不是用来解决所有问题的而是帮你把不可控的外部依赖变成可控的输入。2.4 注册码、汉化和合规这个话题热词里有“charles注册码”“charles汉化”这块我表达一下个人态度商业软件该买还是买注册码相关的东西我不展开也不建议用不明的破解包。Charles的免费试用版虽然会时不时弹窗但大部分开发调试场景都能撑住。如果公司预算确实卡得紧开源方案如mitmproxy、whistle也能做代理抓包只是配置和界面没那么省心。汉化包也是一样第三方汉化版本最好确认来源可靠来历不明的包里夹带私货的例子不少。做开发调试的人对装进电脑的未知程序应该有点敏感。3. FiddlerWindows生态里的全能选手但代理残留这个大坑必须会排3.1 Classic与Everywhere先把版本选对Fiddler的版本问题是新手最容易迷糊的地方。现在传的教程里大部分老截图都是Fiddler Classic免费、Windows专属、功能齐全但微软收购后基本处于维护状态。Fiddler Everywhere是后来重写的跨平台商业产品支持macOS和Linux界面现代化了很多但很多经典插件和脚本模型和Classic不通用。我的建议很简单如果你人在Windows、想尽快上手、预算也不多直接用Fiddler Classic老教程多插件多够用如果你需要跨平台同步规则或者看重界面体验再考虑Everywhere。不用纠结“哪个更好”你面对的问题比版本差异实际得多。3.2 卸载后上不了网代理残留的完整自救流程这是Fiddler相关热词里最有价值的一个问题值得认真说。现象很典型卸载Fiddler之后浏览器突然打不开任何网页有些程序报“代理服务器出现问题”但微信、QQ这类自带网络逻辑的应用可能还正常。原因说穿了就一句话Fiddler在退出或卸载时没能把系统代理设置恢复原样。它正常运行的时候会把Windows的WinINET代理指向127.0.0.1:8888。如果你强杀进程、系统崩溃或者卸载过程中途被打断注册表里ProxyEnable和ProxyServer的值就留在了那里。系统此后依然把所有HTTP流量往一个已经不存在或已改代码的本地代理上送自然上不了网。自救流程按顺序来打开“Internet选项”WinR输入inetcpl.cpl切到“连接”标签点“局域网设置”取消勾选“为LAN使用代理服务器”。打开Windows设置 - 网络和Internet - 代理把“使用代理服务器”关掉。管理员权限打开命令行执行netsh winhttp reset proxy重置WinHTTP代理配置。如果还不放心打开注册表定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings确认ProxyEnable的值是0ProxyServer可以清空。这里有个小经验每次用完Fiddler正常从菜单退出别直接杀进程。很多代理残留问题根本不是卸载导致的而是日常使用中强杀进程积累出来的。3.3 弱网测试与脚本扩展Fiddler不只是抓包Fiddler的弱网模拟入口很好记菜单Rules - Performance - Simulate Modem Speeds。这个选项直接模拟当年拨号上网的速度效果非常猛用之前做好心理准备。更精细的做法是写FiddlerScript。打开FiddlerScript标签找到OnBeforeRequest方法插入类似这种逻辑if (oSession.URIContains(/api/order)) { oSession[request-trickle-delay] 2000; }意思是当请求URL里包含/api/order时给这个请求加2秒的延迟。这种做法比全局模拟更贴近真实场景——只针对特定接口做弱网其他接口保持正常方便定位是哪个接口拖慢了整页加载。AutoResponder是Fiddler做Mock的明星功能。使用方式很直观把一个响应直接拖到右侧面板勾选Enable Rules写URL匹配规则再勾选Unmatched requests passthrough。这样命中的请求会返回你拖进去的那个响应未命中的请求正常放行。我在测试环境挂掉的时候经常靠这个功能把关键接口指到本地保存的响应文件让测试流程不被环境阻塞。3.4 HTTPS解密失败的常见原因Fiddler开启Decrypt HTTPS traffic之后如果列表里依然看不到明文按这几个方向查根证书没有安装到“受信任的根证书颁发机构”存储区。客户端做了证书校验SSL Pinning这个无解只能配合调试框架绕过。系统时间不对。证书有有效期校验系统时间差太多会让证书立刻失效。TLS版本兼容问题。旧版本Fiddler对新TLS加密套件支持不完整升级到最新版能解决大部分情况。我遇到过最蠢的一次是电脑时间被手动调快了几天结果所有HTTPS解密全部报证书无效排查了半天才反应过来。4. ProxymanmacOS/iOS开发者绕不开的新世代选择4.1 为什么我说它是“给macOS开发者准备的Charles”说实话Charles到现在依然是功能非常能打的老工具但它的Java界面在Retina屏和M系列芯片上越来越有种“上个时代”的感觉。Proxyman是原生macOS应用启动快、内存占用低界面风格也更贴近Xcode和系统工具的审美。更关键的是它对模拟器的支持。用Charles抓iOS模拟器的包你得手动给模拟器设置代理有时候还得关心localhost到底是Mac还是模拟器自身。Proxyman可以直接检测到本机运行的模拟器把流量拉进来省去配置环节。这个“省事”看起来很轻实际用起来能省掉很多烦躁。Proxyman的免费版提供了基础抓包和视图对比高级功能走订阅制。如果你只是偶尔看一下接口免费版够用如果是团队长期做移动端调试买License省心。4.2 iPhone抓包全流程从配对到证书信任Proxyman和iPhone配合的走法和大部分代理工具类似但它提供了一套相对完整的“连接引导”打开Proxyman确保代理已开启记下端口。iPhone连到和Mac同一个WiFi在WiFi设置里把HTTP代理指向Mac的局域网IP和Proxyman端口。Safari访问proxyman.io/ssl下载根证书按提示安装。安装完成后一定记得去“设置 - 通用 - 关于本机 - 证书信任设置”把证书的信任开关打开。回到Proxyman在设备列表里能看到iPhone已经连上之后的所有HTTP/HTTPS流量就会显示在主窗口。我特别喜欢的一点是Proxyman的对流对比视图想对比同一个接口在不同环境下的返回可以直接选中两条请求右边就会出现字段差异不用再手动人肉比对。这对于联调时排查“测试环境正常、生产环境异常”这类问题非常高效。4.3 迁移成本和两个不迁移的理由如果你已经在Charles里配置了一堆Map Local、Rewrite规则换到Proxyman确实有迁移成本规则没法一键导入需要重新配。但有两个情况我不建议换团队协作里规则文件都是基于Charles导出的新人入职也按Charles培训这时候强行换工具会增加沟通成本。你根本不碰iOS和macOS生态Proxyman的优势对你来说体现不出来。如果不是这两种情况新开一个项目时优先试试Proxyman没毛病。5. Wireshark回到链路层才看得懂真正的“包”5.1 装了之后别急着抓包先选对网卡Wireshark安装时通常会让选装Npcap或WinPcap这个别跳没有底层驱动抓包性能会差很多。打开Wireshark之后第一个界面是密密麻麻的网卡接口。很多新手在这里就懵了怎么这么多网卡有VMware、VirtualBox、WSL等虚拟网卡在接口列表会非常乱。经验是先看“上行/下行”的实时波形或者在命令行用ipconfigWindows和ifconfigLinux/macOS确认你自己在用的物理网卡的IP再回到Wireshark选对应名字的接口。抓本机回环流量有两个注意点Linux上直接选any或者lo接口Windows上要确认Npcap安装时勾选了对回环流量的支持否则本地进程之间的通信抓不到。还要说句大实话在普通家用WiFi环境里你是抓不到别人手机流量的。现在的AP普遍隔离客户端交换机和网卡也不会把别人的数据包转发给你。拿Wireshark去“看邻居在干嘛”是错误预期它是个网络诊断工具不是万能监听器前提是流量确实经过你的网卡。5.2 两种过滤器别搞混顺便解决你搜过的“VLAN tag”Wireshark里有两个过滤器概念看起来都叫过滤但作用时机完全不同捕获过滤器在开始抓包之前设置基于BPF语法只保留匹配的包。比如host 192.168.1.1 and tcp port 443。它的价值是减少抓包文件体积尤其在高流量环境。显示过滤器抓完包之后再用只影响“显示”不影响已抓到的数据。比如ip.addr 192.168.1.1 tcp.port 443。新手最容易犯的错是把两种语法混用。在显示过滤栏里写host 1.2.3.4Wireshark会直接报错因为host不是显示过滤器语法。几个我常用的显示过滤器http.request.method POST只看HTTP POST请求。tcp.analysis.retransmission只看TCP重传包网络质量排查必备。dns.flags.response 0只看DNS查询不看响应。tls.handshake.type 1只看TLS握手里的ClientHello。再说热搜里的“wireshark vlan”。如果你在交换机trunk口上抓包通常能看到带802.1Q标签的帧。想过滤某个VLAN显示过滤器写vlan.id 100。但如果你在物理网卡上抓却看不到任何VLAN标签先别怀疑过滤条件很可能是网卡驱动已经帮你把VLAN tag剥掉了或者你插的口是access口而不是trunk口。这类问题属于链路环境不换口子只看过滤器是解决不了的。5.3 教材实验和CTF流量分析Follow TCP Stream到底在看什么热词里冒出来的“密码比赛中的wireshark的writeup”以及“自顶向下第9版TCP实验”其实是同一类技能给你一个pcap文件让你从里面还原出事件过程。Wireshark里最常用的一招是右键 - Follow - TCP Stream。它会把一个TCP连接里双向的所有报文按顺序拼接成一段连续的流量。HTTP协议没加密时你直接在弹出窗口里就能看到完整的请求行、请求头、请求体和响应体。比赛里抓到一个登录请求过滤http.request.method POSTFollow流密码就躺在Body里等你urldecode。不只HTTPFTP的USER、PASS命令SMTP的MAIL FROM、RCPT TOTelnet的每一字节都能用Follow TCP Stream还原因为这些都是明文协议。至于“自顶向下”那组TCP实验数据包拿到手之后建议按这个顺序分析过滤tcp.flags.syn 1找到三次握手的SYN、SYN-ACK、ACK。看序列号SYN包占一个序列号数据包序列号如何增长能反映出每个报文段携带了多少字节。看确认号客户端发多少字节服务端回应Ack到哪个位置能推导出缓冲窗口。用tcp.analysis.ack_rtt字段看每个确认的RTT。打开Statistics - TCP Stream Graph - Time-Sequence (Stevens)看序列号随时间的曲线斜率就是发送速率。这套流程做完不仅作业能写完对TCP滑动窗口和重传机制的理解也会比看教材文字深刻很多。5.4 关于Wireshark解密HTTPS我说点实话很多人拿Wireshark抓了一堆443端口的包发现全是TLS密文问怎么解密。Wireshark的设计初衷就不是“装了根证书就能看明文”的代理工具。它解密HTTPS主要靠两种途径浏览器SSLKEYLOGFILEChrome、Firefox支持通过环境变量导出会话密钥。服务器RSA私钥你有服务器私钥时可以在Preferences - Protocols - TLS里配置。实际场景里基本拿不到服务器私钥所以这条路很窄。常用的是第一种。具体操作在系统里设置环境变量SSLKEYLOGFILE/path/to/keys.log。从这个环境变量启动Chrome或Firefox然后正常访问目标页面。打开Wireshark的Edit - Preferences - Protocols - TLS在(Pre)-Master-Secret log filename一栏填上同一个路径。抓包后HTTPS流量里的数据就能在Follow TLS Stream里看到明文。注意这里的“能解密”有一个前提ClientHello里用的密码套件密钥交换不能是前向保密的。但现在主流网站基本都是ECDHE这类前向保密套件Wireshark之所以还能解靠的是浏览器主动导出了会话密钥。这是“浏览器配合你”不是Wireshark神奇。另外HTTP/3QUIC协议的流量这套办法目前搞不定需要看这类流量的话别在HTTPS解密上死磕。6. TraceEagle冷门但值得一看的轻量方案6.1 一个看起来很“小”但定位很清晰的工具TraceEagle在五个工具里存在感最低社区讨论也不多。我最初是在调一个Android WebView页面时接触到的。当时不想为一个临时排查去开配置繁重的工具试了下发现它最大的优点就是轻安装包小、启动快、界面干净。它的核心能力和Charles、Fiddler一样仍然是HTTP/HTTPS代理抓包。所以它的抓包原理没有新鲜花样电脑上起一个代理端口把客户端流量指过去再通过安装根证书解密HTTPS。它的价值不在“有什么独家技术”而在“把常用功能做到开箱即用”。对于只想知道“这个请求到底发了什么、返回了什么”的人这种轻量方案反而比大而全的工具更顺手。6.2 典型使用流程和几个容易踩的点TraceEagle的典型使用流程大概是这样的下载安装后启动确认默认监听的代理端口。在目标设备或浏览器设置里把HTTP代理指向电脑IP和这个端口如果只抓本机请求通常有“系统代理”开关可以直接打开。访问目标网址或启动App请求列表会按时间显示出来。如果看HTTPS内容是密文去证书设置面板安装根证书安装方式和前面几个工具没有本质区别。基础的搜索、筛选、请求重放以及简单的弱网模拟通常也都有。实际使用中要注意的几点别和Charles/Fiddler同时开着。它们都抢系统代理端口代理端口一旦冲突表现就是“工具里的请求断断续续甚至一个都进不来”。网上教程少版本差异大。遇到界面和我描述的对不上别死磕按钮位置按照功能名称去找入口按版本更新日志确认新功能。轻量工具往往意味着规则能力弱。你想做复杂的Map Local、Rewrite或者需要精细的弱网参数TraceEagle这类工具可能比较勉强。6.3 值不值得投入时间如果只是偶尔抓包、临时确认一个接口返回或者想在U盘里放一个免安装的“备用工具”TraceEagle值得一试。如果是一个团队长期依赖抓包工具、需要沉淀规则和协作我建议还是把主工具放在Charles、Fiddler、Proxyman这些成熟方案上。选工具最怕“因为下载了所以必须使用”的心态也怕“每个工具都用一点、每个都用不深”。更合理的做法是主备搭配一个日常主力一个应急备用。你开着主力工具的时候记得把备用代理端口改掉或者直接退出。7. 选型思路与现场排查速查7.1 按角色选组合比按排行榜选更实在工具没有绝对的优劣只有适不适合你正在做的事。我按常见角色给一套参考组合角色推荐组合选择理由移动端开发Charles或Proxyman为主Wireshark备用代理抓包看接口异常网络用Wireshark查重传和DNS前端开发Charles/Proxyman接口联调、Mock、Rewrite改响应最顺手后端开发Charles/Proxyman Wireshark看请求参数和返回排查网络层超时靠Wireshark测试工程师Windows用FiddlermacOS用Charles弱网模拟、AutoResponder做数据mock最成熟网络/运维/SREWireshark绝对主力排障入口就是抓包分析代理工具只是辅助确认HTTP内容学生/CTF选手Wireshark为主流量分析、协议还原、pcap题写writeup都靠它这只是一个起点。等你自己摸索出习惯之后完全可以反过来比如后端开发把Wireshark当主力。关键是别五个同时装一堆然后每次都在想“我到底该开哪个”。7.2 高频问题排查速查把前面零散讲的几个高频问题集中放一个表方便现场照做现象排查顺序Charles抓不到代理手机的包1. 手机和电脑同一WiFi确认AP隔离关掉2. 代理IP不能填127.0.0.1要填电脑局域网IP3. 放行电脑防火墙对应端口4. 确认证书已装且已信任5. 确认SSL Proxying已开启Fiddler卸载后上不了网1. Internet选项里取消LAN代理2. Windows系统设置里关闭代理3. 管理员CMD执行netssh winhttp reset proxy4. 检查注册表ProxyEnable是否为0Wireshark看不到HTTP请求1. 选对网卡2. 确认没把捕获过滤器语法写进显示过滤栏3. 如果是443端口先考虑HTTPS解密4. 非标准端口用tcp.port做过滤不看http.requestProxyman连不上iPhone1. 证书信任开关没打开2. 代理端口填错3. macOS防火墙拦截4. 手机和Mac是否同一网段TraceEagle和Charles抢代理1. 一次只保留一个工具开全局代理2. 两个工具使用不同代理端口3. 用完一个就彻底退出7.3 几条值得记住的实操经验最后分享几个我摸了多年抓包工具后的真实体会。第一抓包前先想清楚流量走向。你问“怎么抓不到包”之前先在脑子里过一遍我的流量到底经过了这台电脑吗如果App走的是自己的长连接、不走系统代理那Charles装得再对也看不到。第二遇到“抓不到”先恢复原状再排查。把代理关掉看原本的网络是否正常。正常说明是代理链路的问题不正常说明系统设置已经被改坏了。这种二分法能把问题迅速缩小到“你改了什么”这个范围内。第三别过度依赖破解和汉化。工具出问题的时候你连“是软件被改坏了”还是“自己配置错了”都分不清楚那是最浪费时间的。第四抓包工具是调试手段不是调试目的。很多问题其实不需要抓包就能推理出来但抓包能帮你快速排除变量。工具再多最终还是看你有没有把一层一层的流量逻辑梳理清楚。梳理久了你拿到任何一个新工具的都只要十分钟上手因为它们解决的是同一类问题。
返回列表