3、抓包环境搭建:Wireshark安装与配置、tcpdump基础、代理工具(Charles/Fiddler)介绍
做交易所协议分析,第一步不是看代码,而是先把「眼睛」装好。
抓包工具就是我们的眼睛。没有它,网络流量对你来说就是一团黑盒。我见过不少新手,上来就对着代码死磕,结果连请求是HTTP还是WebSocket都没搞清楚。嗯,这其实挺浪费时间的。
这一章,我会带你搭好三套工具:Wireshark(图形化抓包之王)、tcpdump(命令行利器)、以及Charles/Fiddler(HTTP/HTTPS代理神器)。这三样东西,基本覆盖了交易所协议分析的所有场景。
核心观点:抓包工具不是越复杂越好,关键是「用对地方」。Wireshark适合深度分析,tcpdump适合服务器端快速取证,代理工具适合调试HTTPS加密流量。
3.1 Wireshark:图形化抓包与分析
Wireshark是我用得最多的工具,没有之一。它的强大之处在于——你能看到每一比特的流动。
3.1.1 安装与初始配置
安装没什么好说的,去官网下载对应版本就行。但我建议你注意两点:
- 安装时勾选「WinPcap」或「Npcap」——这是底层驱动,不装的话抓不到包。我记得有一次帮同事排查问题,折腾了半天才发现他没装驱动。
- 启动后立刻做一件事:进入
Edit → Preferences → Appearance → Columns,把默认的「Time」改成「Time of Day」。为什么?因为看相对时间容易晕,看绝对时间才能跟日志对上号。
小技巧:抓交易所的包,建议先设置一个捕获过滤器。比如只抓目标端口为443的流量:port 443。这样可以避免被无关流量淹没。
3.1.2 过滤器语法——必须掌握
Wireshark的过滤器分两种:捕获过滤器和显示过滤器。前者在抓包时生效,后者在抓完后过滤。
我个人习惯用显示过滤器更多一些,因为灵活。下面几个是我在分析交易所协议时最常用的:
# 只看某个IP的流量
ip.addr == 192.168.1.100
# 只看HTTP请求(交易所很多API还是HTTP)
http.request
# 只看WebSocket流量(交易所行情推送常用)
websocket
# 只看TLS握手过程
tls.handshake.type == 1
# 组合过滤:某个IP的POST请求
ip.addr == 192.168.1.100 and http.request.method == "POST"
你想想看,如果没有过滤器,一个交易所的WebSocket连接可能每秒推送几百条行情数据,你根本找不到你要的登录请求。
3.1.3 追踪TCP流
这是Wireshark最实用的功能之一。右键点击任意一个TCP包,选择「Follow → TCP Stream」,Wireshark会自动把整个会话的请求和响应拼接起来。
我在分析某交易所的REST API时,经常用这个功能来还原完整的HTTP请求-响应交互。尤其是当协议有分片或重传时,手动拼简直要命。
注意:如果流量是HTTPS加密的,TCP流里看到的全是乱码。这时候就需要SSL/TLS解密了——要么导出密钥,要么用代理工具。
3.2 tcpdump:命令行下的抓包利器
说实话,Wireshark虽然好用,但在服务器上你没法装图形界面。这时候tcpdump就是你的救命稻草。
3.2.1 基础用法
tcpdump的语法其实很简单,核心就几个参数:
# 抓取eth0网卡的所有流量
tcpdump -i eth0
# 抓取指定端口的流量(交易所常用)
tcpdump -i eth0 port 443
# 抓取并保存到文件(方便后续分析)
tcpdump -i eth0 -w capture.pcap port 443
# 从文件读取并显示
tcpdump -r capture.pcap
我曾经在排查一个生产环境的延迟问题时,直接在交易所的服务器上跑了tcpdump,抓了30秒的包,然后拿回本地用Wireshark分析。整个过程不到5分钟就定位到了问题——是某个中间件的TCP窗口设置不合理。
3.2.2 BPF过滤器——tcpdump的灵魂
tcpdump的过滤器语法叫BPF(Berkeley Packet Filter)。它比Wireshark的捕获过滤器更底层,但效率极高。
# 只抓源IP为某地址的包
tcpdump src host 192.168.1.100
# 只抓SYN包(TCP三次握手的第一个包)
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
# 抓取特定长度范围的包(比如排除心跳包)
tcpdump 'len > 100'
实战经验:抓交易所的WebSocket流量时,我经常用 tcpdump -i any -s 0 -w ws.pcap port 443。这里的 -s 0 表示抓取完整包(不截断),因为WebSocket的Payload可能很大,截断了就看不到完整数据了。
3.3 代理工具:Charles与Fiddler
Wireshark和tcpdump虽然强大,但它们有个共同的短板——对HTTPS加密流量束手无策。除非你有服务器的私钥,否则只能看到一堆乱码。
这时候就需要代理工具出场了。它们通过中间人(MITM)的方式,在客户端和服务器之间充当「翻译官」,从而解密HTTPS流量。
3.3.1 Charles——我个人的首选
Charles是macOS上的神器,当然Windows也能用。它的核心功能是:
- SSL Proxying:安装Charles的根证书后,可以解密HTTPS流量
- 断点调试:可以拦截请求,修改后再发送
- 流量回放:可以重复发送某个请求,方便测试
我记得有一次分析某交易所的WebSocket握手过程,Charles直接帮我看到了Sec-WebSocket-Key和Sec-WebSocket-Accept的交互细节。这在Wireshark里需要手动解密TLS才能看到。
3.3.2 Fiddler——Windows用户的福音
Fiddler在Windows生态下更流行。它的功能和Charles类似,但有个独特优势——脚本扩展能力。你可以用C#或JavaScript写脚本,自动修改请求/响应。
// FiddlerScript示例:自动添加请求头
static function OnBeforeRequest(oSession: Session) {
if (oSession.HostnameIs("api.exchange.com")) {
oSession.oRequest["X-API-Key"] = "your-api-key";
}
}
这个功能在做自动化测试时特别有用。你可以让Fiddler自动给每个请求加上签名参数,省去手动计算的麻烦。
3.3.3 代理工具的配置要点
| 步骤 | Charles | Fiddler |
|---|---|---|
| 安装证书 | Help → SSL Proxying → Install Charles Root Certificate | Tools → Options → HTTPS → Decrypt HTTPS traffic |
| 配置代理 | Proxy → Proxy Settings → HTTP Proxy: 8888 | 默认端口8888,无需额外配置 |
| 移动端抓包 | 设置手机WiFi代理为电脑IP:8888,安装证书 | 同上,但需要开启「Allow remote computers to connect」 |
| 过滤域名 | 在「Sequence List」中右键 → Focus | 在Filters标签页设置Host过滤 |
安全提醒:代理工具的根证书一旦被恶意利用,可以解密你所有的HTTPS流量。所以用完记得关闭SSL Proxying,或者直接退出代理工具。我在公司内部培训时反复强调:Charles/Fiddler只在调试时开启,平时一定要关掉。
3.4 三套工具的选型建议
说了这么多,到底该用哪个?我的建议很简单:
- 本地开发调试:用Charles或Fiddler。HTTPS解密方便,还能断点修改请求。
- 服务器端问题排查:用tcpdump。轻量、无侵入、性能开销几乎可以忽略。
- 深度协议分析:用Wireshark。它的协议解析器覆盖了几乎所有已知协议,包括WebSocket、gRPC、甚至一些自定义协议。
说白了,这三样工具不是互斥的,而是互补的。我自己的习惯是:tcpdump负责采集,Wireshark负责分析,Charles负责调试。三管齐下,基本没有搞不定的协议。
本章小结:抓包环境搭建是协议分析的基础。Wireshark让你看得清,tcpdump让你抓得到,代理工具让你解得了。下一章我们会用这些工具,实际抓取交易所的API流量,看看真实的请求长什么样。