Wireshark 过滤语法详细解析(实战指南)
作为网络流量分析领域的核心工具,Wireshark 的过滤语法是高效定位目标流量的 "钥匙"。本文以视角,系统拆解 Wireshark 过滤语法的核心规则、分类用法、高级技巧,并结合渗透测试、运维排障、安全监测等实战场景,提供可直接复用的过滤规则,帮你从海量流量中快速精准提取关键信息。
一、语法基础:必掌握的核心规则(避坑前提)
Wireshark 过滤语法遵循 "字段 + 运算符 + 值" 的核心结构,所有高级用法均基于此扩展。先掌握以下基础规则,避免 90% 的语法错误:
1.1 核心命名规范
- 字段命名 :采用 "
协议.层级.属性" 分层结构(例:tcp.srcport、http.request.method),全小写,大小写敏感(如HTTP≠http,Uri≠uri); - 字符串值 :必须用双引号
"包裹(例:http.request.uri contains "admin"),单引号 / 无引号均报错; - 数值型值 :直接写(例:
tcp.port == 80、ip.ttl == 64),无需引号; - 空格规范 :运算符前后建议加空格(例:
ip.src == 192.168.1.100而非ip.src==192.168.1.100),提升可读性; - 字段有效性 :字段必须与协议匹配(例:
http协议有request.uri字段,tcp协议无此字段,乱写会报错)。
1.2 关键区分:显示过滤器 vs 捕获过滤器
很多工程师混淆两者,核心差异如下(实战中 90% 场景用显示过滤器):
| 维度 | 显示过滤器(Display Filter) | 捕获过滤器(Capture Filter) |
|---|---|---|
| 作用 | 对已捕获的数据包筛选("事后筛选") | 抓包前设置规则,只捕获符合条件的包("事前过滤") |
| 语法 | Wireshark 自定义语法(本文重点) | 基于 libpcap 语法(简洁,功能少) |
| 示例 | http.request.uri contains "admin" |
tcp port 80 and host 192.168.1.100 |
| 生效位置 | 顶部 "Filter" 输入框(绿色 = 语法正确,红色 = 错误) | 抓包前 "Capture Options"→"Capture Filter" |
| 适用场景 | 渗透测试、故障排查、流量审计(需精准筛选) | 海量流量抓包(减少存储占用,提升抓包效率) |
1.3 基础报错排查(快速定位问题)
- 输入后显示红色:语法错误(检查字段拼写、引号、协议匹配);
- 显示黄色:语法正确但无匹配结果(检查字段值是否存在,如
http.response.status_code == 404但无 404 响应); - 无结果但确认有目标流量:大概率是大小写敏感(例:
contains "Admin"匹配不到小写admin)。
二、核心过滤维度:按场景分类的语法大全
2.1 协议过滤(最基础,快速缩小范围)
直接输入协议名,筛选该协议的所有数据包,适用于快速分离目标协议流量。
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
http |
筛选所有 HTTP 协议包(含请求 + 响应) | 分析 Web 应用流量 |
https |
筛选所有 HTTPS 协议包(TLS 加密流量) | 监测 HTTPS 连接建立过程(三次握手) |
tcp |
筛选所有 TCP 协议包 | 分析 TCP 重传、延迟问题 |
udp |
筛选所有 UDP 协议包 | 分析 DNS、SNMP 等无连接协议流量 |
dns |
筛选所有 DNS 协议包 | 排查 DNS 解析故障、恶意域名请求 |
icmp |
筛选所有 ICMP 协议包(ping、 traceroute) | 检测网络连通性、路由问题 |
arp |
筛选所有 ARP 协议包 | 排查 ARP 欺骗、MAC 地址冲突 |
not http and not tcp |
筛选非 HTTP、非 TCP 的数据包 | 寻找异常协议流量(如 UDP 后门) |
实战案例:筛选所有 Web 相关流量(HTTP+HTTPS)
http or https
2.2 IP / 端口 / 地址过滤(定位通信双方)
核心用于筛选 "谁在和谁通信",是流量分析的基础操作,结合逻辑运算符可精准定位目标。
2.2.1 IP 地址过滤
| 语法示例 | 作用 | 说明 |
|---|---|---|
ip.src == 192.168.1.100 |
筛选源 IP 为 192.168.1.100 的数据包 | 定位某主机发起的所有请求 |
ip.dst == 202.108.22.5 |
筛选目的 IP 为 202.108.22.5(百度 IP)的包 | 定位访问特定服务器的流量 |
ip.addr == 192.168.1.100 |
筛选源 IP 或目的 IP 为 192.168.1.100 的包 | 定位某主机的所有通信流量(常用) |
ip.src in {192.168.1.100, 192.168.1.101} |
筛选源 IP 为多个值的包 | 批量定位多主机流量 |
ip.src ~= 192.168.1.0/24 |
筛选源 IP 属于 192.168.1.0/24 网段的包 | 定位某网段的所有出站流量 |
not ip.addr == 10.0.0.0/8 |
排除 10.0.0.0/8 内网网段的包 | 只保留外网通信流量 |
2.2.2 端口过滤
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
tcp.port == 80 |
筛选 TCP 端口为 80 的包(源或目的) | 分析 HTTP 明文流量 |
tcp.srcport == 443 |
筛选 TCP 源端口为 443 的包 | 定位服务器端 HTTPS 响应流量 |
tcp.dstport == 22 |
筛选 TCP 目的端口为 22(SSH)的包 | 监测 SSH 登录尝试 |
udp.port == 53 |
筛选 UDP 端口为 53(DNS)的包 | 分析 DNS 查询流量 |
tcp.port in {80, 443, 8080} |
筛选 TCP 端口为 80/443/8080 的包 | 批量分析 Web 服务流量 |
not tcp.port == 135 and not tcp.port == 445 |
排除 135/445 端口(SMB 协议)的包 | 减少 Windows 默认服务流量干扰 |
实战案例:定位 192.168.1.100 访问外网 Web 服务(80/443 端口)的流量
ip.src == 192.168.1.100 and (tcp.port == 80 or tcp.port == 443) and not ip.dst ~= 192.168.0.0/16
2.3 TCP/UDP 协议专项过滤(分析连接状态)
针对 TCP/UDP 的核心属性(连接状态、标志位、窗口大小等)过滤,适用于排查连接异常、重传、攻击行为。
2.3.1 TCP 关键过滤语法
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
tcp.flags.syn == 1 |
筛选 SYN 包(TCP 连接建立第一步) | 检测端口扫描(大量 SYN 包无后续 ACK) |
tcp.flags.fin == 1 |
筛选 FIN 包(TCP 连接关闭第一步) | 分析连接异常关闭 |
tcp.flags.rst == 1 |
筛选 RST 包(强制关闭连接) | 排查服务不可用、端口未开放 |
tcp.analysis.retransmission |
筛选 TCP 重传包 | 定位网络丢包、延迟问题 |
tcp.analysis.duplicate_ack |
筛选 TCP 重复 ACK 包 | 分析网络拥堵、数据包丢失 |
tcp.window_size == 0 |
筛选 TCP 窗口为 0 的包(接收方暂不可收) | 排查服务端处理瓶颈 |
tcp.seq == 1 |
筛选 TCP 序列号为 1 的包(连接初始包) | 定位新建立的 TCP 连接 |
2.3.2 UDP 关键过滤语法
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
udp.length > 1000 |
筛选 UDP 包长度大于 1000 字节的包 | 检测 UDP 洪水攻击、异常大数据包 |
udp.srcport == 53 and udp.dstport != 53 |
筛选源端口 53(DNS 服务器)的 UDP 包 | 监测 DNS 服务器对外响应流量 |
实战案例:检测针对 192.168.1.200 的 TCP 端口扫描(大量 SYN 包无 ACK)
ip.dst == 192.168.1.200 and tcp.flags.syn == 1 and tcp.flags.ack == 0
2.4 HTTP 协议专项过滤(Web 流量核心)
HTTP 是实战中最常分析的协议,Wireshark 提供了丰富的字段,覆盖请求方法、URI、状态码、头部等核心属性。
2.4.1 核心 HTTP 过滤语法
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
http.request |
筛选所有 HTTP 请求包(不含响应) | 分析客户端发起的 Web 请求 |
http.response |
筛选所有 HTTP 响应包(不含请求) | 分析服务器返回的响应内容 |
http.request.method == "GET" |
筛选 HTTP GET 请求 | 分析查询类请求(如页面访问) |
http.request.method == "POST" |
筛选 HTTP POST 请求 | 分析提交类请求(如登录、文件上传) |
http.request.uri contains "admin" |
筛选 URI 包含 "admin" 的 HTTP 请求 | 挖掘后台管理路径(渗透测试常用) |
http.request.uri starts with "/api" |
筛选 URI 以 "/api" 开头的 HTTP 请求 | 分析 API 接口流量 |
http.request.uri ends with ".php" |
筛选 URI 以 ".php" 结尾的 HTTP 请求 | 定位 PHP 动态页面请求 |
http.response.status_code == 200 |
筛选 HTTP 200 OK 响应 | 分析成功响应的请求 |
http.response.status_code == 403 |
筛选 HTTP 403 Forbidden 响应 | 检测权限控制、访问拒绝行为 |
http.response.status_code == 404 |
筛选 HTTP 404 Not Found 响应 | 挖掘不存在的路径(排除无效请求) |
http.response.status_code >= 500 |
筛选 HTTP 5xx 服务器错误响应 | 排查 Web 服务故障 |
http.host == "www.baidu.com" |
筛选主机为www.baidu.com的 HTTP 请求 | 定位访问特定网站的流量 |
http.user_agent contains "Chrome" |
筛选 User-Agent 包含 Chrome 的 HTTP 请求 | 分析浏览器类型分布 |
http.cookie contains "SESSIONID" |
筛选 Cookie 包含 SESSIONID 的 HTTP 请求 | 分析会话相关流量 |
http.content_length > 10000 |
筛选内容长度大于 10KB 的 HTTP 包 | 定位大文件传输、文件上传流量 |
2.4.2 HTTPS 过滤(TLS 协议)
HTTPS 流量加密,无法直接解析内容,但可筛选 TLS 握手、会话相关流量:
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
tls |
筛选所有 TLS 协议包(HTTPS 基础) | 分析 HTTPS 连接建立过程 |
tls.handshake |
筛选 TLS 握手包 | 检测 HTTPS 握手失败、证书问题 |
tls.handshake.type == 1 |
筛选 TLS Client Hello 包(握手第一步) | 检测 HTTPS 连接发起行为 |
tls.handshake.type == 2 |
筛选 TLS Server Hello 包(握手第二步) | 分析服务器 TLS 版本、加密套件 |
tls.alert |
筛选 TLS 告警包 | 定位 HTTPS 连接异常(如证书无效) |
实战案例 1:渗透测试中挖掘后台管理路径(含大小写不敏感)
lower(http.request.uri) contains "admin" or lower(http.request.uri) contains "manage"
(lower()函数将 URI 转为小写,同时匹配admin/Admin/ADMIN)
实战案例 2:筛选文件上传相关的 HTTP POST 请求(含常见后缀)
http.request.method == "POST" and (http.request.uri contains "upload" or http.request.uri contains "file") and (http.content_type contains "multipart/form-data" or http.content_type contains "application/octet-stream")
2.5 其他协议专项过滤(按需使用)
2.5.1 DNS 协议
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
dns.qry.name contains "malicious.com" |
筛选查询恶意域名的 DNS 请求 | 检测恶意软件 C2 通信 |
dns.qry.type == 1 |
筛选 A 记录查询(IPv4 地址) | 分析常规 DNS 查询 |
dns.resp.code == 0 |
筛选 DNS 查询成功的响应(返回码 0) | 排除无效 DNS 查询 |
dns.resp.code == 3 |
筛选 DNS 查询失败(域名不存在,返回码 3) | 检测无效域名请求、拼写错误 |
2.5.2 ICMP 协议
| 语法示例 | 作用 | 实战场景 |
|---|---|---|
icmp.type == 8 |
筛选 ICMP Echo Request(ping 请求) | 检测 ping 扫描、网络连通性测试 |
icmp.type == 0 |
筛选 ICMP Echo Reply(ping 响应) | 验证 ping 响应是否正常 |
icmp.type == 3 |
筛选 ICMP Destination Unreachable(目标不可达) | 排查网络不通、端口未开放 |
三、运算符与逻辑组合:提升筛选精准度
掌握基础字段后,通过运算符和逻辑组合,实现 "多条件筛选",满足复杂分析需求。
3.1 比较运算符(核心)
| 运算符 | 作用 | 适用场景 | 示例 |
|---|---|---|---|
== |
等于(完全匹配) | 精准定位特定值 | tcp.port == 80、http.request.method == "GET" |
!= |
不等于 | 排除特定值 | ip.src != 192.168.1.1 |
> |
大于 | 数值型字段筛选(长度、端口) | tcp.port > 1024、http.content_length > 5000 |
< |
小于 | 同上 | ip.ttl < 32(检测跨网段流量) |
>= |
大于等于 | 同上 | http.response.status_code >= 400(筛选错误响应) |
<= |
小于等于 | 同上 | tcp.window_size <= 1000(筛选小窗口流量) |
contains |
包含(子串匹配) | 字符串字段模糊匹配 | http.request.uri contains "login" |
starts with |
以... 开头 | 字符串字段前缀匹配 | http.request.uri starts with "/admin" |
ends with |
以... 结尾 | 字符串字段后缀匹配 | http.request.uri ends with ".jsp" |
in |
属于多个值中的一个 | 批量匹配 | ip.src in {192.168.1.100, 192.168.1.101} |
~= |
网段匹配(CIDR) | IP 网段筛选 | ip.dst ~= 10.0.0.0/8 |
3.2 逻辑运算符(组合多条件)
| 运算符 | 作用 | 优先级 | 示例(筛选 192.168.1.100 的 HTTP GET 请求) |
|---|---|---|---|
&& |
逻辑与(同时满足) | 高 | ip.src == 192.168.1.100 && http.request.method == "GET" |
| ` | 逻辑或(满足其一) | 中 | http.request.method == "GET",http.request.method == "POST" |
! |
逻辑非(不满足) | 最高 | !http.request.uri contains "admin"(排除含 admin 的请求) |
优先级注意:
逻辑运算符优先级:! > && > ||,复杂组合需用括号 () 强制改变优先级,例:
# 正确:筛选(192.168.1.100的流量)且(HTTP GET或POST请求)
ip.src == 192.168.1.100 && (http.request.method == "GET" || http.request.method == "POST")
# 错误:会筛选(192.168.1.100的GET请求)或(所有POST请求)
ip.src == 192.168.1.100 && http.request.method == "GET" || http.request.method == "POST"
3.3 位运算符(高级,少用)
适用于分析协议标志位(如 TCP flags),了解即可:
| 运算符 | 作用 | 示例(筛选 SYN+ACK 包) | ||
|---|---|---|---|---|
& |
按位与 | tcp.flags & 0x12 == 0x12(0x12=SYN+ACK) |
||
| ` | ` | 按位或 | `tcp.flags | 0x02 == 0x02`(包含 SYN 位) |
四、高级函数:提升分析效率的 "黑科技"
Wireshark 提供多个内置函数,可实现大小写转换、长度计算、字节提取等高级功能,大幅提升筛选灵活性。
4.1 字符串处理函数
| 函数 | 作用 | 示例(大小写不敏感匹配 admin) |
|---|---|---|
lower(field) |
将字段值转为小写 | lower(http.request.uri) contains "admin" |
upper(field) |
将字段值转为大写 | upper(http.request.uri) contains "ADMIN" |
4.2 长度计算函数
| 函数 | 作用 | 示例(筛选长 URI 请求) |
|---|---|---|
len(field) |
计算字段值的长度 | len(http.request.uri) > 100(URI 长度 > 100 字节) |
4.3 字节提取函数(高级)
| 函数 | 作用 | 示例(提取 HTTP 请求体前 4 字节) |
|---|---|---|
bytes(field, offset, length) |
从字段中提取字节(offset = 偏移量,length = 长度) | bytes(http.request.body, 0, 4) == 0x504B0304(匹配 ZIP 文件头) |
4.4 时间函数(筛选特定时间段)
| 函数 | 作用 | 示例(筛选 2024-01-01 10:00-11:00 的流量) |
|---|---|---|
frame.time |
数据包捕获时间 | frame.time >= "2024-01-01 10:00:00" && frame.time <= "2024-01-01 11:00:00" |
frame.time_delta |
与前一个数据包的时间差 | frame.time_delta > 1.0(时间差 > 1 秒,检测延迟) |
实战案例:筛选 ZIP 格式文件上传的 HTTP 请求(通过文件头匹配)
http.request.method == "POST" and bytes(http.request.body, 0, 4) == 0x504B0304
(0x504B0304 是 ZIP 文件的固定文件头)
五、实战场景大全:可直接复用的过滤规则
结合渗透测试、运维排障、安全监测三大核心场景,提供现成的过滤规则,直接复制到 Wireshark 即可生效。
5.1 渗透测试场景
场景 1:挖掘后台管理路径(含常见关键词)
lower(http.request.uri) contains "admin" or lower(http.request.uri) contains "manage" or lower(http.request.uri) contains "control" or lower(http.request.uri) contains "backend" or lower(http.request.uri) contains "system"
场景 2:筛选登录相关请求(含常见登录路径)
(http.request.uri contains "login" or http.request.uri contains "signin" or http.request.uri contains "auth") and (http.request.method == "POST" or http.request.method == "GET")
场景 3:捕获 SQL 注入尝试流量(含常见注入关键词)
http.request.uri contains "union" or http.request.uri contains "select" or http.request.uri contains "and 1=1" or http.request.uri contains "or 1=1" or http.request.uri contains "sleep("
场景 4:筛选文件上传请求(含常见后缀)
http.request.method == "POST" and (http.request.uri contains "upload" or http.request.uri contains "file" or http.request.uri contains "attach") and (http.content_type contains "multipart/form-data" or http.content_type contains "application/octet-stream")
5.2 运维排障场景
场景 1:排查 Web 服务响应慢(筛选响应时间 > 1 秒的 HTTP 请求)
http.request and http.response and frame.time_delta > 1.0
场景 2:排查 DNS 解析故障(筛选 DNS 查询失败的流量)
dns and dns.resp.code != 0
场景 3:排查 TCP 重传导致的卡顿(筛选 TCP 重传包)
tcp.analysis.retransmission or tcp.analysis.duplicate_ack or tcp.analysis.out_of_order
场景 4:定位特定用户的 HTTP 5xx 错误(服务端故障)
ip.src == 192.168.1.100 and http.response.status_code >= 500
5.3 安全监测场景
场景 1:检测端口扫描(大量 SYN 包无 ACK)
tcp.flags.syn == 1 and tcp.flags.ack == 0 and frame.number % 10 == 0 # 每10个包采样,避免流量过多
场景 2:检测恶意域名请求(以常见恶意后缀为例)
dns.qry.name contains ".malicious" or dns.qry.name contains ".cc" or dns.qry.name contains ".top" or dns.qry.name contains ".xyz"
场景 3:检测 HTTPS 握手失败(TLS 告警包)
tls.alert and tls.alert.level == 2 # level=2为严重告警(如证书无效、协议不支持)
场景 4:检测异常大流量 UDP 包(可能是 DDoS 攻击)
udp.length > 1500 # UDP包长度超过MTU,可能是洪水攻击
六、高级技巧与避坑指南
6.1 高级使用技巧
技巧 1:保存常用过滤规则
Wireshark 顶部过滤器输入框右侧,点击 "Save" 可保存常用规则,下次直接选择,无需重复输入。
技巧 2:结合着色规则
过滤出目标流量后,右键 "Colorize Conversation"→选择颜色,将目标流量着色,快速区分重点。
技巧 3:批量过滤多个值
用in和大括号{}批量匹配,例:
ip.src in {192.168.1.100, 192.168.1.101, 192.168.1.102} # 批量匹配多个IP
tcp.port in {80, 443, 8080, 8443} # 批量匹配多个端口
技巧 4:使用 "Follow" 功能深化分析
过滤出目标 HTTP/TCP 流后,右键 "Follow"→"HTTP Stream"/"TCP Stream",可查看完整的会话内容(如完整的请求 / 响应数据)。
6.2 常见避坑指南
坑 1:字段与协议不匹配
- 错误:
tcp.request.uri contains "admin"(TCP 协议无request.uri字段); - 正确:
http.request.uri contains "admin"(HTTP 协议的字段)。
坑 2:大小写敏感导致无结果
- 错误:
http.request.uri contains "Admin"(实际流量中是小写admin); - 正确:
lower(http.request.uri) contains "admin"。
坑 3:混淆显示过滤器和捕获过滤器
- 错误:在捕获过滤器中输入
http.request.uri contains "admin"(捕获过滤器不支持该语法); - 正确:捕获过滤器用
tcp port 80 and host 192.168.1.100,显示过滤器用http.request.uri contains "admin"。
坑 4:字符串未加双引号
- 错误:
http.request.method == GET(GET 是字符串,需加引号); - 正确:
http.request.method == "GET"。
七、总结:核心语法框架(快速记忆)
Wireshark 过滤语法的核心可总结为:
[协议.层级.属性] [运算符] [值] [逻辑运算符] [协议.层级.属性] [运算符] [值]...
- 基础筛选:用协议、IP、端口快速缩小范围(例:
http and ip.src == 192.168.1.100); - 精准筛选:用 HTTP/TCP 专项字段定位核心流量(例:
http.request.method == "POST" and http.response.status_code == 200); - 高级筛选:用函数、字节提取实现复杂需求(例:
lower(...)、bytes(...))。
掌握本文的语法规则和实战案例,可覆盖 95% 的流量分析场景。建议将常用规则保存到 Wireshark,形成自己的 "过滤规则库",提升分析效率。在实际使用中,多结合 "Follow Stream""着色规则" 等功能,深化对流量的理解,从 "筛选流量" 升级为 "分析流量背后的业务逻辑和异常行为"。