4. 核心过滤语法:IP过滤、端口过滤、协议过滤、逻辑组合过滤、表达式构造
说实话,很多新人学Wireshark,第一步就卡在过滤上。抓包一时爽,过滤火葬场。满屏的数据包,你根本不知道看哪个。
我刚开始带团队的时候,有个同事抓了个HTTP慢请求的包,对着几千个包翻了一个小时。我过去看了一眼,敲了条过滤,结果就剩十几个包。他当时那个表情,我到现在都记得。
过滤语法,说白了就是你和Wireshark沟通的语言。你问它「我要看什么」,它给你答案。这一章,我把最常用的过滤规则拆开揉碎讲给你听。
4.1 IP过滤:盯住你想看的主机
排查连接超时,第一件事就是确定源和目的。IP过滤是最基础的,也是我用的最多的。
核心语法:
ip.addr == 192.168.1.1—— 只看这个IP的所有流量(不管源还是目的)ip.src == 192.168.1.1—— 只看这个IP作为发送方的包ip.dst == 10.0.0.5—— 只看这个IP作为接收方的包
我个人习惯,排查问题时先用 ip.addr。为什么?因为你不知道问题是出在客户端还是服务端,先看全貌,再缩小范围。
小技巧: 如果你只想看两个IP之间的对话,可以这样写:
ip.addr == 192.168.1.1 and ip.addr == 10.0.0.5
这等价于「只看这两个IP之间的所有包」。我在排查一次跨机房延迟问题时,就是靠这条过滤,瞬间把几千个无关包排除掉了。
注意: 别写成 ip.src == 192.168.1.1 and ip.dst == 10.0.0.5。这样只能看到单向的包,回包会被过滤掉。你想想看,TCP三次握手的SYN-ACK就看不到了,那还排查个啥?
4.2 端口过滤:锁定具体服务
IP过滤只能定位到主机,但一台服务器上跑着几十个服务呢。端口过滤就是用来精确打击的。
| 过滤表达式 | 含义 | 我常用的场景 |
|---|---|---|
tcp.port == 80 |
只看80端口的TCP流量 | 排查HTTP超时 |
tcp.srcport == 443 |
只看源端口是443的包 | 确认服务端发出的HTTPS响应 |
tcp.dstport == 3306 |
只看目的端口是3306的包 | 排查MySQL连接断连 |
udp.port == 53 |
只看DNS查询和响应 | 排查域名解析超时 |
嗯,这里要注意。端口过滤一定要带上协议前缀。你写 port == 80 也能用,但Wireshark会同时匹配TCP和UDP。虽然80端口基本是TCP,但养成好习惯,加上 tcp. 或 udp.,避免以后踩坑。
我曾经遇到过一个案例,同事写了个 port == 53,结果把DNS的TCP回退流量也抓进来了,排查了半天才发现是UDP的DNS响应超时。从那以后,我要求团队必须写清楚协议前缀。
4.3 协议过滤:一眼识别问题类型
有时候你不需要关心IP和端口,就想看看某种协议的整体情况。Wireshark支持直接按协议名过滤。
常用协议过滤:
tcp—— 只看所有TCP包udp—— 只看所有UDP包icmp—— 只看ping包(排查网络连通性)arp—— 只看地址解析协议(排查二层问题)dns—— 只看DNS查询和响应http或tls—— 只看应用层协议
协议过滤最简单,但也是最容易被忽视的。我排查连接超时时,第一步往往是先看 tcp 过滤,确认三次握手有没有完成。如果连SYN都没发出去,那问题大概率在客户端本地。
避坑指南: 写协议过滤时,Wireshark是大小写不敏感的。但为了可读性,我建议统一用小写。另外,有些协议有缩写,比如HTTP2可以写成 http2,QUIC可以写成 quic。记不住没关系,在过滤栏输入时Wireshark会自动补全。
4.4 逻辑组合过滤:像写代码一样查问题
单一过滤条件往往不够用。你需要把多个条件组合起来,才能精准定位问题。
Wireshark支持三种逻辑运算符:
and(或&&)—— 两个条件都满足or(或||)—— 满足其中一个条件not(或!)—— 排除某个条件
我常用的组合示例:
| 实际需求 | 过滤表达式 |
|---|---|
| 看客户端到Web服务器的HTTP流量 | ip.addr == 192.168.1.10 and tcp.port == 80 |
| 排除广播包,只看单播 | not arp and not icmp |
| 看DNS或HTTP的流量 | dns or http |
| 看某个IP的非80端口流量 | ip.addr == 10.0.0.1 and not tcp.port == 80 |
重要提醒: 逻辑组合时,括号的使用很关键。比如:
ip.addr == 192.168.1.1 and (tcp.port == 80 or tcp.port == 443)
如果不加括号,Wireshark的解析顺序可能会让你得到意想不到的结果。我见过有人写 ip.addr == 192.168.1.1 and tcp.port == 80 or tcp.port == 443,结果把整个网段的443流量都显示出来了。嗯,这就是不加括号的后果。
4.5 表达式构造:进阶玩家的武器
前面讲的都是基础过滤。但有些场景,你需要更精细的控制。比如,只看重传包、只看窗口为0的包、或者只看SYN包。
Wireshark的过滤表达式支持访问协议头中的具体字段。语法是:协议.字段名 == 值
常用进阶表达式:
tcp.analysis.retransmission—— 只看TCP重传包(排查丢包)tcp.analysis.fast_retransmission—— 只看快速重传tcp.analysis.zero_window—— 只看接收窗口为0的包(排查接收端瓶颈)tcp.flags.syn == 1—— 只看SYN包(排查连接建立)tcp.flags.reset == 1—— 只看RST包(排查连接被重置)tcp.analysis.lost_segment—— 只看丢段事件
这些表达式,说白了就是Wireshark帮你做了一层分析。它不只是显示原始包,而是告诉你「这个包有问题」。我在排查一次数据库连接频繁断开的案例时,就是靠 tcp.analysis.retransmission 发现网络中存在间歇性丢包,最终定位到是交换机端口协商问题。
如何找到这些字段? 你可以在Wireshark里打开一个包,在Packet Details面板中展开协议头,右键点击你想过滤的字段,选择「作为过滤器应用」->「选中」。Wireshark会自动帮你生成正确的表达式。这个功能我每天都在用,省去了记字段名的麻烦。
4.6 知识体系总览
说了这么多,我画了一张图帮你理清思路。过滤语法其实就四个维度:IP、端口、协议、表达式。逻辑组合就是胶水,把它们粘在一起。
这张图你看懂了吗?从上往下,就是排查问题的标准流程。先确定主机(IP过滤),再确定服务(端口过滤),然后看协议类型(协议过滤),最后用表达式深挖细节。逻辑组合贯穿始终,把条件串起来。
好了,过滤语法就讲到这里。这些规则你多用几次就熟了。下次抓包,别再傻傻地翻几千个包了,敲几条过滤,效率翻倍。