3. Wireshark 基础过滤语法归纳总结

说实话,刚接触抓包那会儿,我最头疼的不是抓不到包,而是抓到太多包。办公室里几百个设备同时通信,数据包瀑布一样往下滚,根本看不清。后来我才明白——过滤才是Wireshark的灵魂。你抓到的包越乱,你就越需要一套趁手的过滤语法来帮你指路。

这一章,我把我平时最常用的过滤规则整理了一下。不敢说多高深,但应付日常网络排查够用。

Wireshark 过滤语法核心体系 显示过滤器(Display Filter) 捕获过滤器(Capture Filter) 语法特征 • 人类可读,支持协议名直接输入 • 支持比较操作符(==, !=, >, <) • 支持逻辑组合(and, or, not) 常用场景 • 排查HTTP/HTTPS问题 • 分析特定主机通信行为 语法特征 • 基于BPF(伯克利包过滤器) • 类似tcpdump语法 • 在抓取前过滤,节省磁盘空间 常用场景 • 高流量环境只抓关键协议 • 长时间监控指定端口 核心原则: 先过滤再看包 → 多条件组合 → 善用函数

3.1 显示过滤器 vs 捕获过滤器

Wireshark提供了两套过滤机制。很多人一开始搞混,我个人习惯这样区分:捕获过滤器是筛子——抓之前就把不要的扔掉;显示过滤器是放大镜——抓完之后再慢慢挑。

对比维度 显示过滤器 捕获过滤器
过滤时机 抓包完成后 抓包开始前
语法难度 简单,协议友好 较复杂,BPF原生语法
影响抓包效率 不改变原始数据 大幅减少抓取量
典型场景 分析已有pcap文件 生产环境全量抓取前过滤

举个例子。你在线上某台服务器抓包,如果直接用默认设置抓,网卡每秒收到几万个包,磁盘很快就会撑爆。这时候就该用捕获过滤器,只抓80端口的HTTP流量。而拿到pcap文件后,你再拿显示过滤器慢慢查某个客户端的具体请求。

我的小技巧:日常排障我90%的时间只用显示过滤器。捕获过滤器我只有要上生产环境长时间抓包时才用——毕竟真出问题的时候,谁也等不起你去翻海量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”这种七层概念。

我的经验:如果只抓一个端口的流量,捕获过滤器效率极高。但你要是想抓“除了ARP以外的所有流量”——千万别用捕获过滤器去写复杂逻辑,直接全抓然后交给显示过滤器处理,又简单又保险。

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上。盯着屏幕看了十分钟没见一个包,还以为是网卡坏了……

好了,过滤语法这部分其实就这么点东西。多用几次,肌肉记忆就形成了。下次遇到复杂场景,再来翻翻这张表,保你能快速找到想要的包。