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 满足任一条件
我的习惯: 调试 Zigbee 或 BLE 时,我经常用 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 怎么用

  1. 选中一个感兴趣的包
  2. 右键 → Follow → TCP/UDP/HTTP Stream
  3. 在弹出窗口里看完整对话

我曾经用这个功能抓到一个 CoAP 协议的漏洞。设备发了一个 POST 请求,服务器返回了 4.00 Bad Request,但返回体里居然带了完整的堆栈信息。嗯,这明显是生产环境没关调试模式。

3.2.2 多流对比

Wireshark 支持同时打开多个追踪流窗口。我建议你把正常设备和异常设备的流并排对比,差异一目了然。

避坑指南: 我曾经在追踪 MQTT 的 PUBLISH 包时,发现数据内容被截断了。后来才意识到,Wireshark 默认只显示 256 字节。记得在 Edit → Preferences → Protocols → MQTT 里把 "Show MQTT payload as" 改成 "Raw",并调大显示长度。

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 请求
注意: 专家信息不是万能的。它只能识别 Wireshark 已知的协议异常。对于物联网私有协议,它基本帮不上忙。这时候就需要自定义 Lua 解析器了。

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" → 然后通过菜单加载脚本
我的建议: 调试阶段用临时加载,改完脚本不用重启 Wireshark,重新加载一下就行。正式用的时候再放到全局目录。

3.7 本章知识体系

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个操作地图:

Wireshark 进阶功能知识体系 Wireshark 进阶 显示过滤器 追踪流 IO 图 专家信息 着色规则 Lua 解析器 核心工作流 1. 抓包 → 2. 用显示过滤器缩小范围 3. 用追踪流还原对话 → 4. 用 IO 图看流量趋势 5. 用专家信息快速定位异常 → 6. 用着色规则标记关键包 7. 遇到私有协议 → 写 Lua 解析器

这六个功能,你不需要一次全学会。我建议你从显示过滤器和追踪流开始,这两个最常用。等熟练了,再慢慢加上 IO 图和专家信息。着色规则和 Lua 解析器属于进阶中的进阶,但一旦用上,就回不去了。

嗯,这一章的内容就到这。记住,工具是死的,思路是活的。多动手,多踩坑,你自然就成专家了。