抓包环境搭建:工欲善其事,必先利其器

做网络分析,说白了就是跟数据包打交道。你连抓包工具都不会配,那后面的分析根本无从谈起。这一章,我把日常工作中最常用的四套环境给你捋一遍。Wireshark、Fiddler、Chrome DevTools 的 Network 面板,还有 curl 命令行。每一样都有它的脾气,也有它的妙用。

核心思路:抓包工具不是越全越好,而是要在对的地方用对的工具。Wireshark 看全局,Fiddler 管 HTTPS,Chrome 查前端,curl 做快速验证。四者互补,缺一不可。

抓包环境工具矩阵 抓包环境工具矩阵 HTTP 抓包分析 Wireshark Fiddler Chrome Network curl 各工具定位 • Wireshark:网卡级全量抓包,适合 TCP/IP 底层分析 • Fiddler:应用层代理抓包,HTTPS 解密是强项 • Chrome Network:前端调试利器,请求瀑布图一目了然 • curl:命令行快速验证,脚本化测试首选

2.1 Wireshark 的安装与配置

Wireshark 是抓包界的瑞士军刀。我入行那会儿还在用 Ethereal,后来改名叫 Wireshark,但内核一直没变——它直接接管网卡,把经过的所有数据包都给你看个底朝天。

安装要点

  • Windows:去官网下载安装包,一路 Next。注意勾选「Install WinPcap」或「Npcap」,这是抓包驱动,不装的话 Wireshark 就是个空壳。
  • macOS:用 Homebrew 最省事——brew install wireshark。装完记得把当前用户加到 access_bpf 组,否则抓不了包。
  • Linux:sudo apt install wireshark 或 yum install wireshark。安装时会问是否允许非 root 用户抓包,我建议选「是」,省得每次都要 sudo。

避坑指南:我曾经在 CentOS 上装完 Wireshark 发现抓不到包,折腾了半天才发现是 SELinux 把抓包权限给拦了。如果你在 Linux 上遇到类似问题,先检查 getenforce,临时关掉试试看。

基础配置

装好之后,别急着抓包。先做两件事:

  1. 设置捕获过滤器:只抓你关心的流量。比如只抓 HTTP 和 HTTPS:tcp port 80 or tcp port 443。不然你打开 Wireshark,满屏都是 ARP 和广播包,看着就头疼。
  2. 配置显示过滤器:捕获之后过滤用的。比如只看 GET 请求:http.request.method == "GET"。这个后面会细讲,你先知道有这么个东西就行。
# 常用捕获过滤器示例
# 只抓本机与 192.168.1.1 的通信
host 192.168.1.1

# 只抓 HTTP 流量
tcp port 80

# 排除 SSH 流量,避免干扰
not tcp port 22

2.2 Fiddler 的安装与配置

Fiddler 跟 Wireshark 不一样。它是个代理,不是直接抓网卡。你想想看,代理意味着什么?意味着它能解密 HTTPS,能篡改请求,能断点调试。Wireshark 做不到这些。

安装与 HTTPS 解密

Fiddler 安装很简单,但 HTTPS 解密需要手动配一下:

  1. 打开 Fiddler,点击 Tools → Options → HTTPS。
  2. 勾选 Capture HTTPS CONNECTs 和 Decrypt HTTPS traffic。
  3. 第一次会弹出证书安装提示,点「Yes」。Fiddler 会生成一个根证书,装到你的系统里。
  4. 如果你要抓移动端,还需要把证书导出到手机上。在 Fiddler 里点 Actions → Export Root Certificate to Desktop,然后通过邮件或扫码传到手机安装。

个人经验:我习惯在 Fiddler 里设置一个「AutoResponder」规则。比如把某个接口的响应改成固定值,用来测试前端的异常处理。这个功能在调试支付回调时特别好用,不用真的去触发一笔交易。

Fiddler 的局限

功能 Wireshark Fiddler
抓包层级 网卡级(L2-L7) 应用层(L7)
HTTPS 解密 需要预置私钥 自动中间人解密
请求篡改 不支持 支持断点修改
性能开销 较低 较高(代理模式)

2.3 Chrome 开发者工具 Network 面板

说实话,我日常调试前端接口,用得最多的就是 Chrome 的 Network 面板。它不需要安装,按 F12 就出来了。Wireshark 和 Fiddler 虽然强大,但查个简单的请求响应,没必要杀鸡用牛刀。

核心功能一览

  • 请求列表:所有网络请求按时间顺序排列。状态码、协议、耗时、大小,一目了然。
  • 瀑布图(Waterfall):每个请求的各个阶段耗时。TTFB、DNS 查询、TCP 握手、SSL 协商,鼠标悬停就能看到。
  • 请求详情:Headers、Payload、Preview、Response、Timing 五个标签页。Headers 看请求头和响应头,Payload 看 POST 参数,Preview 看格式化后的 JSON。
  • 过滤器:按类型过滤(XHR、JS、CSS、Img、Font 等)。我经常只勾选 XHR,只看 Ajax 请求。

实用技巧:右键点击请求列表的表头,可以自定义显示列。我一般会加上「Protocol」和「Connection ID」,这样能快速看出哪些请求复用了同一个 TCP 连接。

进阶用法

Network 面板里有个「Preserve log」选项,默认是关闭的。页面跳转时,之前的请求记录会被清空。如果你要分析页面跳转前后的请求,记得勾上它。

还有一个「Disable cache」选项,调试时勾上,浏览器就不会从缓存里读数据。嗯,这个在开发阶段几乎必开。

2.4 curl 命令行工具基础

curl 是命令行下的瑞士军刀。没有图形界面,但胜在轻量和可脚本化。我写自动化测试脚本时,几乎离不开它。

常用命令速查

# 最基本的 GET 请求
curl https://api.example.com/users

# 带请求头的 GET
curl -H "Authorization: Bearer token123" https://api.example.com/users

# POST 请求,发送 JSON 数据
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name":"张三","age":30}'

# 查看响应头(-i 或 -I)
curl -I https://api.example.com/users

# 跟随重定向(-L)
curl -L http://example.com

# 保存响应到文件(-o)
curl -o response.json https://api.example.com/users

避坑指南:我曾经用 curl 调试一个接口,死活返回 400。后来发现是 POST 请求的 Content-Type 没设置,curl 默认用 application/x-www-form-urlencoded,而服务端只认 JSON。加上 -H "Content-Type: application/json" 就好了。

curl 与抓包结合

curl 有个 -v 参数,可以输出详细的通信过程。包括 SSL 握手、请求头、响应头。虽然不如 Wireshark 详细,但快速排查问题时非常有用。

# 查看完整通信过程
curl -v https://api.example.com/users

# 输出示例(部分)
# *   Trying 93.184.216.34:443...
# * Connected to api.example.com (93.184.216.34) port 443 (#0)
# * SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305
# > GET /users HTTP/1.1
# > Host: api.example.com
# > User-Agent: curl/7.68.0
# > Accept: */*
# >
# * Mark bundle as not supporting multiuse
# < HTTP/1.1 200 OK
# < Content-Type: application/json
# < Content-Length: 42
# <
# [{"id":1,"name":"张三"}]

看到没?> 开头的是请求,< 开头的是响应。这个输出格式,跟 Wireshark 里看到的 HTTP 报文几乎一模一样。说白了,curl 就是命令行版的 HTTP 调试器。

注意:curl 默认不验证 HTTPS 证书的严格性。如果你用 -k 参数,会跳过证书验证。这在测试环境没问题,但生产环境千万别这么干,容易被中间人攻击。