Wireshark 过滤器完全手册:精准过滤提升分析效率

Wireshark 显示过滤器组合示例:http.request 与 ip.addr 精准过滤
组合过滤表达式把 3,412 个包收敛到 8 个关键请求

一个几百万包的抓包文件,如果没有过滤器,基本等于没法看。Wireshark 过滤器是把"海量数据"压缩成"几十个关键包"的唯一手段,也是新手和老手之间最直观的能力分水岭。

这份手册把过滤器的语法、字段、配方和踩坑点整理在一起,可以当速查表用。建议配合Wireshark 零基础入门教程一起看,先会用再求精。

一、两种过滤器:先搞清楚用哪个

Wireshark 里有两套完全不同的过滤器,很多人卡在这里。

对比项捕获过滤器(Capture Filter)显示过滤器(Display Filter)
语法BPF(伯克利包过滤),与 tcpdump 通用Wireshark 自研语法
生效时机抓包之前,只捕获匹配的包抓包之后,只显示匹配的包
能否找回被过滤掉的包永久丢失随时清掉条件即可恢复显示全部
示例host 10.0.0.1 and tcp port 443ip.addr == 10.0.0.1 && tcp.port == 443
典型用途长时间抓包、控制文件大小分析阶段定位问题

捕获过滤器常用写法

# 指定主机
host 192.168.1.100

# 指定网段
net 192.168.1.0/24

# 指定端口与协议
tcp port 443
udp port 53

# 端口范围
tcp portrange 8000-8100

# 排除某类流量
not arp and not port 22

# 只看 SYN 包(不含 SYN-ACK)
tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0

捕获过滤器写错不会温柔提示,直接抓不到东西。写完先观察界面右下角的包计数是否在涨,这是最直接的验证。

原则:能不丢包就别丢。除非抓包时间很长或流量极大,否则建议不加捕获过滤器全量抓,靠显示过滤器来分析。丢掉的包事后要不回来。

二、显示过滤器语法基础

比较运算符

运算符含义示例
== / eq等于ip.src == 10.0.0.1
!= / ne不等于http.request.method != "GET"
> / gt大于frame.len > 1000
< / lt小于tcp.time_delta < 0.01
>= / ge大于等于tcp.window_size >= 65535
&& / and逻辑与http && ip.src == 10.0.0.1
|| / or逻辑或dns || http
! / not逻辑非!arp
contains包含子串http contains "login"
matches正则匹配http.host matches "^api\."
in属于集合tcp.port in {80 443 8080}

值的写法

字段名全部小写。输入时 Wireshark 会自动补全,按 Ctrl+空格 可强制唤出候选列表——记不住字段时靠它比翻文档快得多。

三、按协议速查

TCP / UDP

目的过滤器
某端口的所有流量tcp.port == 443
只看 SYN(连接建立)tcp.flags.syn == 1 && tcp.flags.ack == 0
只看 RST(连接被重置)tcp.flags.reset == 1
所有重传tcp.analysis.retransmission
乱序包tcp.analysis.out_of_order
接收窗口为 0tcp.analysis.zero_window
有载荷的包(排除纯 ACK)tcp.len > 0
握手往返时间tcp.time_delta > 0.2

HTTP

目的过滤器
所有请求http.request
指定方法http.request.method == "POST"
服务器错误响应http.response.code >= 500
404 请求http.response.code == 404
指定域名http.host contains "example.com"
请求完整 URIhttp.request.uri contains "/api/"
含 JSON 的响应http.content_type contains "json"

DNS / TLS / ICMP

目的过滤器
所有 DNS 查询dns.flags.response == 0
解析失败dns.flags.rcode != 0
查询特定域名dns.qry.name contains "example.com"
TLS Client Hellotls.handshake.type == 1
TLS 告警tls.alert_message
查看访问的域名(SNI)tls.handshake.extensions_server_name
ping 请求icmp.type == 8
目标不可达icmp.type == 3

四、高级技巧

1. 用时间维度过滤

定位"某个时刻之后开始出问题"时,时间过滤非常有用:

# 抓包开始 30 秒之后的包
frame.time_relative > 30

# 时间区间内
frame.time_relative > 30 && frame.time_relative < 60

# 与上一个包间隔超过 200 毫秒(找卡顿点)
tcp.time_delta > 0.2

2. 按包长过滤

找大包、小包、异常载荷时常用。frame.len > 1400 能快速筛出可能触发分片或 MTU 问题的包;tcp.len == 0 则能找出纯确认包,用于计算 ACK 频率。

3. 字节切片与偏移

需要匹配协议中某个特定字节时用切片语法:

