3. 抓包基础:过滤器的使用与关键字段识别
说实话,很多新手拿到 Wireshark 第一反应就是点「开始捕获」,然后看着满屏花花绿绿的包发呆。我当年也是这样,抓了十分钟,眼睛都看花了,就是找不到自己要的那个包。
其实啊,抓包这活儿,80% 的时间不是在「抓」,而是在「筛」。你想想看,一个正常的 WiFi 环境,每秒少说几十个包在飞。广播包、组播包、ARP、DNS、Beacon……全混在一起。不学会用过滤器,你就是在垃圾堆里找钻石。
3.1 捕获过滤器 vs 显示过滤器
Wireshark 给了我们两把筛子,很多人搞混了。我直接给你画个对比表,一目了然。
| 对比项 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 作用时机 | 抓包之前,网卡层面 | 抓包之后,软件层面 |
| 语法 | BPF(Berkeley Packet Filter) | Wireshark 自己的显示过滤语法 |
| 性能 | 高,不想要的包根本不进内存 | 低,所有包都抓了再筛 |
| 典型场景 | 只抓 UDP 端口 12345 的包 | 在已抓的包里找特定 MAC 地址 |
| 能否修改 | 不能,抓完就定了 | 可以,随时改,随时看 |
我的习惯:现场排查时,我一般先用捕获过滤器把范围缩窄,比如只抓某个端口或某个 IP 段的包。这样文件小,回头分析也快。但如果是做全量取证,那就先全抓,再用显示过滤器慢慢翻。
3.2 捕获过滤器:BPF 语法速成
BPF 语法看着唬人,其实核心就几个套路。我把它拆成三块,你照着写就行。
3.2.1 基础三要素
- host:按 IP 地址过滤。比如
host 192.168.1.100 - port:按端口过滤。比如
port 80 - proto:按协议过滤。比如
udp、tcp、arp
3.2.2 组合与取反
- and(或 &&):同时满足。比如
udp and port 12345 - or(或 ||):满足其一。比如
host 192.168.1.1 or host 192.168.1.2 - not(或 !):排除。比如
not arp
3.2.3 实战例子
# 只抓 WiFi 配网广播包(假设端口 12345)
udp and port 12345
# 抓某个设备发出的所有包
host 192.168.1.100
# 抓广播包,排除 ARP
udp and not arp
# 抓两个设备之间的通信
host 192.168.1.100 and host 192.168.1.1
我曾经踩过的坑:有一次在现场抓配网丢包,我用了
udp port 12345 的捕获过滤器,结果发现抓到的包数量不对。后来才意识到,配网过程中设备会先发 ARP 探测,再发 UDP 数据。我把 ARP 过滤掉了,等于丢掉了前半段的关键信息。所以啊,如果你不确定流程,先别急着过滤,全抓再说。
3.3 显示过滤器:Wireshark 的瑞士军刀
显示过滤器才是真正的大头。捕获过滤器是「进门前先筛一遍」,显示过滤器是「进门后随便翻」。我平时 90% 的时间都在跟显示过滤器打交道。
3.3.1 常用过滤表达式
| 过滤目标 | 表达式 | 说明 |
|---|---|---|
| 只看 UDP 包 | udp |
最基础 |
| 只看广播包 | eth.dst == ff:ff:ff:ff:ff:ff |
目标 MAC 全 F |
| 只看组播包 | eth.dst[0] & 1 |
最低位为 1 就是组播 |
| 只看某个 IP | ip.addr == 192.168.1.100 |
源或目标都行 |
| 只看某个端口 | udp.port == 12345 |
源或目标端口 |
| 只看特定长度 | frame.len > 100 |
过滤小包或大包 |
3.3.2 组合与取反
显示过滤器的组合逻辑跟 BPF 差不多,但写法更灵活。
# 广播包 + 特定端口
eth.dst == ff:ff:ff:ff:ff:ff and udp.port == 12345
# 排除某个 IP
!ip.addr == 192.168.1.1
# 源 IP 是 A,目标 IP 是 B
ip.src == 192.168.1.100 and ip.dst == 192.168.1.1
核心技巧:在 Wireshark 里,你右键点击某个字段,选择「作为过滤器应用」或「准备过滤器」,它会自动帮你生成过滤表达式。我刚开始学的时候,全靠这个功能反推语法。你试试看,点几下就明白了。
3.4 关键字段识别:WiFi 配网广播包长什么样
好了,过滤器会用之后,咱们得知道要盯哪些字段。WiFi 配网广播包,说白了就是设备在局域网里大喊:「我在这!谁来给我配网?」
我以最常见的 ESP-Touch 配网为例,给你拆解一下关键字段。
3.4.1 以太网层(Ethernet II)
- 目标 MAC:
ff:ff:ff:ff:ff:ff(广播)或组播 MAC - 源 MAC:发送设备的 MAC 地址
- 类型:
0x0800(IPv4)
3.4.2 IP 层
- 源 IP:发送设备的 IP
- 目标 IP:
255.255.255.255(广播)或组播 IP - 协议:
17(UDP)
3.4.3 UDP 层
- 源端口:通常是随机高位端口
- 目标端口:配网约定的端口,比如 12345
- 长度:数据部分长度
3.4.4 应用层(Payload)
这里才是配网的核心数据。ESP-Touch 会把 WiFi 的 SSID 和密码编码在 UDP 数据的特定位置。不同厂商的编码方式不一样,但套路都差不多:长度、序号、数据块、校验。
我建议你这样练:打开一个抓包文件,先用
eth.dst == ff:ff:ff:ff:ff:ff and udp.port == 12345 过滤。然后点开一个包,从上到下逐层展开,对照我上面说的字段,一个一个看。看个十来个包,你就条件反射了。
3.5 本章知识体系
下面这张图,把过滤器的分类、语法、关键字段串起来了。你保存下来,以后用的时候直接看。
3.6 避坑指南:过滤器常见翻车现场
最后,我把自己这些年踩过的坑,列几个最常见的,你遇到了直接对照。
- 捕获过滤器写错了,包没抓到——比如把
port写成ports,Wireshark 不会报错,但就是不生效。我建议你在「捕获选项」里点一下「编译 BPF」,它会告诉你语法对不对。 - 显示过滤器大小写搞混——Wireshark 的字段名是区分大小写的。比如
eth.dst是对的,ETH.DST就不行。我一般直接复制,不手打。 - 广播包没抓到,以为是丢包——有时候你的网卡没开混杂模式,广播包根本进不来。你检查一下 Wireshark 的捕获选项,确保「混杂模式」是勾上的。
- 过滤条件太严格,啥都看不到——比如你同时加了
ip.src和ip.dst,但方向搞反了,结果一个包都匹配不上。这时候先放宽条件,比如只写ip.addr,看看有没有数据。
嗯,这里要特别提醒:如果你在抓配网广播包,记得把手机或电脑的防火墙关掉。有些防火墙会拦截广播包,导致 Wireshark 根本收不到。我遇到过好几次,折腾半天,最后发现是防火墙在捣乱。