☰
Wireshark 802.11报文过滤实战:从帧类型到无线排障
2026/10/19 8:23:36 网站建设 项目流程

1. 先把802.11报文的结构摸透,过滤才有依据

1.1 三类帧的分工:管理帧、控制帧与数据帧

干无线排障,第一步永远是分帧。802.11 报文在 MAC 层分成三大类,这个分类直接决定了你后面打的所有过滤条件是否有效。很多人走到 Wireshark 里就凭感觉乱输关键词,结果过滤结果乱七八糟,根源就是没弄明白这三类帧的分工。

管理帧(Management,type = 0)负责建立和维护连接,像 Beacon 广播、Probe Request/Response、Authentication、Association、Deauthentication 全在这一类里。你平时判断一个 AP 存不存在、终端在不在扫描,靠的就是管理帧。控制帧(Control,type = 1)负责协调空口访问,包括 RTS、CTS、ACK、Block ACK 等等,它们短小密集、量大,却基本不携带业务信息,属于空口里的“调度系统”。数据帧(Data,type = 2)承载真正要传的内容,也就是我们熟悉的 TCP/IP 报文,但前提是它没被加密,或者你已经配好了解密密钥,否则看到的只是带加密头的一堆字段。

这三类帧在过滤时对应 Wireshark 里的wlan.type字段,分别用 0、1、2 表示。比如只想看业务流量,就先输入wlan.type == 2把管理帧和控制帧全丢掉;反过来想监控终端关联过程,就把wlan.type == 0单独拎出来。

1.2 每个大类下面还有子类型:Beacon、Deauth、Probe Request

光按大类分还不够,很多排障场景需要精确到某个子类型。管理帧内部就分成了十多种 subtype,这里列几个最常见的,先混个脸熟:

  • Beacon(subtype = 8):AP 周期性发送的广播,宣告自己的 SSID、信道、速率集、能力信息。
  • Probe Request(subtype = 4):终端主动发出的扫描请求,相当于“你在这儿吗?说句话”。
  • Probe Response(subtype = 5):AP 回应终端扫描。
  • Authentication(subtype = 11):Open System 或 Shared Key 认证流程。
  • Association Request(subtype = 0)/ Response(subtype = 1):终端申请接入、AP 回应接入结果。
  • Deauthentication(subtype = 12):强制断开,这个帧在无线攻击检测里尤其重要。
  • Disassociation(subtype = 10):解除关联,优雅程度比 Deauth 高一些。

Wireshark 里常见把 type 和 subtype 合并成一个字段显示,过滤时用的是wlan.fc.type_subtype,取值是十进制加十六进制混合的助记形式。例如 Beacon 可以写成wlan.fc.type_subtype == 0x08,Deauth 写成wlan.fc.type_subtype == 0x0c。记住这个规律,比死记硬背强得多:管理帧 subtype 一共 14 种,0 到 13,Wireshark 显示面板里你会看到类似“Type/Subtype: Beacon (8)”的文字,括号里的数字是十进制,而过滤时用十六进制加前缀 0x 即可。

1.3 无线排障与报文的特殊关系:为什么过滤是刚需

有线网络里抓包相对简单,交换机端口镜像一下,报文就是整段的以太网帧,过滤时看得清清楚楚。无线则完全是另一套逻辑:空口是半双工共享介质,一个信道范围内所有设备的报文都会“飞”到你的网卡上。我一开监听,可能同时抓到十几个 AP 的 Beacon、几十个终端的 Probe、数不清的 ACK 重传,第一感觉就是信息过载。

这种场景下过滤的作用就凸显出来了。它并不是简单地把包藏起来,而是让你从“空口全景”里快速收敛到目标,回答几个关键问题:这个 AP 的 Beacon 是否正常?某个终端能不能跟 AP 完成认证关联?空口里有没有大量异常 Deauth?某个区域的信号强度分布如何?这些问题的答案,全都藏在不同类型帧的组合里,没有过滤就等于大海捞针。

