3. Wireshark 基础操作:捕获过滤器与显示过滤器、着色规则、追踪流功能
好,咱们进入实操环节。这一章我带你搞定 Wireshark 最核心的四个基础操作:捕获过滤器、显示过滤器、着色规则和追踪流。这四个东西你玩熟了,后面解密 HTTPS 才能看得清、抓得准。
说实话,我见过太多新手一上来就点「开始捕获」,结果抓了一堆乱七八糟的广播包,自己都看晕了。嗯,咱们别走弯路,一个一个来。
3.1 捕获过滤器:在数据进门之前就筛掉垃圾
捕获过滤器是在 Wireshark 开始抓包之前就设置好的。它的好处是——不想要的包压根不进内存。这对大流量环境特别重要。
我个人习惯在抓生产环境流量时,一定先用捕获过滤器把范围锁死。否则你抓 5 分钟,内存就爆了。
3.1.1 语法规则
捕获过滤器用的是 BPF(Berkeley Packet Filter) 语法,核心套路是:
协议 方向 类型 值
举个例子:
| 需求 | 捕获过滤器表达式 |
|---|---|
| 只抓 192.168.1.1 的流量 | host 192.168.1.1 |
| 只抓 80 端口(HTTP) | port 80 |
| 只抓 443 端口(HTTPS) | port 443 |
| 抓某个网段的流量 | net 10.0.0.0/8 |
| 排除某个 IP | not host 192.168.1.100 |
| 组合条件(且) | host 192.168.1.1 and port 443 |
https_only、dns_only、my_server,下次直接选,不用重新敲。
3.1.2 实战场景
假设你要分析某台 Web 服务器的 HTTPS 流量。你只想抓 443 端口,而且只关心一个客户端 IP。我会这么写:
host 10.0.0.5 and port 443
这样 Wireshark 从网卡驱动层就开始过滤,性能开销极小。我曾经在千兆链路上这么干过,CPU 占用率不到 10%。
3.2 显示过滤器:在数据进门之后精准定位
显示过滤器是 Wireshark 的灵魂。它不影响已经抓到的包,只是帮你从一堆数据里挑出你想要的。
说白了,捕获过滤器是「保安」,显示过滤器是「检索员」。保安在门口拦人,检索员在档案室里翻资料。
3.2.1 常用表达式
显示过滤器的语法比捕获过滤器丰富得多,因为它能深入到协议字段级别。下面是我日常最常用的一些:
| 需求 | 显示过滤器表达式 |
|---|---|
| 只看 HTTP 流量 | http |
| 只看 HTTPS(TLS) | tls 或 ssl |
| 只看某个 IP 的流量 | ip.addr == 192.168.1.1 |
| 只看某个 TCP 端口 | tcp.port == 443 |
| 只看某个 HTTP 请求方法 | http.request.method == "GET" |
| 只看 TLS 握手包 | tls.handshake.type == 1 |
| 组合条件(且) | ip.addr == 10.0.0.5 and tcp.port == 443 |
| 组合条件(或) | http or dns |
- 捕获过滤器:
host 10.0.0.1(BPF 语法,无等号) - 显示过滤器:
ip.addr == 10.0.0.1(Wireshark 语法,有等号)
3.2.2 我的排错经验
有一次线上 HTTPS 连接超时,我抓了包,用 tls.handshake.type == 1 只看 Client Hello,发现客户端发出去的 SNI 字段是空的。嗯,问题找到了——是应用层代码忘了配 SNI。你看,一个过滤器就省了半小时排查时间。
3.3 着色规则:一眼看出异常
Wireshark 默认会给不同协议涂上颜色。比如 HTTP 是绿色,TCP 是紫色,DNS 是蓝色。但你也可以自定义。
我个人习惯把错误包、重传包、TLS 握手包单独着色。这样在包列表里扫一眼,就能发现异常。
3.3.1 默认着色规则速查
| 颜色 | 含义 |
|---|---|
| 浅紫色 | TCP 流量 |
| 浅蓝色 | UDP 流量 |
| 绿色 | HTTP 流量 |
| 黄色 | DNS 流量 |
| 红色 | TCP 重传或错误 |
| 黑色 | TCP 乱序或丢包 |
3.3.2 自定义着色规则
我建议你加一条:把 TLS 握手包标成亮橙色。操作路径:
- 点击「视图」→「着色规则」
- 点击「新建」
- 名称填:
TLS Handshake - 过滤器填:
tls.handshake.type - 选一个亮橙色背景
这样一来,HTTPS 握手的几个包在列表里一目了然。我在讲课时经常用这个功能,学生一眼就能看出「哦,原来 TLS 握手就这几个包」。
3.4 追踪流功能:还原完整对话
这个功能我太喜欢了。它能把你抓到的零散包拼成一次完整的对话。比如 HTTP 请求和响应,原本分散在几十个包里,点一下「追踪流」,就能看到完整的请求头和响应体。
3.4.1 怎么用
- 在包列表里选中任意一个 HTTP 或 TCP 包
- 右键 → 「追踪流」 → 「TCP 流」或「HTTP 流」
- 弹出一个新窗口,显示完整的对话内容
对于 HTTPS,因为内容是加密的,追踪流只能看到乱码。但别急——等我们后面章节导入了密钥,就能看到明文了。
3.4.2 实际案例
我曾经帮一个同事排查 API 调用失败的问题。他用 Wireshark 抓了包,但看不懂。我过去点了一下「追踪流」→「HTTP 流」,直接看到了服务器返回的 500 错误和错误堆栈。前后不到 10 秒。
3.5 本章知识体系总览
下面这张图帮你理清这四个功能的关系和适用场景:
3.6 避坑指南
最后分享几个我踩过的坑:
- 捕获过滤器写错了不会报错——Wireshark 只是默默不抓包。你盯着空列表发呆半天,不如检查一下过滤器语法。
- 显示过滤器区分大小写——
HTTP和http不一样。我建议全用小写。 - 着色规则优先级——多条规则匹配同一个包时,排在上面的生效。所以把重要的规则放前面。
- 追踪流别乱点——如果你抓了 10 万包,点「追踪流」可能会卡几秒。先加个显示过滤器缩小范围再点。
好了,这四个基础操作你掌握了吗?后面章节我们会频繁用到它们。尤其是显示过滤器和追踪流,在解密 HTTPS 时几乎是每步必用。