Wireshark 筛选功能详解:语法与示例

文章目录

  • [1 摘要](#1 摘要)
  • [2 显示过滤器(Display Filters)](#2 显示过滤器(Display Filters))
    • [2.1 基本语法结构](#2.1 基本语法结构)
      • [2.1.1 常用运算符](#2.1.1 常用运算符)
      • [2.1.2 常用协议字段示例](#2.1.2 常用协议字段示例)
        • [2.1.2.1 IP协议过滤](#2.1.2.1 IP协议过滤)
        • [2.1.2.2 TCP协议过滤](#2.1.2.2 TCP协议过滤)
        • [2.1.2.3 UDP协议过滤](#2.1.2.3 UDP协议过滤)
        • [2.1.2.4 HTTP协议过滤](#2.1.2.4 HTTP协议过滤)
        • [2.1.2.5 DNS协议过滤](#2.1.2.5 DNS协议过滤)
        • [2.1.2.6 ARP协议过滤](#2.1.2.6 ARP协议过滤)
        • [2.1.2.7 ICMP协议过滤](#2.1.2.7 ICMP协议过滤)
      • [2.1.3 复合表达式示例](#2.1.3 复合表达式示例)
  • [3 捕获过滤器(Capture Filters)](#3 捕获过滤器(Capture Filters))
    • [3.1 基本语法](#3.1 基本语法)
    • [3.2 常用捕获过滤器示例](#3.2 常用捕获过滤器示例)
      • [3.2.1 基本主机/端口过滤](#3.2.1 基本主机/端口过滤)
      • [3.2.2 协议过滤](#3.2.2 协议过滤)
      • [3.2.3 网络范围过滤](#3.2.3 网络范围过滤)
      • [3.2.4 MAC地址过滤](#3.2.4 MAC地址过滤)
      • [3.2.5 复合条件过滤](#3.2.5 复合条件过滤)
    • [3.3 捕获过滤器与显示过滤器的区别](#3.3 捕获过滤器与显示过滤器的区别)
  • [4 高级筛选技巧](#4 高级筛选技巧)
    • [4.1 使用比较运算符](#4.1 使用比较运算符)
    • [4.2 使用位运算](#4.2 使用位运算)
    • [4.3 使用范围检查](#4.3 使用范围检查)
    • [4.4 使用协议层次关系](#4.4 使用协议层次关系)
    • [4.5 使用自定义列作为过滤条件](#4.5 使用自定义列作为过滤条件)
  • [5 实用筛选示例](#5 实用筛选示例)
    • [5.1 分析网络问题](#5.1 分析网络问题)
    • [5.2 安全分析](#5.2 安全分析)
    • [5.3 性能分析](#5.3 性能分析)
  • [6 过滤器自动补全和验证](#6 过滤器自动补全和验证)
  • [7 保存和重用过滤器](#7 保存和重用过滤器)
  • [8 查找协议字段的方法](#8 查找协议字段的方法)
  • [8 注意事项](#8 注意事项)

1 摘要

Wireshark作为最流行的网络协议分析工具,其强大的筛选功能可以帮助用户快速定位和分析网络数据包。下面我将详细介绍Wireshark的筛选语法,包括显示过滤器和捕获过滤器,并提供详细的示例说明。

2 显示过滤器(Display Filters)

显示过滤器用于在已捕获的数据包中进行筛选,只显示符合条件的数据包。

2.1 基本语法结构

复制代码
[协议].[字段] [运算符] [值]

2.1.1 常用运算符

运算符 说明 示例
== 等于 ip.src == 192.168.1.1
!= 不等于 ip.src != 192.168.1.1
> 大于 frame.len > 1000
< 小于 frame.len < 128
>= 大于等于 tcp.srcport >= 1024
<= 小于等于 udp.length <= 512
contains 包含 http.host contains "google"
matches 正则匹配 http.request.uri matches "login.*php"
and 逻辑与 ip.src==192.168.1.1 and tcp.port==80
or 逻辑或 ip.src==192.168.1.1 or ip.src==192.168.1.2
not 逻辑非 not arp

时间过滤

复制代码
frame.time >= "2023-01-01 00:00:00" and frame.time <= "2023-01-02 00:00:00"

2.1.2 常用协议字段示例

2.1.2.1 IP协议过滤
复制代码
ip.addr == 192.168.1.1        # 源或目的IP是192.168.1.1
ip.src == 192.168.1.1         # 源IP是192.168.1.1
ip.dst == 192.168.1.1         # 目的IP是192.168.1.1
ip.ttl < 64                   # TTL值小于64
ip.version == 4               # 只显示IPv4数据包
ip.version == 6               # 只显示IPv6数据包

ip.addr == 172.16.4.20示例:

ip.src == 172.16.4.20示例:

2.1.2.2 TCP协议过滤
复制代码
tcp.port == 80                # 源或目的端口是80
tcp.srcport == 80             # 源端口是80
tcp.dstport == 80             # 目的端口是80
tcp.flags.syn == 1            # SYN标志置位的数据包
tcp.flags.ack == 1            # ACK标志置位的数据包
tcp.flags.fin == 1            # FIN标志置位的数据包
tcp.analysis.retransmission   # 重传的数据包
tcp.window_size < 1024        # 窗口大小小于1024字节
2.1.2.3 UDP协议过滤
复制代码
udp.port == 53                # DNS流量
udp.length > 512              # UDP数据长度大于512字节
同TCP协议过滤

udp.srcport == 30490示例:

2.1.2.4 HTTP协议过滤
复制代码
http.request.method == "GET"  # HTTP GET请求
http.request.method == "POST" # HTTP POST请求
http.response.code == 200     # HTTP 200响应
http.host contains "google"   # 主机名包含"google"
http.request.uri matches ".*\.jpg" # 请求URI以.jpg结尾
http.content_type == "text/html" # HTML内容
2.1.2.5 DNS协议过滤
复制代码
dns.flags.response == 0       # DNS查询
dns.flags.response == 1       # DNS响应
dns.qry.name contains "example.com" # 查询的域名
dns.resp.type == 1            # A记录响应
2.1.2.6 ARP协议过滤
复制代码
arp.opcode == 1               # ARP请求
arp.opcode == 2               # ARP响应
arp.src.hw_mac == 00:11:22:33:44:55 # 源MAC地址
2.1.2.7 ICMP协议过滤
复制代码
icmp.type == 8                # ICMP Echo请求(ping)
icmp.type == 0                # ICMP Echo响应
icmp.code == 3                # 目标不可达

2.1.3 复合表达式示例

复制代码
# 来自192.168.1.1或192.168.1.2的HTTP GET请求
(ip.src == 192.168.1.1 or ip.src == 192.168.1.2) and http.request.method == "GET"

# 非HTTPS的Web流量
tcp.port == 80 and not ssl

# 长度大于1000字节的TCP数据包
tcp and frame.len > 1000

# 来自特定MAC地址的DNS查询
eth.src == 00:11:22:33:44:55 and dns

示例:ip.src == 172.16.4.20 or ip.src == 172.16.4.40

3 捕获过滤器(Capture Filters)

捕获过滤器用于在捕获数据包时就进行过滤,减少捕获的数据量。

打开方式如下:

1.点击捕获------>点击捕获过滤器

2.添加规则或者删除规则

3.1 基本语法

复制代码
[协议] [方向] [主机/端口] [条件]

3.2 常用捕获过滤器示例

3.2.1 基本主机/端口过滤

复制代码
host 192.168.1.1              # 捕获与192.168.1.1相关的所有流量
src host 192.168.1.1          # 源IP是192.168.1.1
dst host 192.168.1.1          # 目的IP是192.168.1.1
port 80                       # 捕获端口80的流量
src port 80                   # 源端口是80
dst port 80                   # 目的端口是80
portrange 8000-9000           # 捕获8000-9000端口范围的流量

3.2.2 协议过滤

复制代码
tcp                           # 只捕获TCP流量
udp                           # 只捕获UDP流量
icmp                          # 只捕获ICMP流量
arp                           # 只捕获ARP流量
not arp                       # 不捕获ARP流量

3.2.3 网络范围过滤

复制代码
net 192.168.1.0/24            # 捕获192.168.1.0/24网络的流量
src net 192.168.1.0/24        # 源网络是192.168.1.0/24
dst net 192.168.1.0/24        # 目的网络是192.168.1.0/24

3.2.4 MAC地址过滤

复制代码
ether host 00:11:22:33:44:55  # 捕获特定MAC地址的流量
ether src 00:11:22:33:44:55   # 源MAC地址
ether dst 00:11:22:33:44:55   # 目的MAC地址

3.2.5 复合条件过滤

复制代码
# 捕获192.168.1.1到192.168.1.2的HTTP流量
host 192.168.1.1 and host 192.168.1.2 and port 80

# 捕获非HTTP和非DNS的TCP流量
tcp and not port 80 and not port 53

# 捕获长度大于1000字节的数据包
greater 1000

# 捕获广播或多播流量
broadcast or multicast

3.3 捕获过滤器与显示过滤器的区别

特性 捕获过滤器 显示过滤器
应用时机 捕获数据包时 捕获后分析时
语法 使用BPF语法 使用Wireshark特定语法
效率 减少捕获数据量 不影响原始捕获文件
灵活性 有限 更灵活复杂
可用字段 限于底层协议字段 可访问所有解析字段

4 高级筛选技巧

4.1 使用比较运算符

复制代码
# 查找HTTP响应时间大于1秒的请求
http.time > 1

# 查找TCP窗口大小异常的数据包
tcp.window_size < 1024 or tcp.window_size > 65535

4.2 使用位运算

复制代码
# 检查TCP标志位(例如检查SYN-ACK)
tcp.flags == 0x12            # SYN=1, ACK=1, 其他=0

# 检查IP分片标志
ip.flags.mf == 1             # 更多分片标志置位

4.3 使用范围检查

复制代码
# 查找HTTP响应码在400-499之间的错误
http.response.code >= 400 and http.response.code <= 499

# 查找特定时间范围内的数据包
frame.time >= "2023-01-01" and frame.time <= "2023-01-02"

4.4 使用协议层次关系

复制代码
# 查找HTTP over SSL/TLS
ssl.record.content_type == 23 and http

# 查找DNS over TCP
tcp.port == 53 and dns

4.5 使用自定义列作为过滤条件

复制代码
# 如果添加了自定义列"my_column",可以这样过滤
_ws.col.my_column == "some_value"

5 实用筛选示例

5.1 分析网络问题

复制代码
# 查找重传数据包
tcp.analysis.retransmission

# 查找零窗口数据包
tcp.analysis.zero_window

# 查找重复ACK
tcp.analysis.duplicate_ack

# 查找连接重置
tcp.flags.reset == 1

5.2 安全分析

复制代码
# 查找可能的端口扫描
tcp.flags.syn == 1 and tcp.flags.ack == 0

# 查找ICMP重定向
icmp.type == 5

# 查找ARP欺骗
arp.dst.hw_mac != arp.dst.proto_ipv4

5.3 性能分析

复制代码
# 查找大文件传输
tcp.len > 1400

# 查找高延迟ACK
tcp.analysis.ack_lost_segment

# 查找HTTP慢响应
http.time > 2

6 过滤器自动补全和验证

Wireshark提供了方便的过滤器自动补全功能:

  1. 在过滤器栏输入时,按Ctrl+Space可以触发自动补全
  2. 输入过程中,Wireshark会实时验证语法:
    • 绿色背景:有效过滤器
    • 红色背景:语法错误
    • 黄色背景:语法正确但字段可能不存在于当前捕获文件中

7 保存和重用过滤器

  1. 可以点击过滤器栏右侧的"+"按钮保存常用过滤器
  2. 通过"Analyze" → "Display Filters"管理保存的过滤器
  3. 捕获过滤器可以保存在捕获配置中

8 查找协议字段的方法

在Wireshark中,你可以通过以下方式查找特定协议的字段:

  1. 选择一个相关数据包

  2. 在数据包详细信息面板中展开协议

  3. 右键点击你感兴趣的字段

    如下图:

  4. 选择"Apply as Filter"或"Prepare as Filter"

    如下图:

这样Wireshark会自动生成正确的过滤表达式。如下图:

8 注意事项

  1. 显示过滤器使用BPF(Berkeley Packet Filter)语法,而捕获过滤器使用libpcap语法
  2. 显示过滤器比捕获过滤器更灵活,支持更多协议和字段
  3. 复杂的捕获过滤器可能会影响捕获性能
  4. 某些协议字段可能只在特定版本或特定配置的Wireshark中可用
  5. 显示过滤器不会修改原始捕获文件,只是改变显示内容
  6. 捕获过滤器会丢弃不符合条件的数据包,无法恢复
  7. 过滤器语法区分大小写,协议和字段通常是小写

通过熟练掌握Wireshark的筛选功能,可以快速定位网络问题,分析特定流量,大大提高网络故障排查的效率。

相关推荐
老六ip加速器39 分钟前
手机IP地址更换的影响与方法
网络协议·tcp/ip·智能手机
西装没钱买7 小时前
C语言多进程TCP服务器与客户端
服务器·c语言·tcp/ip·进程
xiaohanbao098 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
互联网杂货铺9 小时前
如何使用Postman做接口自动化测试
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
CatalyzeSec9 小时前
【插件推荐】WebRTC Protect — 防止 IP 泄漏
网络·webrtc
大公产经晚间消息9 小时前
蚂蚁集团法人变更:韩歆毅接任,公司治理的正常安排
网络
国际云,接待9 小时前
AWS S3:云存储的“超级基石”
服务器·网络·人工智能·github·aws·亚马逊
Turing-01012 小时前
《HarmonyOSNext的ForEach数组渲染の核心玩法与避坑指南》
linux·服务器·网络
没有钱的钱仔12 小时前
python文件传输 带进度条
服务器·网络·python
frank006007113 小时前
戴尔 17G 服务器 E610 OCP千兆网卡驱动安装
服务器·网络·开闭原则