3. Wireshark 基础过滤语法归纳总结
说实话,刚接触抓包那会儿,我最头疼的不是抓不到包,而是抓到太多包。办公室里几百个设备同时通信,数据包瀑布一样往下滚,根本看不清。后来我才明白——过滤才是Wireshark的灵魂。你抓到的包越乱,你就越需要一套趁手的过滤语法来帮你指路。
这一章,我把我平时最常用的过滤规则整理了一下。不敢说多高深,但应付日常网络排查够用。
3.1 显示过滤器 vs 捕获过滤器
Wireshark提供了两套过滤机制。很多人一开始搞混,我个人习惯这样区分:捕获过滤器是筛子——抓之前就把不要的扔掉;显示过滤器是放大镜——抓完之后再慢慢挑。
| 对比维度 | 显示过滤器 | 捕获过滤器 |
|---|---|---|
| 过滤时机 | 抓包完成后 | 抓包开始前 |
| 语法难度 | 简单,协议友好 | 较复杂,BPF原生语法 |
| 影响抓包效率 | 不改变原始数据 | 大幅减少抓取量 |
| 典型场景 | 分析已有pcap文件 | 生产环境全量抓取前过滤 |
举个例子。你在线上某台服务器抓包,如果直接用默认设置抓,网卡每秒收到几万个包,磁盘很快就会撑爆。这时候就该用捕获过滤器,只抓80端口的HTTP流量。而拿到pcap文件后,你再拿显示过滤器慢慢查某个客户端的具体请求。
3.2 显示过滤器的核心语法
显示过滤器的语法我就记住几个基本操作。你想想看,网络通信再复杂,落到表达式上无非就三件事:选协议、选地址、选端口。
3.2.1 基础比较操作
# 只看HTTP协议
http
# 只看IP为192.168.1.1的包
ip.addr == 192.168.1.1
# 只看端口号为443的包
tcp.port == 443
# 只看数据包长度大于1000字节的包
frame.len > 1000
这里有一个细节——Wireshark的==是严格相等,而contains是部分匹配。我在项目中排查一个诡异的DNS问题时,就靠dns.qry.name contains "suspicious"才揪出来那个恶意域名。
3.2.2 逻辑组合
单个条件往往不够用。我曾经排查一个跨域访问慢的问题,需要同时看源、目的和协议——这时候逻辑组合就派上用场了。
# 与(and)
http and ip.addr == 10.0.0.5
# 或(or)
tcp.port == 80 or tcp.port == 8080
# 非(not 或 !)
not arp
ip.addr同时匹配源IP和目的IP。如果你非要区分,就得用ip.src和ip.dst。这个坑我踩过:写了个ip.addr == 192.168.1.1,结果把客户端和服务器的包都筛出来了,以为是程序bug,查了半天才发现是过滤条件不够精确。
3.2.3 常用函数
Wireshark还内置了一些实用函数,我个人最常用的是这两个:
# 只看包含特定字符串的包(大小写敏感)
frame contains "password"
# 只看包含特定字符串的包(大小写不敏感)
upper(frame contains) "HTTP"
我记得有一次帮运维同事排查登录失败的问题。对方说“日志里全是错误,看不懂”。我直接输入http.request.uri contains "login" and http.response.code != 200——三秒钟,所有失败的登录请求全部列出来。他说“卧槽这比看日志快多了”。
3.3 捕获过滤器的快速上手
再说说捕获过滤器。这东西语法跟显示过滤器完全不同——它用的是伯克利包过滤器(BPF),跟tcpdump长得一模一样。
# 只抓HTTP流量(80端口)
port 80
# 只抓某个主机的流量
host 10.0.0.1
# 只抓某个网段的流量
net 10.0.0.0/24
# 排除ARP广播
not arp
嗯,这里要注意——捕获过滤器不支持协议名。你不能写 http,只能写 port 80。第一次用的时候我还在想“为什么http不行?”——后来才知道,捕获过滤器工作在底层,它只认端口、IP、MAC这些二层/三层特征,不认识“HTTP”这种七层概念。
3.4 避坑指南
最后说几个我当年掉过的坑,你提前绕过去,能省不少时间。
- 别把IP拼错了——写
ip.addr == 192.168.0.1结果搜不到,大概率是IP写错或者网段不对。先ping一下确认。 - 注意大小写——
HTTP和http在显示过滤器中没区别,但在contains里HTTP和http不一样。 - 别滥用not——我曾经写了个
not http and not dns,结果包全消失了。为什么?因为剩下的全是TCP握手和ARP——都被我排除了。你想想看,排除所有已知协议后,剩下的往往是控制帧和广播包,基本没有“有用信息”。 - 捕获过滤器一旦填错,可能什么都抓不到——有一次我在服务器上配了
port 8080,但实际服务跑在8443上。盯着屏幕看了十分钟没见一个包,还以为是网卡坏了……
好了,过滤语法这部分其实就这么点东西。多用几次,肌肉记忆就形成了。下次遇到复杂场景,再来翻翻这张表,保你能快速找到想要的包。