Wireshark 筛选功能详解:语法与示例
文章目录
- 1 摘要
- 2 显示过滤器(Display Filters)
- 2.1 基本语法结构
- 2.1.1 常用运算符
- 2.1.2 常用协议字段示例
- 2.1.2.1 IP协议过滤
- 2.1.2.2 TCP协议过滤
- 2.1.2.3 UDP协议过滤
- 2.1.2.4 HTTP协议过滤
- 2.1.2.5 DNS协议过滤
- 2.1.2.6 ARP协议过滤
- 2.1.2.7 ICMP协议过滤
- 2.1.3 复合表达式示例
- 3 捕获过滤器(Capture Filters)
- 3.1 基本语法
- 3.2 常用捕获过滤器示例
- 3.2.1 基本主机/端口过滤
- 3.2.2 协议过滤
- 3.2.3 网络范围过滤
- 3.2.4 MAC地址过滤
- 3.2.5 复合条件过滤
- 3.3 捕获过滤器与显示过滤器的区别
- 4 高级筛选技巧
- 4.1 使用比较运算符
- 4.2 使用位运算
- 4.3 使用范围检查
- 4.4 使用协议层次关系
- 4.5 使用自定义列作为过滤条件
- 5 实用筛选示例
- 5.1 分析网络问题
- 5.2 安全分析
- 5.3 性能分析
- 6 过滤器自动补全和验证
- 7 保存和重用过滤器
- 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提供了方便的过滤器自动补全功能:
- 在过滤器栏输入时,按
Ctrl+Space
可以触发自动补全 - 输入过程中,Wireshark会实时验证语法:
- 绿色背景:有效过滤器
- 红色背景:语法错误
- 黄色背景:语法正确但字段可能不存在于当前捕获文件中
7 保存和重用过滤器
- 可以点击过滤器栏右侧的"+"按钮保存常用过滤器
- 通过"Analyze" → "Display Filters"管理保存的过滤器
- 捕获过滤器可以保存在捕获配置中
8 查找协议字段的方法
在Wireshark中,你可以通过以下方式查找特定协议的字段:
-
选择一个相关数据包
-
在数据包详细信息面板中展开协议
-
右键点击你感兴趣的字段
如下图:
-
选择"Apply as Filter"或"Prepare as Filter"
如下图:
这样Wireshark会自动生成正确的过滤表达式。如下图:
8 注意事项
- 显示过滤器使用BPF(Berkeley Packet Filter)语法,而捕获过滤器使用libpcap语法
- 显示过滤器比捕获过滤器更灵活,支持更多协议和字段
- 复杂的捕获过滤器可能会影响捕获性能
- 某些协议字段可能只在特定版本或特定配置的Wireshark中可用
- 显示过滤器不会修改原始捕获文件,只是改变显示内容
- 捕获过滤器会丢弃不符合条件的数据包,无法恢复
- 过滤器语法区分大小写,协议和字段通常是小写
通过熟练掌握Wireshark的筛选功能,可以快速定位网络问题,分析特定流量,大大提高网络故障排查的效率。