今天我们来学习下Wireshark过滤器表达式原理
前言
Wireshark 是一款流行的网络协议分析工具,它允许用户通过过滤器表达式来筛选捕获的数据包。过滤器表达式基于特定语法来定义哪些数据包应该被显示或忽略。
1.过滤器操作
过滤器是Wireshark的核心功能,也是我们平时使用最多的一个功能。Wireshark提供了两个过滤器:抓包过滤器 和 显示过滤器。两个过滤器的过滤思路不同。
抓包过滤器:重点在动作,需要的包我才抓,不需要的我就不抓。
显示过滤器:重点在数据的展示,包已经抓了,只是不显示出来。
1.1. 抓包过滤器
抓包过滤器在抓包前使用,它的过滤有一个基本的语法格式:BPF语法格式。
BPF(全称 Berkeley Packet Filter),中文叫伯克利封包过滤器,它有四个核心元素:类型、方向、协议 和 逻辑运算符。
- 类型Type:主机(host)、网段(net)、端口(port)
- 方向Dir:源地址(src)、目标地址(dst)
- 协议Proto:各种网络协议,比如:tcp、udp、http
- 逻辑运算符:与( && )、或( || )、非( !)
四个元素可以自由组合,比如:
- src host 192.168.31.1:抓取源IP为 192.168.31.1 的数据包
- tcp || udp:抓取 TCP 或者 UDP 协议的数据包
1.2 抓包过滤器使用方式
使用抓包过滤器时,需要先停止抓包,设置完过滤规则后,再开始抓包。
停止抓包的前提下,点击工具栏的捕获按钮,点击选项。
在弹出的捕获选项界面,最下方的输入框中输入过滤语句,点击开始即可抓包。
提示:抓包过滤器的输入框,会自动检测语法,绿色代表语法正确,红色代表语法错误。
1.3 显示过滤器
显示过滤器在抓包后或者抓包的过程中使用。
1)语法结构
显示过滤器的语法包含5个核心元素:IP、端口、协议、比较运算符和逻辑运算符。
- IP地址:ip.addr、ip.src、ip.dst
- 端口:tcp.port、tcp.srcport、tcp.dstport
- 协议:tcp、udp、http
- 比较运算符:> < == >= <= !=
- 逻辑运算符:and、or、not、xor(有且仅有一个条件被满足)
5个核心元素可以自由组合,比如:
- ip.addr == 192.168.32.121:显示IP地址为 192.168.32.121 的数据包
- tcp.port == 80 :显示端口为 80 的数据包
1.4 Wireshark 显示过滤器常见表达式
在过滤栏输入过滤语句,修改后立即生效。
协议过滤:使用协议名称来过滤数据包,例如 ip
、tcp
、udp
、http
等(注意过滤协议都是小写名称)。
示例:tcp
仅显示 TCP 协议的数据包。
地址过滤:根据源地址或目的地址过滤数据包。
示例:ip.src == 221.176.200.30
仅显示源地址为 221.176.200.30 的数据包。
端口过滤:根据端口号过滤数据包。
tcp.port eq 80 // 不管端口是来源的还是目标的都显示
tcp.port == 80
tcp.port eq 2722
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 // 只显tcp协议的目标端口80
tcp.srcport == 80 // 只显tcp协议的来源端口80
udp.port eq 15000
示例:tcp.dstport == 80
仅显示目标端口为 80 的数据包。
逻辑运算符:使用逻辑运算符来组合多个过滤条件。
and
或&&
:逻辑与,所有条件必须满足。or
或||
:逻辑或,至少一个条件满足。not
或!
:逻辑非,排除条件。
示例:tcp.port >= 20 and tcp.port <= 80
仅显示 TCP 协议且端口为 20到80 的数据包。
示例:排除arp包,如!arp 或者 not arp
比较运算符:对数值进行比较。
>
:大于<
:小于>=
:大于等于<=
:小于等于==
:等于
udp.length == 26 这个长度是指udp本身固定长度8加上udp下面那块数据包之和
tcp.len >= 7 指的是ip数据包(tcp下面那块数据),不包括tcp本身
ip.len == 94 除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后
frame.len == 119 整个数据包长度,从eth开始到最后
eth —> ip or arp —> tcp or udp —> data
示例:tcp.len >= 100
仅显示 TCP 数据包长度大于或等于 100 的数据包。
正则表达式:使用正则表达式匹配字符串。
示例:http.host matches "int.dpool.sina.com.cn" 匹配 HTTP 请求中主机为 "int.dpool.sina.com.cn" 的数据包。
协议特定的过滤:针对特定协议的字段进行过滤。
http.request.method == “GET”
http.request.method == “POST”
http.request.uri == “/img/logo-edu.gif”
http contains “GET”
http contains “HTTP/1.”
// GET包
http.request.method == “GET” && http contains “Host: “
http.request.method == “GET” && http contains “User-Agent: “
// POST包
http.request.method == “POST” && http contains “Host: “
http.request.method == “POST” && http contains “User-Agent: “
// 响应包
http contains “HTTP/1.1 200 OK” && http contains “Content-Type: “
http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “
一定包含如下
Content-Type:
示例:http.request.uri contains "iplookup"
显示包含 "iplookup" 字符串的 HTTP 请求 URI。
括号:使用括号来分组逻辑表达式,确保运算符的优先级。
示例:((tcp or udp) and not icmp)
显示 TCP 或 UDP 协议的数据包,但不显示 ICMP。
协议分层路径:使用协议分层路径来指定过滤条件。
示例:frame.number == 8
仅显示编号为 8 的帧。
范围过滤:选择一系列连续的帧。
示例:frame.number >= 1 and frame.number <= 10
显示编号在 1 到 10 之间的帧。
11.TCP参数过滤
tcp.flags 显示包含TCP标志的封包。
tcp.flags.syn == 0x02 显示包含TCP SYN标志的封包。
tcp.window_size == 0 && tcp.flags.reset != 1
使用这些原则和示例,用户可以构建复杂的过滤器表达式来精确地捕获和分析网络流量。当然实际应用中还有很多其他高级用法,我们后续将继续讲解哈!
结束语
本篇文章来源于: 风云说通信
版权声明:欢迎分享本文,转载请保留出处!