另外无线还有一个独特因素:抓包时带上 radiotap 头部,里面记录信道、速率、信号强度(RSSI)等射频信息。过滤条件不仅能看 802.11 MAC 头部,还能顺手把 radiotap 里的信号强度拿出来筛。这一点在弱覆盖排查里特别实用,后面我会专门讲。

2. 抓包前的前置条件:监听模式与工具准备

2.1 硬件与驱动:不是所有网卡都能监听

先泼一盆冷水:802.11 报文过滤再熟练,网卡不支持监听模式也无从谈起。普通网卡默认工作在站点模式(Managed),只会接收发给自己的帧,根本看不到空口里的 Beacon 和别人的协商过程。想丢掉网卡的“自私心”,得让无线网卡进入监听模式(Monitor Mode)。

判断网卡支不支持监听,Linux 下可以执行:

iw list | grep -A 20 "Supported interface modes"

输出里如果看到monitor,就说明硬件和驱动都支持。用 aircrack-ng 套件的话,sudo airmon-ng也能列出各接口状态。Windows 上就简单粗暴一些,Wireshark 的捕获选项中勾上“Monitor Mode”试试能不能抓到;抓不到管理帧,就得考虑网卡驱动的问题。我这些年踩过的坑里,十个里有八个是 USB 网卡虚标,标称支持监听,实际驱动一开就掉线,最后换了芯片方案才稳定。

2.2 开启监听模式的标准操作

在 Linux 上最省事的方式是借助 aircrack-ng 里的 airmon-ng:

sudo airmon-ng check kill sudo airmon-ng start wlan0

第一条命令会停掉可能干扰监听模式的进程,尤其 NetworkManager 这类会不断切换信道的服务。第二条把 wlan0 转入监听模式,成功后会生成一个叫 wlan0mon 的虚拟接口。也可以用更轻量的 iw 直接改接口类型:

sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up sudo iw dev wlan0 set channel 6

注意最后一条set channel很关键,监听模式下网卡只在一个固定信道上收包。如果你不锁信道,让它自己漫游跳频,那抓到的报文会支离破碎,过滤得再精准也白搭。

Wireshark 里开启捕获后,界面上有信道选择工具,可以把当前监听接口切换到指定信道。如果用的是自带无线管理功能的系统,切记先关掉系统的自动跳频机制,否则你会看到报文数量忽多忽少,统计结果毫无规律。

2.3 工具分工:Wireshark、TShark 与 tcpdump 怎么选

过滤这个动作本身哪个工具都能做,但不同场景效率差很多。我一般这样分工:

  • Wireshark:图形界面,适合做深度的交互式分析,输入过滤条件时还能自动提示、实时看到匹配数量。排障初期不知道问题在哪时,先在 Wireshark 里全局看一遍,再用过滤逐步收敛。
  • TShark:Wireshark 的无头版本,适合脚本化和批量处理。抓了几小时的 pcap 文件,写一条tshark -r capture.pcapng -Y "wlan.fc.type_subtype == 0x0c"就能把 Deauth 全导出来统计。
  • tcpdump:轻量级,适合远端设备或嵌入式环境直接抓包,也支持一些 802.11 捕获过滤器语法,只是分析功能弱一些。

关键提示

无线报文过滤建议“先抓后筛”。捕获过滤器确实能在源头减少落盘的报文量,但条件写死了以后,想查被丢弃的帧就没有任何办法。我自己的习惯是采集时只按接口和信道维度控制,文件大一点没关系,等数据落盘后再用显示过滤器精细处理,灵活度高出很多。

3. 两种过滤语法要分清:捕获过滤器与显示过滤器

3.1 捕获过滤器:在内核就拦截,减少磁盘占用

捕获过滤器用的是 BPF(Berkeley Packet Filter)语法,Wireshark 捕获选项里的“Capture Filter”就是它。它的优势是报文还在内核时就被筛掉,落盘的只有你感兴趣的部分,适合长时间监听或嵌入式环境里抓包,避免几十 GB 的日志把磁盘撑爆。

针对 802.11 报文,常见写法有这么几类:

wlan type mgt wlan type data wlan type mgt subtype beacon wlan type data subtype qos-data

