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 本章知识体系

下面这张图,把过滤器的分类、语法、关键字段串起来了。你保存下来,以后用的时候直接看。

抓包过滤器与关键字段识别 捕获过滤器(BPF) 显示过滤器(Display Filter) 三要素:host / port / proto 组合:and / or / not 典型:udp and port 12345 常用:eth.dst / ip.addr / udp.port 组合:and / or / not / ! 典型:eth.dst==ff:ff:ff:ff:ff:ff 配网广播包关键字段 MAC 层:广播地址 IP 层:255.255.255.255 UDP 层:目标端口 Payload:SSID/密码 提示:右键点击字段 → 「作为过滤器应用」可自动生成过滤表达式

3.6 避坑指南:过滤器常见翻车现场

最后,我把自己这些年踩过的坑,列几个最常见的,你遇到了直接对照。

  1. 捕获过滤器写错了,包没抓到——比如把 port 写成 ports,Wireshark 不会报错,但就是不生效。我建议你在「捕获选项」里点一下「编译 BPF」,它会告诉你语法对不对。
  2. 显示过滤器大小写搞混——Wireshark 的字段名是区分大小写的。比如 eth.dst 是对的,ETH.DST 就不行。我一般直接复制,不手打。
  3. 广播包没抓到,以为是丢包——有时候你的网卡没开混杂模式,广播包根本进不来。你检查一下 Wireshark 的捕获选项,确保「混杂模式」是勾上的。
  4. 过滤条件太严格,啥都看不到——比如你同时加了 ip.src 和 ip.dst,但方向搞反了,结果一个包都匹配不上。这时候先放宽条件,比如只写 ip.addr,看看有没有数据。
嗯,这里要特别提醒:如果你在抓配网广播包,记得把手机或电脑的防火墙关掉。有些防火墙会拦截广播包,导致 Wireshark 根本收不到。我遇到过好几次,折腾半天,最后发现是防火墙在捣乱。