版本说明:基于 Wireshark 4.x 显示过滤器语法整理
适用对象:网络分析、协议调试、安全排查人员

一、两类过滤器:捕获过滤器 vs 显示过滤器

Wireshark 有两套完全不同的过滤语法,这是初学者最容易混淆的地方:

维度 捕获过滤器 Capture Filter 显示过滤器 Display Filter
作用时机 抓包前设置,只抓符合条件的包 抓包后/实时显示时筛选
语法 BPF(Berkeley Packet Filter) Wireshark 自有语法(更强大)
设置位置 主界面 → 捕获选项 → 捕获过滤器 主界面顶部工具栏(绿色输入框)
填错后果 可能抓不到包 只是没有匹配结果
字段名风格 简短(hostporttcp 完整(ip.srctcp.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 从包中生成过滤器

  1. 选中包 → 协议树展开 → 右键字段 → Apply as Filter(应用为过滤器)/ Prepare as Filter(追加准备)
  2. 右键某条 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                                  -- 有载荷