这套语法能按type和subtype过滤,但缺点是相对死板,支持复杂条件拼接的能力有限。无线抓包时还有个大坑:控制帧本身可能由网卡驱动直接处理,根本不会上报给抓包程序,这时即使你写了wlan type ctl也可能收不到预期的 ACK。所以我平时很少依赖无线捕获过滤器,除非是在资源受限的设备上做长时间盲采。

3.2 显示过滤器:最常用的精细筛选体系

显示过滤器是 Wireshark 的灵魂。刚才tshark示例里用的-Y参数,就是显示过滤器。它是在报文已经落地后、在内存里做筛选,完全不丢帧。

先看最基本的四条:

  • 按帧类型:wlan.fc.type == 0(管理帧)、wlan.fc.type == 1(控制帧)、wlan.fc.type == 2(数据帧)
  • 按精确子类型:wlan.fc.type_subtype == 0x08
  • 按地址:wlan.sa == "xx:xx:xx:xx:xx:xx"(源地址)、wlan.da == "..."(目的地址)、wlan.bssid == "..."(BSSID)
  • 按无线局域网名称:wlan.ssid == "your_wifi_name"

组合条件用逻辑运算符,Wireshark 支持&&、||、!,也支持英文单词and or not。

一个常见误区是拿以太网的过滤思路套无线。比如有线里你习惯写ip.src == x.x.x.x,但在加密无线环境里,数据帧的 IP 层完全不可见,过滤条件必然落空。除非你已经在 Wireshark 的解密配置里填入了成对的 PMK 和无线局域网密码,并开启解密,否则只能过滤 MAC 层信息,这是无线过滤与有线过滤最本质的区别。

3.3 高频过滤表达式速查表

我把自己常用的表达式整理成一张表,贴在工位上,新手可以先抄着用:

需求显示过滤器表达式
只看 Beaconwlan.fc.type_subtype == 0x08
只看 Probe Requestwlan.fc.type_subtype == 0x04
只看 Deauthenticationwlan.fc.type_subtype == 0x0c
看认证与关联全过程wlan.fc.type_subtype == 0x0b || wlan.fc.type_subtype == 0x0c || wlan.fc.type_subtype == 0x00 || wlan.fc.type_subtype == 0x01
过滤某个 AP 的所有帧wlan.bssid == "a4:5e:60:xx:xx:xx"
过滤某个终端的非空口帧wlan.addr == "20:aa:bb:cc:dd:ee"
只看重传帧wlan.fc.retry == 1
剔除重传帧后统计wlan.fc.type == 2 && wlan.fc.retry == 0
按信号强度筛弱帧radiotap.dbm_antsignal < -75
排除某个 BSSID!wlan.bssid == "a4:5e:60:xx:xx:xx"

wlan.addr这个字段会同时匹配地址字段里的 BSSID、源地址、目的地址、接收地址、发射地址,写起来很省事。想更严谨就拆开写:wlan.sa == "..." \|\| wlan.da == "..." \|\| wlan.ra == "..." \|\| wlan.ta == "..."。

另外 Wireshark 支持把常用的过滤条件保存成带名字的过滤按钮,或做成显示过滤宏。我在一开始就把上表里的高频表达式存成了过滤按钮,点一下就能直接应用,不用每次敲长串条件。

4. 实战场景:从过滤到定位问题的完整路径

4.1 场景一:单独观察某个 AP 的全量交互

部署了新的 AP,总是担心它工作不正常,这时候目标是观察这个 AP 在所有信道上的空口行为。第一步先锁到 AP 所在信道,5GHz 和 2.4GHz 不要弄混,然后应用一条过滤:

wlan.bssid == "a4:5e:60:12:34:56"

这条条件下,你能看到该 BSSID 发出的 Beacon,也能看到终端发给它的 Probe Request、Authentication、Association,以及它回给终端的各种响应。Wireshark 统计菜单里的“Conversations”会被限定到该 BSSID 的流量,通过 IO Graph 还能按时间分布看 Beacon 间隔稳不稳定。

