查看博客目录

写给网工人的Wireshark过滤规则指南(附主流协议抓包源文件下载)

前言

Wireshark 是每个网络工程师、运维人员和安全从业者的必备工具。但很多人打开抓包文件后,面对成千上万条数据包直接懵了——眼睛看花了也找不到关键问题。

这时候,过滤规则就派上用场了。

下面就介绍一些常用的Wireshark 过滤规则。文末还准备了 HTTP、TCP、DNS、HTTPS、ARP 等主流协议的现成抓包文件(573个)+ 中文手册,关注公众号即可下载,边看边练。

一、两种过滤器,先分清

Wireshark 有两种过滤器,新手最容易搞混:

类型英文名设置位置特点
捕获过滤器Capture Filter网卡设置界面抓之前就过滤,抓不到的数据就没了
显示过滤器Display Filter主界面顶部搜索栏抓之后过滤,数据仍在,只是隐藏了

记住一句话:不确定要抓什么的时候,先全抓,再用显示过滤器慢慢筛。

二、捕获过滤器(Capture Filter)

用的是 BPF 语法(Berkeley Packet Filter),和 tcpdump 一样。

使用场景:你知道目标明确,且数据量巨大只想抓自己关心的报文的时候

设置位置:

写给网工人的Wireshark过滤规则指南(附主流协议抓包源文件下载) 配图 1

常用示例:

目标过滤规则
特定主机的所有流量host 192.168.1.1
源 IP 为某地址src host 192.168.1.1
目的 IP 为某地址dst host 192.168.1.1
一个网段net 192.168.1.0/24net 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
源端口 80src 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
只抓 ICMPicmp
只抓 ARParp
捕获 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 200len <= 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 最强大的工具,采用 专有语法,可以深入到任意协议字段。

设置位置:

写给网工人的Wireshark过滤规则指南(附主流协议抓包源文件下载) 配图 2

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:ffaa-bb-cc-dd-ee-ffaabb.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用户手册中文版”

写给网工人的Wireshark过滤规则指南(附主流协议抓包源文件下载) 配图 3

📦 获取方式:关注本公众号,后台回复「抓包」即可获取下载链接。

往期推荐:

专为网工开发的小程序上线了!子网掩码计算、IP转换、Excel批量转换、批量命令生成

Docker环境一键安装与换源脚本(建议收藏)

别只会 Ping!网络工程师的10款排障诊断工具(建议收藏)

网络流量分析开源利器 Akvorado:轻松掌控 NetFlow 与 SFlow 数据

告别流量黑盒:开源神器sFlow-RT实现全网流量可视化