Wireshark过滤器语法详细指南及相关知识点
Wireshark主要有两种过滤器
1、捕获过滤器:在抓包开始前设置,用于决定哪些数据包被捕获进来。不符合条件的数据包会被直接丢弃。
2、显示过滤器:在抓包完成后使用,用于在已捕获的数据包中查找和显示特定的数据包。它不会删除数据包,只是隐藏不匹配的。
这两种过滤器的语法不同,不能混用。
一、捕获过滤器
捕获过滤器使用Berkeley Packet Filter(BPF)语法。这种语法也被广泛应用于tcpdump 等工具。
1、基本结构
[协议] [方向] [主机] [值] [逻辑运算]
协议:如 ether、ip、ip6、arp、tcp、udp(如果省略,默认匹配所有协议)
方向:如 src、dst、src or dst、src and dst (如果省略,默认为 src or dst)
主机:如 host、net、port
值:如 192.168.1.1 、80 、www.example.com
逻辑运算:如 and(&&)、or(||)、not(!)
2、常用示例
只捕获来自或发往某IP的流量 (192.168.1.1)
host 192.168.1.1
只捕获固定目标端口(如 80 )的TCP流量(HTTP)
tcp dst port 80
排除ARP和DNS流量
not arp and not port 53
捕获特定网段的所有流量
net 192.168.0.0/24
捕获主机之间的流量(如 10.0.0.1 和 10.0.0.2)
host 10.0.0.1 and host 10.0.0.2
二、显示过滤器
显示过滤器的语法更强大、更灵活,使用类似编程语言的表达式。
1、比较运算符
运算符 | 英文描述 | 中文描述 | 示例 |
== | eq | 等于 | ip.src == 192.168.1.1 |
!= | ne | 不等于 | tcp.port != 80 |
> | gt | 大于 | frame.len > 100 |
< | lt | 小于 | http.content_len < 500 |
>= | ge | 大于等于 | tcp.window_size >= 8192 |
<= | le | 小于等于 | frame.time_relative <= 10.0 |
2、逻辑运算符
运算符 | 英文描述 | 中文描述 | 示例 |
and | && | 与 | ip.src==192.168.1.1 and tcp.flags.syn==1 |
or | ` | ` 或 http or dns | |
not | ! | 非 | not arp |
[...] | in | 包含于 | tcp.port in {80 443 8080} |
3、常用协议字段
Wireshark 支持海量的协议字段,可以通过在过滤器输入框输入部分字段名来获得自动提示
IP
ip.addr : IP地址(源或目标)
ip.src : 源IP地址
ip.dst : 目标IP地址
ip.ttl : TTL值
TCP
tcp.port : 端口(源或目标)
tcp.srcport : 源端口
tcp.dstport : 目标端口
tcp.flags.syn : SYN标志位(值为1或0)
tcp.flags.ack : ACK标志位
tcp.window_size : 窗口大小
tcp.analysis.retransmission : 重传的数据包
UDP
udp.port : UDP端口
HTTP
http.request : HTTP请求
http.response : HTTP响应
http.host : Host头
http.request.uri : 请求的URI
http.response.code : 状态码(如 404)
DNS
dns.qry.name : 查询的域名
dns.flags.response : 是响应包(1)还是查询包(0)
通用
frame.time_relative : 相对于第一个数据包的时间
frame.len : 帧长度
4、存在性检查
http :显示所有HTTP流量(只要包包含HTTP协议)
http.option.mss : 显示包含TCP MSS选项的包
5、常用显示过滤器实例
显示所有TCP SYN包(用于查看连接建立)
tcp.flags.syn == 1 and tcp.flags.ack == 0
显示包含特定字符串的流量(如密码)
frame contains "password"
(注意:contains 操作对性能影响较大,谨慎在大文件中使用 )
显示HTTP的GET请求
http.request.method == "GET"
显示所有发生重传的TCP包
tcp.analysis.retransmission
显示源或目标端口为80或443的流量(HTTP/HTTPS)
tcp.port in {80 443}
// 或者
tcp.port == 80 or tcp.port == 443
显示来自特定MAC地址的流量
eth.src == aa:bb:cc:dd:ee:ff
显示所有DNS查询(非响应)
dns.flags.response == 0