这里要留神一个细节:AP 的 2.4GHz 和 5GHz 频段通常对应不同的 BSSID(哪怕 SSID 相同)。只过滤 BSSID,会把另一个频段的流量排除在外,这是“少看了半边天”的典型来源。要对比双频,就得把两个 BSSID 都用上:wlan.bssid == "a4:5e:60:12:34:56" || wlan.bssid == "a4:5e:60:78:9a:bc"。

4.2 场景二:终端连接很慢,过滤出完整的关联过程

用户报障:连 WiFi 要转十几秒。这种问题光看平台日志很难确认是认证慢还是 DHCP 慢,最直接的办法就是抓包看关联过程。

先过滤出该终端地址相关的管理帧,把 Probe、Auth、Assoc 全部拉出来:

wlan.addr == "20:aa:bb:cc:dd:ee" && wlan.fc.type == 0

再配上时间列,逐步观察时间戳:Probe 发出后多久收到 Probe Response?Auth 请求之后 AP 有没有立刻回 Auth 响应?Associate Request 发出后,AP 是秒回还是卡了几秒?这些间隔一摆出来,问题发生在终端侧还是 AP 侧,基本就一目了然。

如果过滤之后发现只有 Authentication 帧,却没有后续的 Association Request,那怀疑点就该转移到 AP 的接入容量或认证服务器上。要是连 Probe Response 都收不到,大概率是信号覆盖或者 AP 根本没在工作。整个过程完全不需要看上层协议,几个管理帧的过滤就给出了方向。

4.3 场景三:空口异常与 Deauth 风暴的识别

无线环境里最让人头疼的干扰之一就是大量 Deauthentication 帧。有些是 AP 主动下发的正常断开,但短时间内密密麻麻出现 Deauth,就很可疑,常见于恶意干扰或设备老化误报。

过滤表达式极其简单:

wlan.fc.type_subtype == 0x0c

然后打开统计里的 IO Graph,把时间粒度调到毫秒级,看是否有瞬间井喷的尖峰。正常网络里 Deauth 应该是零星的;如果看到每秒几百甚至上千的 Deauth,条件直接指向空口异常。此时再叠加地址过滤,比如wlan.fc.type_subtype == 0x0c && wlan.sa == "aa:bb:cc:dd:ee:ff",就能找到发出异常 Deauth 的“罪魁祸首”。

另一种情况:发现多个 AP 都在广播同一个 SSID,但 BSSID 对不上。用这条过滤可以把未知发射源揪出来:

wlan.fc.type_subtype == 0x08 && wlan.ssid == "corp-wifi" && !wlan.bssid == "00:11:22:33:44:55"

排除掉自己的合法 BSSID,剩下的就是未经登记的邻居或伪造热点。

4.4 场景四:弱覆盖排查时用 RSSI 过滤

覆盖优化时,我常用的一个套路是把客户端附近抓到的所有 Beacon 按信号强度筛一遍。radiotap 头里带有dbm_antsignal字段,Wireshark 里可以直接拿它做条件:

wlan.fc.type_subtype == 0x08 && radiotap.dbm_antsignal < -75

数值低于 -75 dBm 时,可以认为是弱信号覆盖区域,配合过滤结果里出现的 BSSID 和信道,能快速判断现场是哪个 AP 覆盖不足。不过这里要提醒一句:不同网卡驱动的 radiotap 字段名略有差异,有的叫radiotap.dbm_antsignal,有的使用radiotap.signal_dbm。我第一次跨设备抓包时就因为字段名没对上,过滤结果一个包都不显示,所以换设备后第一件事是展开 radiotap 头部确认字段名。

5. 常见错误与排查实录:过滤器不生效时到底查什么

5.1 过滤器怎么敲都没结果,先排查这四件事

这是新手最容易崩溃的时刻:表达式明明照着教程抄的,却没有一条帧显示出来。按照我的经验,按顺序查这四件事:

  1. 字段名拼写与大小写。Wireshark 字段是大小写敏感的,Wlan.Fc.Type不是wlan.fc.type。字段名打错时,过滤栏会变红提示语法错误;如果没报错但结果为空,大概率不是字段名的问题。
  2. 字面值进制。subtype 的十六进制写法必须带0x前缀,例如wlan.fc.type_subtype == 0x08。写成了不带前缀的8也合法,但容易跟十进制混淆,建议统一用0x。
  3. 当前接口或信道对不对。监听接口在 6 信道,AP 却工作在 1 信道,再怎么过滤也是空。这几乎是“过滤器不生效”里最常见的物理层原因。
  4. 网卡是否真的处于监听模式。有些驱动在 Wireshark 勾选了监听,但拉起接口时失败,后台悄悄回退到普通模式,这时抓到的只有发给网卡自己的帧。

