3. Wireshark进阶:显示过滤器语法、追踪流、IO图、专家信息、着色规则、自定义Lua解析器
Wireshark 这东西,很多人用了好几年,其实只用了 20% 的功能。剩下的 80%,才是真正拉开差距的地方。今天我就把这 80% 里的核心部分——显示过滤器、追踪流、IO 图、专家信息、着色规则,还有自定义 Lua 解析器——给你捋一遍。
说白了,抓包只是第一步。怎么从海量数据里快速找到你要的东西,才是真本事。我见过太多人抓了一堆包,然后盯着屏幕发呆,不知道从哪下手。嗯,看完这一章,你应该不会再犯这个错了。
3.1 显示过滤器:不只是简单的表达式
捕获过滤器是抓之前用的,显示过滤器是抓之后用的。这个区别,我刚开始学的时候也搞混过。显示过滤器最大的好处是——它不丢包。所有数据都在,只是你看不到而已。
3.1.1 基础语法速查
| 操作 | 示例 | 说明 |
|---|---|---|
| 等于 | ip.addr == 192.168.1.1 |
匹配源或目标 IP |
| 不等于 | !ip.addr == 192.168.1.1 |
排除特定 IP |
| 包含 | frame contains "hello" |
在原始字节中搜索字符串 |
| 匹配正则 | frame matches "^[A-Z]" |
正则表达式匹配 |
| 逻辑与 | ip.src==1.1.1.1 and tcp.port==80 |
同时满足两个条件 |
| 逻辑或 | ip.src==1.1.1.1 or ip.dst==1.1.1.1 |
满足任一条件 |
btle.data_header.length > 0 来过滤掉空包。空包在物联网场景里特别多,不滤掉根本没法看。
3.1.2 进阶技巧:字段存在性检查
有时候你不需要匹配具体值,只需要知道某个字段存不存在。比如:
wlan.fc.type_subtype == 0x08 // 只看 Beacon 帧
icmp // 只看 ICMP 包
tcp.analysis.flags // 只看有问题的 TCP 包
这个 tcp.analysis.flags 我特别喜欢用。有一次排查一个 MQTT 断连问题,就是靠它快速定位到 TCP 重传率过高。你想想看,如果没有这个过滤器,你得在几千个包里一个个翻,多累。
3.2 追踪流:把对话还原出来
追踪流(Follow Stream)是我用得最多的功能之一。它能把一次完整的 TCP 或 UDP 会话还原成纯文本、Hex 或原始数据。对于物联网协议来说,这简直是神器。
3.2.1 怎么用
- 选中一个感兴趣的包
- 右键 → Follow → TCP/UDP/HTTP Stream
- 在弹出窗口里看完整对话
我曾经用这个功能抓到一个 CoAP 协议的漏洞。设备发了一个 POST 请求,服务器返回了 4.00 Bad Request,但返回体里居然带了完整的堆栈信息。嗯,这明显是生产环境没关调试模式。
3.2.2 多流对比
Wireshark 支持同时打开多个追踪流窗口。我建议你把正常设备和异常设备的流并排对比,差异一目了然。
3.3 IO 图:一眼看出流量异常
IO 图(IO Graph)把时间轴上的流量密度可视化。说白了,就是看哪个时间段流量大、哪个时间段流量小。对于物联网设备来说,这能帮你快速发现心跳包丢失、批量重传、或者 DDoS 攻击。
3.3.1 配置要点
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Interval | 1 sec | 物联网场景建议用 1 秒,太细了看不清趋势 |
| Unit | Packets/Tick | 看包数量;如果看带宽用 Bytes/Tick |
| Display Filter | 自定义 | 可以叠加多条曲线对比 |
我习惯在 IO 图里叠加三条曲线:正常流量(蓝色)、重传包(红色)、错误包(橙色)。如果红色曲线突然飙升,那基本可以断定网络有问题了。
3.4 专家信息:Wireshark 帮你分析
专家信息(Expert Info)是 Wireshark 内置的智能分析引擎。它会自动标记出异常、警告、注意和聊天级别的信息。你不需要自己一条条看,它帮你筛好了。
3.4.1 怎么看
菜单栏 → Analyze → Expert Info。你会看到一个按严重程度分级的列表:
- Error(红色): 比如 TCP 校验和错误、IP 分片丢失
- Warning(黄色): 比如 TCP 重传、重复 ACK
- Note(蓝色): 比如 TCP 窗口更新、连接建立
- Chat(灰色): 普通信息,比如 HTTP 请求
3.5 着色规则:让异常自己跳出来
着色规则(Coloring Rules)是我个人非常依赖的功能。它根据你设定的条件,给不同种类的包上色。比如:
- TCP 重传 → 红色背景
- ARP 请求 → 紫色背景
- MQTT PUBLISH → 绿色背景
- DNS 查询 → 浅蓝色背景
设置方法:View → Coloring Rules → 新建。我建议你至少配 5-6 条常用规则,尤其是针对你经常调试的协议。
有一次我在现场调试一个 Zigbee 网关,设备每隔 30 秒就掉线一次。我打开着色规则,一眼就看到所有掉线时刻都对应着红色的 TCP RST 包。原来是网关的 TCP keepalive 设置太短,被运营商中间设备踢掉了。
3.6 自定义 Lua 解析器:搞定私有协议
物联网里私有协议太多了。Wireshark 不认识怎么办?自己写一个 Lua 解析器。别怕,其实没那么难。
3.6.1 一个最简单的例子
假设你的设备发的是自定义格式:0xAA 0x55 [长度] [类型] [数据...] 0x0D 0x0A
-- my_proto.lua
local my_proto = Proto("my_proto", "My Custom Protocol")
local f_len = ProtoField.uint8("my_proto.len", "Length", base.DEC)
local f_type = ProtoField.uint8("my_proto.type", "Type", base.DEC)
local f_data = ProtoField.bytes("my_proto.data", "Data")
my_proto.fields = { f_len, f_type, f_data }
function my_proto.dissector(buffer, pinfo, tree)
pinfo.cols.protocol = "MY_PROTO"
local subtree = tree:add(my_proto, buffer(0, buffer:len()))
subtree:add(f_len, buffer(0, 1))
subtree:add(f_type, buffer(1, 1))
local data_len = buffer(0,1):uint()
subtree:add(f_data, buffer(2, data_len))
end
local udp_table = DissectorTable.get("udp.port")
udp_table:add(8888, my_proto)
保存为 my_proto.lua,放到 Wireshark 的 plugins 目录下。重启后,UDP 8888 端口的数据就会自动用你的解析器来解析。
3.6.2 加载方式
有两种方式:
- 全局加载: 放到
%APPDATA%/Wireshark/plugins/(Windows)或~/.local/lib/wireshark/plugins/(Linux) - 临时加载: Analyze → Enabled Protocols → 输入 "lua" → 勾选 "Lua" → 然后通过菜单加载脚本
3.7 本章知识体系
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个操作地图:
这六个功能,你不需要一次全学会。我建议你从显示过滤器和追踪流开始,这两个最常用。等熟练了,再慢慢加上 IO 图和专家信息。着色规则和 Lua 解析器属于进阶中的进阶,但一旦用上,就回不去了。
嗯,这一章的内容就到这。记住,工具是死的,思路是活的。多动手,多踩坑,你自然就成专家了。