Wireshark 过滤规则使用文档(详细版)
版本说明:基于 Wireshark 4.x 显示过滤器语法整理
适用对象:网络分析、协议调试、安全排查人员
一、两类过滤器:捕获过滤器 vs 显示过滤器
Wireshark 有两套完全不同的过滤语法,这是初学者最容易混淆的地方:
| 维度 | 捕获过滤器 Capture Filter | 显示过滤器 Display Filter |
|---|---|---|
| 作用时机 | 抓包前设置,只抓符合条件的包 | 抓包后/实时显示时筛选 |
| 语法 | BPF(Berkeley Packet Filter) | Wireshark 自有语法(更强大) |
| 设置位置 | 主界面 → 捕获选项 → 捕获过滤器 | 主界面顶部工具栏(绿色输入框) |
| 填错后果 | 可能抓不到包 | 只是没有匹配结果 |
| 字段名风格 | 简短(host、port、tcp) |
完整(ip.src、tcp.port) |
| 逻辑符 | and or not |
and or not 也可用 && ` |
原则:能用显示过滤器解决的问题,尽量用显示过滤器;捕获过滤器用于抓包量太大、磁盘/内存受限的场景。
二、显示过滤器基本语法
2.1 基本形式
协议.字段 运算符 值
例如:
ip.src == 192.168.1.1
tcp.port == 80
2.2 单独写协议名 = 过滤该协议
http -- 所有 HTTP 包
dns -- 所有 DNS 包
tcp -- 所有 TCP 包
2.3 不写运算符 = 字段存在即为真
tcp.flags.syn == 1 -- 显式判断
tcp.flags.syn -- 字段存在且非零(推荐写法)
2.4 输入辅助
- 工具栏输入框绿色 = 语法正确;红色 = 语法错误;黄色 = 可能不是你想要的
- 输入时按
Ctrl+Space或点击表达式按钮可弹出字段自动补全列表 - 不确定字段名时:选中某个包 → 展开协议树 → 右键字段 → "Apply as Filter"(应用为过滤器)
三、比较运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
== / eq |
等于 | ip.src == 10.0.0.1 |
!= / ne |
不等于 | tcp.port != 80 |
> / gt |
大于 | frame.len > 1000 |
< / lt |
小于 | frame.len < 100 |
>= / ge |
大于等于 | tcp.seq >= 1000 |
<= / le |
小于等于 | frame.time_relative <= 1 |
contains |
包含子串(字节串或字符串) | http.host contains "baidu" |
matches / ~ |
正则匹配(PCRE) | http.request.uri matches "\\.php$" |
in |
值在多值集合中 | tcp.port in {80 443 8080} |
字符串比较注意点
- 字符串用双引号
" ";不区分大小写比较可用matches "(?i)..." contains对字符串是大小写敏感的- 字节串比较可用
eth.addr == aa:bb:cc:dd:ee:ff
集合操作 in(4.0+ 推荐)
-- 老写法(嵌套 or,冗长)
tcp.port == 80 || tcp.port == 443 || tcp.port == 8080
-- 新写法(等价且高效)
tcp.port in {80 443 8080}
ip.src in {10.0.0.1 10.0.0.2 192.168.1.0/24}
四、逻辑/组合运算符
| 形式1 | 形式2 | 含义 |
|---|---|---|
and |
&& |
与 |
or |
\\|\\| |
或 |
not |
! |
非 |
xor |
^^ |
异或 |
示例:
-- 来自 10.0.0.1 的 TCP 80 端口流量
ip.src == 10.0.0.1 and tcp.port == 80
-- 非 ARP 且非 ICMP
not arp and not icmp
-- A 和 B 之间通信(注意此处 ^^ 是异或)
ip.addr == 10.0.0.1 ^^ ip.addr == 10.0.0.2
(源是A目的B,或源B目的A,但 A↔B 同一包不可能同时为真)
-- 括号改变优先级
(ip.src == 10.0.0.1 or ip.src == 10.0.0.2) and tcp.flags.syn == 1
五、常用函数(Functions)
| 函数 | 说明 | 示例 |
|---|---|---|
upper(字段) |
转大写 | upper(http.host) == "EXAMPLE.COM" |
lower(字段) |
转小写 | lower(http.host) contains "api" |
len(字段) |
长度 | len(tcp.payload) > 0 |
count(字段) |
该字段在帧中出现次数 | count(tcp.flags.syn) > 1 |
string(字段) |
转字符串 | string(frame.number) |
max(...) / min(...) / abs(...) |
数学函数 | abs(tcp.window_size - 65535) < 100 |
六、Slices(切片截取)
对字节流/字符串截取子串:
-- 取 TCP 载荷前 4 个字节
tcp.payload[0:4]
-- 判断载荷以特定魔术字节开头
tcp.payload[0:2] == 50:4f -- "PO"
-- 跳过前 20 字节取后 4 字节
tcp.payload[20:4]
-- 负数表示从后往前
tcp.payload[-4:] -- 最后 4 字节
-- 嵌套:HTTP URI 去掉前 5 个字符后包含 login
http.request.uri[5:] contains "login"
七、常用协议字段速查
7.1 Ethernet / ARP
eth.src / eth.dst -- MAC 地址
eth.addr == aa:bb:cc:dd:ee:ff
eth.type == 0x0800 -- IPv4
eth.type == 0x0806 -- ARP
eth.ig -- 组播位
arp.opcode == 1 -- ARP 请求 (request)
arp.opcode == 2 -- ARP 应答 (reply)
arp.src.proto_ipv4 -- ARP 发送方 IP
arp.dst.proto_ipv4
7.2 IP
ip.src / ip.dst / ip.addr -- 地址
ip.src_host / ip.dst_host / ip.host -- 支持主机名(含反向解析结果)
ip.ttl < 64 -- TTL 分析(路由跳数)
ip.len -- IP 总长度
ip.flags.df == 1 -- 不分片
ip.frag_offset > 0 -- 分片包(非首片)
ip.proto == 6 -- 协议号 6=TCP 17=UDP 1=ICMP
ip.checksum_bad == 1 -- 校验和错误
注意:
ip.src只接受纯 IP;ip.src_host额外支持主机名/域名。写 IP 时两者等价。
7.3 TCP
tcp.port == 80 -- 源或目的端口
tcp.srcport / tcp.dstport
tcp.flags.syn == 1
tcp.flags.ack == 1
tcp.flags.fin == 1
tcp.flags.reset == 1 -- RST
tcp.flags.push == 1 -- PSH
tcp.flags.syn == 1 and tcp.flags.ack == 0 -- 第一次握手(SYN)
tcp.flags.syn == 1 and tcp.flags.ack == 1 -- SYN+ACK(第二次握手)
tcp.flags.fin == 1 and tcp.flags.ack == 1 -- 四次挥手
tcp.stream == 5 -- 只看第 5 条 TCP 流(会话)
tcp.len > 0 -- 有载荷
tcp.analysis.retransmission -- 重传包
tcp.analysis.fast_retransmission
tcp.analysis.duplicate_ack
tcp.analysis.zero_window
tcp.analysis.lost_segment
tcp.analysis.out_of_order
tcp.analysis.window_full
tcp.analysis.rto -- 重传超时
tcp.seq / tcp.ack -- 序列号/确认号
tcp.window_size -- 窗口大小
7.4 UDP / ICMP
udp.port == 53
udp.length
icmp.type == 8 -- Echo request (ping)
icmp.type == 0 -- Echo reply
icmpv6.type == 128 -- v6 ping request
7.5 DNS
dns.flags.response == 0 -- 查询
dns.flags.response == 1 -- 应答
dns.flags.rcode == 3 -- NXDOMAIN(域名不存在)
dns.qry.name == "www.example.com"
dns.qry.type == 1 -- A 记录
dns.qry.type == 28 -- AAAA 记录
dns.count.answers > 0
dns.resp.name / dns.a -- 应答地址
7.6 HTTP / HTTP2
http.request -- 所有 HTTP 请求
http.response -- 所有 HTTP 响应
http.request.method == "GET"
http.request.method in {"GET" "POST"}
http.host contains "example"
http.request.uri contains "/login"
http.response.code == 404
http.response.code >= 500
http.content_type contains "json"
http.user_agent contains "curl"
http.cookie contains "sessionid"
http.authorization -- Basic/Digest 认证头
http2.headers.authority
7.7 TLS
tls.handshake -- 握手
tls.handshake.type == 1 -- ClientHello
tls.handshake.type == 2 -- ServerHello
tls.handshake.extensions_server_name contains "example.com"
tls.record.version == 0x0303 -- TLS 1.2
tls.alert.message -- 告警
7.8 帧层 Frame
frame.number == 1000 -- 第 1000 帧
frame.len > 1000
frame.time_relative -- 相对第一帧的时间
frame.time_delta -- 与上一帧的时间间隔
frame.time_delta > 0.5 -- 间隔超过 0.5s 的包
frame.time >= "2026-09-20 13:00:00"
frame.marked -- 已打标记的包
frame.comment -- 已添加注释的包
八、典型使用场景实例
8.1 排查 TCP 三次握手
tcp.flags.syn == 1 and tcp.flags.ack == 0 -- 谁发了 SYN 没回包(连接建立失败)
8.2 找出所有 TCP 重传(判断网络质量)
tcp.analysis.retransmission
8.3 看两台主机之间完整交互
ip.addr == 10.0.0.1 and ip.addr == 10.0.0.2
8.4 过滤某个 TCP 会话(右击包 → Follow TCP Stream 后)
tcp.stream eq 3
8.5 查找慢请求(响应间隔大)
http.response and frame.time_delta > 1
8.6 找出 DNS 解析失败
dns.flags.rcode != 0
8.7 查找明文密码/敏感信息泄露
http.request.method == "POST" and http.file_data contains "password"
8.8 过滤特定子网
ip.src net 192.168.0.0 mask 255.255.0.0
ip.src in {192.168.0.0/16}
8.9 只看有数据传输的包(去掉纯 ACK)
tcp.len > 0
8.10 组合过滤:特定主机访问特定域名的 HTTPS
ip.addr == 10.0.0.5 and tls.handshake.extensions_server_name contains "api.example.com"
九、捕获过滤器(BPF 语法)速查
语法与显示过滤器完全不同!在"捕获选项"里配置。
9.1 基本形式
[协议] [方向] [类型/关键字] [值]
9.2 类型关键字
| 关键字 | 说明 | 示例 |
|---|---|---|
host |
主机 | host 192.168.1.1 |
net |
网段 | net 192.168.0.0/16 |
port |
端口 | port 80 |
portrange |
端口段 | portrange 1000-2000 |
9.3 方向关键字
| 关键字 | 说明 |
|---|---|
src |
仅源 |
dst |
仅目的 |
| 不写 | 源或目的 |
src host 10.0.0.1 -- 源是 10.0.0.1
dst port 53 -- 目的端口 53
9.4 协议关键字
tcp / udp / icmp / arp / ip / ip6 / ether
9.5 逻辑组合
tcp and port 80
udp or icmp
not arp
host 10.0.0.1 and (port 80 or port 443)
9.6 其他
tcp[tcpflags] & tcp-syn != 0 -- SYN 置位的 TCP 包
less 100 -- 长度小于 100
greater 1000 -- 长度大于 1000
broadcast / multicast -- 广播/组播
ether host aa:bb:cc:dd:ee:ff -- MAC 过滤
9.7 常用捕获过滤模板
-- 只抓 Web 流量
tcp port 80 or tcp port 443
-- 只抓某主机的流量
host 10.0.0.5
-- 排除 ARP 和组播(减噪)
not arp and not (multicast or broadcast)
-- 抓指定主机访问指定端口
host 10.0.0.5 and tcp port 3306
十、使用技巧与常见坑
10.1 从包中生成过滤器
- 选中包 → 协议树展开 → 右键字段 → Apply as Filter(应用为过滤器)/ Prepare as Filter(追加准备)
- 右键某条 TCP 流 → Follow → TCP Stream,自动生成
tcp.stream eq N
10.2 过滤书签与历史
- 工具栏下拉箭头可看到最近使用的过滤器
Analyze → Display Filter Macros可定义宏,如${mysubnet:ip.addr}复用复杂表达式
10.3 保存过滤器
Analyze → Display Filters(书签图标)可命名保存常用过滤式,支持快捷键调用。
10.4 常见坑
| 坑 | 说明 |
|---|---|
| 混淆两套语法 | 捕获过滤器写成 ip.src == 1.1.1.1 会报错或抓不到包 |
contains 大小写敏感 |
http.host contains "Example" 可能匹配不到 example.com,用 lower() 包一层 |
ip.addr == A and ip.addr == B |
表示"源或目的为A,且源或目的为B",即 A↔B 间通信;不是 A 同时是源和目的 |
| 字段名拼错 | 输入框变红即为语法错误;用自动补全避免猜字段名 |
| 中文/全角符号 | 引号、括号必须是英文半角 |
== vs = |
显示过滤器用 ==;BPF 捕获过滤器里 = 等价于 == |
| 正则需要转义反斜杠 | 表达式字符串内 \ 要写成 \\,如 matches "\\.jpg$" |
10.5 性能建议
- 大范围抓包时优先用捕获过滤器在源头减噪
- 显示过滤器中
in集合比多个or快 matches(正则)比contains慢,非必要不用
附录:速查卡
【显示过滤器】
协议字段 == 值 ip.src == 10.0.0.1
and / or / not 逻辑组合
in {a b c} 多值集合
contains / matches 包含/正则
字段[起:长] 切片截取
【捕获过滤器 BPF】
host/net/port/portrange 类型
src / dst 方向
tcp udp icmp arp 协议
and or not 逻辑
【高频组合】
tcp.flags.syn == 1 and tcp.flags.ack == 0 -- TCP SYN
tcp.analysis.retransmission -- 重传
ip.addr == A and ip.addr == B -- 两主机通信
dns.flags.rcode != 0 -- DNS 失败
tcp.len > 0 -- 有载荷
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