5.2 加密环境下数据帧筛不出上层信息怎么办

5GHz 频段上跑 WPA2/WPA3 的无线局域网,数据帧的 IP 层、TCP 层都是密文。这时候你用ip.addr == 192.168.1.10过滤,结果等于零,非常正常的现象。

遇到这种情况先冷静下来,明确你的目标。如果想确认一个具体终端的上行下行流量统计,那就老老实实基于 MAC 层过滤wlan.addr,看帧的数量、大小、号和时间间隔就够用了。如果想看到 IP 层内容,就得在 Wireshark 的偏好设置里给 IEEE 802.11 协议配置解密密钥,并确保抓到了对应的四次握手报文。注意:用的无线局域网密码只是 PMK,抓包文件里还得有 EAPOL 四次握手,解密条件才成立。

5.3 重传与聚合报文:统计数字千万别当真

802.11 本身就带重传机制,空口上一帧丢了你会在抓包里看到 Retry 标志。如果你过滤wlan.fc.type == 2后直接数帧数,重传的帧会被重复纳入,统计结果会虚高。实际排查性能问题时,我会顺手加一条wlan.fc.retry == 0,把重传排干净再分析。

另一个干扰来自 A-MPDU 聚合。WiFi 5/6 接下,数据帧会被聚合,Wireshark 默认会解聚,把子帧展开为一堆独立的 802.11 数据帧。这种情况下看起来报文总数暴增,过滤逻辑本身没问题,但如果你想统计“原始空口传输次数”,就得去识别聚合边界,普通过滤是数不出来的。所以遇到统计数据和实际吞吐量对不上的情况,优先怀疑重传与聚合,而不是过滤器写错了。

5.4 终端 MAC 随机化导致地址过滤失效

现在不少手机系统对 Probe Request 做 MAC 随机化,同一台手机你看到的源 MAC 可能是不断变化的。表现在过滤器上就是你盯着一台终端,抓包里却出现一堆不认识的新 MAC 占据窗口。这是现代移动设备的默认行为,不算故障。

想跟踪这类终端,不能只靠静态地址过滤,可以用“高级”一点的方式:先通过最强的同现特征(比如同时段、同位置、同型号)识别设备,再配合 Wireshark 的“Follow”能力和 IO Graph 观察行为模式。对于需要管理终端漫游或防伪设备的场景,重点是看关联成功后的帧——关联后正常会使用真实 MAC,Probe 阶段的随机化其实影响不大。

6. 最后分享一点使用习惯上的心得

做了这么多年无线分析,我越来越觉得“过滤”不是敲命令的一下子动作,而是一套工作方法。我习惯先全局看一眼,不急着过滤,在统计里观察整体帧构成,比如管理帧比例突然异常升高,往往还没过滤就能闻到异味。然后再用过滤逐层收敛:先按 channel 收紧,再按 BSSID,再按 subtype,最后叠加 radiotap 信号条件,每一步都保留一个过滤快照,方便回头对比。

另外一个习惯是把常用过滤整理成 Wireshark 配置文件里的过滤按钮,或者写成显示过滤宏。像“只看某个 AP 的 Deauth”“排除重传的数据帧”这类条件,我每天要用几十次,全部提前存好,鼠标点一下就能完成,效率提升非常明显。

如果你刚入门无线抓包,建议先从最简单的一条过滤开始练手:打开 Wireshark,随便抓一分钟 Beacon,输入wlan.fc.type_subtype == 0x08,观察每个 AP 的 Beacon 间隔和个数。这一条练熟了,你对 802.11 帧结构、监听模式和过滤语法的理解都会上一个台阶,之后再去啃 Deauth、关联过程这些复杂场景,就顺理成章了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询