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、端口、协议、表达式。逻辑组合就是胶水,把它们粘在一起。

Wireshark 核心过滤语法知识体系 过滤语法核心 IP 过滤 端口过滤 协议过滤 表达式构造 ip.addr ip.src / ip.dst tcp.port udp.port tcp / udp / icmp http / dns / tls tcp.flags tcp.analysis 逻辑组合:and / or / not 核心原则:先宽后窄,逐步缩小范围 先用 ip.addr 锁定主机,再用 tcp.port 定位服务,最后用表达式深挖

这张图你看懂了吗?从上往下,就是排查问题的标准流程。先确定主机(IP过滤),再确定服务(端口过滤),然后看协议类型(协议过滤),最后用表达式深挖细节。逻辑组合贯穿始终,把条件串起来。

好了,过滤语法就讲到这里。这些规则你多用几次就熟了。下次抓包,别再傻傻地翻几千个包了,敲几条过滤,效率翻倍。