查看博客目录
写给网工人的Wireshark过滤规则指南(附主流协议抓包源文件下载)
前言
Wireshark 是每个网络工程师、运维人员和安全从业者的必备工具。但很多人打开抓包文件后,面对成千上万条数据包直接懵了——眼睛看花了也找不到关键问题。
这时候,过滤规则就派上用场了。
下面就介绍一些常用的Wireshark 过滤规则。文末还准备了 HTTP、TCP、DNS、HTTPS、ARP 等主流协议的现成抓包文件(573个)+ 中文手册,关注公众号即可下载,边看边练。
一、两种过滤器,先分清
Wireshark 有两种过滤器,新手最容易搞混:
| 类型 | 英文名 | 设置位置 | 特点 |
|---|---|---|---|
| 捕获过滤器 | Capture Filter | 网卡设置界面 | 抓之前就过滤,抓不到的数据就没了 |
| 显示过滤器 | Display Filter | 主界面顶部搜索栏 | 抓之后过滤,数据仍在,只是隐藏了 |
记住一句话:不确定要抓什么的时候,先全抓,再用显示过滤器慢慢筛。
二、捕获过滤器(Capture Filter)
用的是 BPF 语法(Berkeley Packet Filter),和 tcpdump 一样。
使用场景:你知道目标明确,且数据量巨大只想抓自己关心的报文的时候
设置位置:

常用示例:
| 目标 | 过滤规则 |
|---|---|
| 特定主机的所有流量 | host 192.168.1.1 |
| 源 IP 为某地址 | src host 192.168.1.1 |
| 目的 IP 为某地址 | dst host 192.168.1.1 |
| 一个网段 | net 192.168.1.0/24 或 net 192.168.1.0 mask 255.255.255.0 |
| 排除某主机 | not host 192.168.1.1 |
| 两个主机间的流量 | host 192.168.1.1 and host 192.168.1.2 |
| 特定端口 | port 80 |
| 源端口 80 | src port 80 |
| 端口范围 | portrange 8000-9000 |
| TCP 80 端口 | tcp port 80 |
| UDP 53 端口 | udp port 53 |
| 只抓 TCP SYN 包 | tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0 |
| 只抓 ICMP | icmp |
| 只抓 ARP | arp |
| 捕获 VLAN 100 的帧 | vlan 100 |
| 过滤 MAC 地址 | ether host aa:bb:cc:dd:ee:ff |
| 禁止 DNS 流量 | not port 53 |
| TCP 80 且来自特定网段 | tcp port 80 and src net 10.0.0.0/8 |
| 限制包长小于 200 字节 | less 200 或 len <= 200 |
| 广播或组播帧 | ether broadcast or ether multicast |
高级用法
-
协议偏移过滤:如
ip[9] = 6(IPv4协议字段位置9处为6表示TCP),ip[2:2] > 600(IP包总长度大于600) -
TCP 标志检查:
tcp[13] & 0x12 != 0(检查 SYN 或 ACK) -
捕获非 IPv4 流量:
not ip(小心,这会放行ARP等二层帧) -
基于 MAC 的 VLAN 过滤:
vlan 100 and host 10.0.0.1
注意:捕获过滤器的语法不支持直接引用应用层字段(如 HTTP URI),这类需求必须使用显示过滤器。
三、显示过滤器(Display Filter)
显示过滤器是 Wireshark 自己的语法,功能比捕获过滤器强大得多。自动补全和颜色提示对新手非常友好。 显示过滤器是 Wireshark 最强大的工具,采用 专有语法,可以深入到任意协议字段。
设置位置:

1. 基本语法
[协议].[字段] [比较运算符] [值]
例如:ip.src == 192.168.1.1
-
字段名称几乎全部是小写,单词间用下划线,如
http.request.method。 -
值使用特定格式(无引号或双引号,十六进制用
:分隔等)。
2. 比较运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
==、eq | 等于 | ip.src == 192.168.1.1 |
!=、ne | 不等于 | tcp.port != 80 |
>、gt | 大于 | frame.len > 1500 |
<、lt | 小于 | tcp.window_size < 1000 |
>=、ge | 大于等于 | udp.length >= 512 |
<=、le | 小于等于 | ip.ttl <= 64 |
contains | 包含字符串或字节 | http.user_agent contains "Chrome" |
matches | 正则匹配(PCRE) | dns.qry.name matches ".*\.example\.com" |
in | 属于集合 | ip.src in {192.168.1.1 192.168.1.2} |
3. 逻辑运算符
-
and/&&:与 -
or/||:或 -
not/!:非 -
( ):分组 -
xor/^^:异或(较少用)
4. 字段类型与常见值写法
-
IPv4 地址:
192.168.1.1 -
IPv6 地址:
fe80::1或[fe80::1] -
MAC 地址:
aa:bb:cc:dd:ee:ff或aa-bb-cc-dd-ee-ff或aabb.ccdd.eeff -
端口(整数):
80 -
布尔:直接使用字段,如
tcp.flags.syn,表示tcp.flags.syn == 1 -
字符串:
"GET"(双引号) -
字节序列(十六进制):
a0:b1:c2:d3 -
时间:相对时间用
frame.time_relative > 1.0,绝对时间需用frame.time >= "2025-01-01 12:00:00" -
网络地址范围:
10.0.0.0/8 -
多值集合:
tcp.port in {80, 443, 8080}
5. 常用显示过滤器分类示例
● 二层(Ethernet / ARP)
eth.src == aa:bb:cc:dd:ee:ff
eth.dst == ff:ff:ff:ff:ff:ff
arp.opcode == 1 # ARP 请求
arp.opcode == 2 # ARP 应答
vlan.id == 100
● IP 层
ip.src == 10.0.0.1
ip.dst == 10.0.0.0/8
ip.addr == 192.168.1.1 # 源或目的
ip.ttl < 10
ip.proto == 6 # 协议字段为 6,即 TCP
ip.version == 4
ip.flags.mf == 1 # More fragments
ip.frag_offset > 0 # 分片包
!ip # 非 IPv4(可能是 IPv6 或 ARP)
● TCP / UDP
tcp.port == 443
tcp.srcport == 54321
tcp.dstport == 80
udp.length >= 1000
tcp.flags.syn == 1 && tcp.flags.ack == 0 # SYN 包
tcp.flags.reset == 1 # RST 包
tcp.flags.fin == 1 # FIN 包
tcp.analysis.retransmission # 重传包
tcp.analysis.duplicate_ack # 重复 ACK
tcp.analysis.fast_retransmission # 快速重传
tcp.window_size < 1000
tcp.len > 0 # 有 TCP 数据负载
● HTTP
http # 所有 HTTP
http.request.method == "GET"
http.request.method == "POST"
http.request.uri contains "/api/"
http.host contains "example.com"
http.response.code == 404
http.response.code >= 400
http.content_type contains "json"
http.cookie contains "sessionid"
http.user_agent matches ".*Windows NT.*"
● DNS
dns
dns.flags.response == 0 # 查询
dns.flags.response == 1 # 响应
dns.qry.name == "example.com"
dns.qry.name matches ".*\\.google\\.com"
dns.resp.ttl > 300
dns.qry.type == 1 # A 记录查询
dns.qry.type == 28 # AAAA 记录查询
dns.flags.rcode != 0 # 非成功响应
● TLS/SSL
tls.handshake.type == 1 # Client Hello
tls.handshake.type == 2 # Server Hello
tls.handshake.extensions_server_name contains "example.com" # SNI
tls.handshake.ciphersuite == 0x1301 # TLS_AES_128_GCM_SHA256
tls.alert_message # 告警消息
tls.record.content_type == 21 # Alert 记录
● DHCP
dhcp
dhcp.option.dhcp_message_type == 1 # Discover
dhcp.option.dhcp_message_type == 2 # Offer
dhcp.option.request_ip_address == 192.168.1.100
bootp.hw.mac_addr == aa:bb:cc:dd:ee:ff
● ICMP
icmp
icmp.type == 0 # Echo Reply
icmp.type == 8 # Echo Request
icmp.type == 3 # Destination Unreachable
icmp.code == 4 # Frag needed but DF set
● 应用负载内容过滤
frame contains "password" # 整个帧(包括负载)搜索 ASCII 字符串
tcp.payload contains "USER"
data.data contains 50:4f:53:54 # 字节序列
http.file_data contains "malware"
● 时间与长度
frame.time_relative > 5 # 相对捕获开始 5 秒后
frame.time_relative < 1 # 前 1 秒
frame.len > 1500 # 大于 MTU
frame.len <= 64 # 小包(可能是控制包)
tcp.time_delta > 0.2 # 包间延迟大于 0.2 秒
6. 切片操作
可以对字段的字节进行切片:
ip.src[0:2] == c0:a8 # 源 IP 前两个字节
udp[0:2] == 00:35 # UDP 负载前两个字节
tcp[0:2] > 00:50 # 源端口(TCP 头部前两字节)
http.request.uri[0:4] == "/api" # URI 前 4 个字符
7. 函数
-
string(字段):将非字符串字段转为字符串,如string(ip.src) == "192.168.1.1" -
len(字段):长度,如len(http.response) > 1000 -
upper(字段)/lower(字段):大小写转换,如upper(http.user_agent) contains "CHROME" -
count(字段):聚合函数,需配合tcp.stream eq X等,一般不用于单包过滤
8. 宏与快捷栏
-
Wireshark 支持将常用显示过滤器保存为 过滤器按钮,点击即应用。
-
可以通过“分析”→“显示过滤器宏”定义自定义宏,例如:
tcp_retrans → tcp.analysis.retransmission || tcp.analysis.fast_retransmission使用时输入
${tcp_retrans}。
9. 实用组合示例
| 场景 | 显示过滤器 |
|---|---|
| 查看某 TCP 流完整会话 | 右键包 → 选择 “Follow TCP Stream”,或使用 tcp.stream eq 5 |
| 过滤特定客户端的 HTTP 请求 | http.request && ip.src eq 192.168.1.100 |
| 没有收到响应的 DNS 查询 | dns && dns.flags.response == 0 && !dns.resp.name |
| 仅显示客户端发起的 TLS 连接(SNI) | tls.handshake.type == 1 && tls.handshake.extensions_server_name |
| 找出所有重传且负载不为空的 TCP 包 | tcp.analysis.retransmission && tcp.len > 0 |
| 过滤包含特定 Cookie 的 HTTP 请求 | http.cookie contains "PHPSESSID" |
| 过滤特定证书主题的 TLS 通信 | tls.handshake.certificate.subject contains "CN=example.com" |
| 查找大于 1 秒的 TCP 零窗口通告 | tcp.window_size == 0 && frame.time_delta > 1 |
四、提示与技巧
-
使用 自动补全:输入
ip.后按Ctrl+Space或直接等待下拉列表。 -
语法颜色:显示过滤器输入框背景为绿色时语法正确,红色表示有误。
-
右键即过滤:在数据包详情中右键任意字段,可直接“作为过滤器应用”或“准备为过滤器”。
-
复合过滤:可以同时使用捕获过滤器和显示过滤器,前者减少抓包量,后者精细分析。
-
导出特定流:先用显示过滤器筛选,再通过“文件” → “导出特定分组”保存子集。
-
正则注意:
matches使用 PCRE 正则,且必须匹配完整字段值(除非使用.*),如dns.qry.name matches ".*\.example\.com"。 -
切片与偏移:对于私有协议或非标准字段,可通过
proto[offset:length]直接检查负载。
Wireshark 的显示过滤器几乎可以表达所有协议字段,灵活组合即可应对绝大多数网络分析场景。遇到不确定的字段名,选中数据包该字段后观察左下角状态栏,Wireshark 会直接显示对应的过滤器语法。
抓包源文件获取
Wireshark 的过滤规则就像搜索引擎的搜索语法——你能写出多精准的表达式,就能多快定位到问题。
当然,光学不练是学不会的。我将分享 主流协议真实抓包文件(573个),和 “wireshark用户手册中文版”

📦 获取方式:关注本公众号,后台回复「抓包」即可获取下载链接。
往期推荐:
专为网工开发的小程序上线了!子网掩码计算、IP转换、Excel批量转换、批量命令生成
别只会 Ping!网络工程师的10款排障诊断工具(建议收藏)