4、Wireshark显示过滤器:语法、常用表达式与组合技巧
抓包过滤器帮我们把流量「拦下来」,但拦下来的数据往往还是很多。这时候就该显示过滤器登场了。说白了,显示过滤器是对已经抓到的报文做二次筛选,它不丢包,只是帮你「藏起」不关心的内容。
我个人习惯是:先抓个全量包,再用显示过滤器慢慢分析。为什么?因为有时候你漏掉某个过滤条件,重抓一次太浪费时间了。先抓再说,后面慢慢筛,这是老司机的做法。
核心区别一句话:抓包过滤器是「进门前查票」,显示过滤器是「进门后找人」。
4.1 显示过滤器语法基础
显示过滤器的语法,其实和编程语言里的表达式很像。它由三部分组成:协议字段、比较运算符、值。
基本格式长这样:
协议.字段 比较运算符 值
举个例子:
ip.src == 192.168.1.1
tcp.port == 80
http.request.method == "GET"
嗯,这里要注意:字符串值要用双引号包起来,IP地址和数字不用。我刚开始用的时候老忘加引号,结果过滤不出来,还以为是软件坏了。
比较运算符有哪些?我整理了一张表:
| 运算符 | 写法 | 示例 |
|---|---|---|
| 等于 | == | ip.src == 10.0.0.1 |
| 不等于 | != | ip.src != 10.0.0.1 |
| 大于 | > | frame.len > 1000 |
| 小于 | < | frame.len < 100 |
| 大于等于 | >= | tcp.window_size >= 65535 |
| 小于等于 | <= | udp.length <= 500 |
| 包含 | contains | http contains "password" |
| 匹配正则 | matches | http.host matches "\.com$" |
contains 和 matches 这两个我特别常用。有一次排查一个HTTP接口泄露敏感信息的问题,我就是用 http contains "token" 一把筛出来的,效率极高。
4.2 常用过滤表达式
说实话,常用的表达式就那么十几个。你记住这些,日常工作中八九成的场景都能覆盖。
按地址过滤:
ip.addr == 192.168.1.1 # 源或目标IP
ip.src == 192.168.1.1 # 仅源IP
ip.dst == 192.168.1.1 # 仅目标IP
eth.addr == aa:bb:cc:dd:ee:ff # MAC地址
按端口过滤:
tcp.port == 443 # TCP端口443
udp.port == 53 # UDP端口53
tcp.dstport == 8080 # 目标端口8080
按协议过滤:
arp # 只看ARP报文
dns # 只看DNS查询/响应
http # 只看HTTP
tcp # 只看TCP
按报文特征过滤:
tcp.flags.syn == 1 # SYN包
tcp.flags.reset == 1 # RST包
icmp.type == 8 # Ping请求
icmp.type == 0 # Ping响应
小技巧: 在Wireshark里,你点开一个报文,展开协议树,右键点击某个字段,选择「作为过滤器应用」->「选中」,它自动帮你生成过滤表达式。这个功能我天天用,省得手敲。
4.3 过滤表达式组合
单个条件往往不够用。比如我想看「从192.168.1.1发往80端口」的报文,就得把两个条件组合起来。
Wireshark支持三种逻辑运算符:
- and (&&) — 且,两个条件都满足
- or (||) — 或,满足其中一个
- not (!) — 非,取反
看几个实际例子:
# 从192.168.1.1发往80端口的HTTP流量
ip.src == 192.168.1.1 and tcp.dstport == 80
# 要么是DNS流量,要么是HTTP流量
dns or http
# 除了ARP和广播包以外的所有流量
not arp and not eth.addr == ff:ff:ff:ff:ff:ff
# 长度大于1000的TCP重传包
tcp.analysis.retransmission and frame.len > 1000
我曾经遇到一个诡异的问题:服务器偶尔丢包,但频率很低。我用了 tcp.analysis.retransmission or tcp.analysis.fast_retransmission 这个组合过滤,蹲了半小时,终于抓到那个「罪魁祸首」——一个网卡驱动bug导致的随机重传。
组合过滤时,括号可以改变优先级:
# 来自192.168.1.x网段的HTTP或HTTPS流量
ip.src == 192.168.1.0/24 and (tcp.port == 80 or tcp.port == 443)
你想想看,没有括号的话,这个表达式就变成「来自192.168.1.x且端口80,或者任意端口443」,意思完全变了。
4.4 过滤表达式保存与加载
有些过滤条件你天天用,每次都重新敲一遍?太傻了。Wireshark提供了保存功能。
保存过滤表达式:
- 在过滤栏输入你的表达式,确认它能正常工作
- 点击过滤栏左侧的「书签」图标(或者叫「保存」按钮)
- 在弹出的对话框里,给这个过滤条件起个名字,比如「公司内网HTTP流量」
- 点击「OK」,它就存下来了
加载过滤表达式:
- 点击过滤栏左侧的「书签」图标
- 从下拉列表里选择你之前保存的过滤条件
- 一键应用,不用再敲了
注意: 保存的过滤表达式是跟着你的配置文件的。如果你换了电脑或者重装了Wireshark,记得把配置文件备份一下。路径一般在 %APPDATA%\Wireshark\(Windows)或 ~/.config/wireshark/(Linux/Mac)。
我个人习惯是把常用的过滤条件分门别类保存好:
- 「TCP三次握手」—
tcp.flags.syn == 1 or tcp.flags.ack == 1 - 「HTTP错误」—
http.response.code >= 400 - 「DNS查询失败」—
dns.flags.rcode != 0 - 「重传与丢包」—
tcp.analysis.retransmission or tcp.analysis.fast_retransmission or tcp.analysis.duplicate_ack
这样每次遇到问题,直接点一下对应的过滤条件,几秒钟就能定位到可疑报文。效率就是这么提上来的。
4.5 本章知识体系
下面这张图帮你梳理了显示过滤器的核心脉络:
显示过滤器这东西,用熟了之后你会觉得它比抓包过滤器还重要。毕竟抓包是一次性的,而分析是反复的。不同的分析角度,用不同的过滤条件,同一个pcap文件能看出完全不同的故事。
好了,这一章的内容就到这儿。记住我说的:先抓全量,再慢慢筛。别怕文件大,显示过滤器就是你的「显微镜」。
公众号:蓝海资料掘金营,微信deep3321