# TCP 载荷前 3 个字节
tcp.payload[0:3] == 47:45:54      # 即 "GET"

# UDP 载荷第 3 个字节为 0x01
udp.payload[2] == 01

# 以太网帧类型字段
eth.type == 0x0800

4. 正则匹配要谨慎

# 匹配 api 开头的子域名
http.host matches "^api\."

# 匹配多种图片后缀
http.request.uri matches "\.(jpg|png|gif)$"

正则在百万级包的文件上会明显变慢。能拆成多个 contains 加 || 的,就别用正则。

5. 过滤器按钮与宏

常用的过滤器输一次就该存下来:在过滤栏输入后点右侧加号,会生成一个可点击的按钮,右键可改名、改颜色。按故障类型建一组(重传、重置、DNS 失败、TLS 告警),排查时连点几下就能扫完全部可能性。

五、诊断类过滤器速查

Wireshark 的 tcp.analysis.* 系列是排查专用字段,基本覆盖了所有 TCP 异常:

字段含义通常指向
tcp.analysis.retransmission重传链路丢包
tcp.analysis.fast_retransmission快速重传少量丢包,TCP 已自愈
tcp.analysis.spurious_retransmission虚假重传抓包点重复或延迟抖动
tcp.analysis.duplicate_ack重复 ACK接收方未收到后续段
tcp.analysis.out_of_order乱序多路径路由、无线
tcp.analysis.zero_window零窗口接收端处理能力不足
tcp.analysis.window_full窗口满发送被接收端限制
tcp.analysis.flags任意 TCP 异常快速总览

直接输入 tcp.analysis.flags 可以一次性列出所有被标记为异常的包,配合统计 → 会话看哪些会话异常最多。

六、十个实战配方

  1. 网站打不开:dns.flags.rcode != 0 || tcp.analysis.retransmission
  2. 页面加载慢:http && tcp.time_delta > 0.5
  3. 接口报 5xx:http.response.code >= 500
  4. HTTPS 握手失败:tls.alert_message || tcp.flags.reset == 1
  5. 疑似被扫描:tcp.flags.syn == 1 && tcp.flags.ack == 0 && tcp.analysis.retransmission
  6. 内网 ARP 异常:arp.duplicate-address-detected || arp.opcode == 2
  7. 找出上传大文件:http.request.method == "POST" && frame.len > 1400
  8. 定位某台主机的全部通信:ip.addr == 192.168.1.50
  9. 只看异常不看正常:tcp.analysis.flags && !tcp.analysis.keep_alive
  10. 排除干扰流量:!arp && !ssdp && !mdns && !nbns

七、常见错误

错误写法问题正确写法
IP.SRC == 10.0.0.1字段名必须小写ip.src == 10.0.0.1
http.host = example.com字符串要加引号http.host == "example.com"
tcp.port = 80 or 443需写完整比较tcp.port == 80 || tcp.port == 443
host 10.0.0.1这是 BPF 语法,不能用于显示过滤ip.addr == 10.0.0.1
tcp.flags.syn = 1单个等号是赋值,不合法tcp.flags.syn == 1

常见问题

过滤器输入后变红是什么意思?
红色表示语法错误或字段名不存在,绿色才是有效表达式。最常见的原因是拼写错误、把协议名写成大写(Wireshark 字段全小写),或者对某个字段用了它不支持的比较运算符。
捕获过滤器和显示过滤器能混用吗?
不能。捕获过滤器用 BPF 语法(如 tcp port 80),在抓包前生效;显示过滤器用 Wireshark 自研语法(如 tcp.port == 80),在抓包后生效。两者语法不通用,写错会直接报错。
为什么 ip.addr == 192.168.1.1 匹配不到想要的包?
ip.addr 同时匹配源地址和目的地址。如果只想看从该地址发出的包,用 ip.src == 192.168.1.1;只看发给它的,用 ip.dst == 192.168.1.1。
matches 和 contains 有什么区别?
contains 是简单子串匹配,区分大小写,不支持通配;matches 支持 Perl 兼容正则表达式,可以做复杂匹配但性能更差。能用 contains 就别用 matches,大文件上差别很明显。
怎么把常用的过滤器保存下来?
在过滤栏右侧点加号(或按 Ctrl+S 前先点书签图标)把它存为过滤器按钮,之后单击即可调用。右键该按钮可以改名称和颜色,适合按故障类型分组管理。

下一步

过滤器熟练之后,配合Wireshark 网络故障排除完整指南里的五步定位法,基本能覆盖日常 80% 的排查场景。如果想系统学习从安装到第一次抓包的全过程,可以从零基础入门教程开始。更多中文教程见Wireshark 中文站。