目录
1 wireshark过滤器
1.1 捕获过滤器
设置目的
工作原理
注意事项
设置步骤
1.2 显示过滤器
设置目的
工作原理
注意事项
设置步骤
过滤关系
复合过滤表达式
2 常见显示过滤需求及其表达式
2.1 数据链路层
2.2 网络层
2.3 传输层
2.4 应用层
2.5 其他常见
3 使用wireshark分析TCP三次握手
4 使用wireshark分析TCP数据包
1 wireshark过滤器
初学者在使用Wireshark时,经常会遇到大量冗余的数据包,这使得在海量数据中定位自己关心的数据包变得非常困难。为了解决这个问题,Wireshark提供了两种类型的过滤器:捕获过滤器和显示过滤器。掌握这两种过滤器的使用,将极大地帮助你在复杂的网络数据中迅速找到所需的信息。
1.1 捕获过滤器
捕获过滤器(Capture Filter)是Wireshark等网络分析工具中的一个功能,用于在数据包被捕获到计算机内存之前对它们进行过滤。捕获过滤器使用BPF(Berkeley Packet Filter)语法来定义规则,这些规则决定了哪些数据包应该被网卡捕获并传递给Wireshark进行分析。
设置目的
设置捕获过滤器的主要目的是减少捕获的数据量,以便更高效地分析网络流量。由于网卡捕获的数据包通常会很快填满计算机的内存,如果不加过滤,可能会导致数据丢失或分析变得困难。通过使用捕获过滤器,可以指定只捕获感兴趣的数据包,从而节省内存和计算资源。
工作原理
捕获过滤器的工作原理是在数据包被发送到网络适配器(如以太网卡)的驱动程序之前,由操作系统根据设置的过滤规则进行过滤。只有符合过滤规则的数据包才会被捕获并传递给网络分析工具。
注意事项
捕获过滤器是在数据包被捕获之前应用的,因此它不会影响已经捕获到内存中的数据包。如果您在捕获过程中更改了捕获过滤器的设置,只有新捕获的数据包会受到影响,已经捕获的数据包不会改变。
设置步骤
点击捕获选项按钮:
混杂模式(Promiscuous Mode)的主要作用就是使网卡能够接收所有经过它的数据流,不论这些数据流的目的地址是否是它本身。
在默认情况下,网卡通常只接收发往其自己地址(即目的地址为其MAC地址)的数据包,以及广播和组播数据包。但是,当网卡被设置为混杂模式时,它会捕获所有流经其接口的数据包,包括那些目的地址不是其自身的数据包。
1.2 显示过滤器
显示过滤器(Display Filter) 是网络数据包分析工具(如 Wireshark)中的一种功能,用于在已经捕获的网络数据包集合中过滤出满足特定条件的数据包进行显示。这些条件可以基于数据包的各个字段(如源地址、目标地址、端口号、协议类型等)来设置。
设置目的
显示过滤器的设置目的是为了在捕获文件已经存在的情况下,进一步过滤和筛选数据包,以便更精确地分析网络流量。通过设置显示过滤器,用户可以选择只显示那些符合特定条件的数据包,从而忽略掉那些不感兴趣或不需要分析的数据包。这样可以大大提高网络流量分析的效率和准确性。
工作原理
显示过滤器的工作原理是在数据包已经被捕获到内存之后,根据用户设置的过滤条件对数据包进行筛选和过滤。在Wireshark等网络分析工具中,显示过滤器使用一种特定的语法规则来定义过滤条件,这些条件可以基于数据包的各个字段(如源地址、目标地址、端口号、协议类型等)进行设置。
当用户设置了一个显示过滤器后,Wireshark会在显示数据包列表之前,根据过滤条件对数据包进行遍历和匹配。只有那些符合过滤条件的数据包才会被显示出来,而那些不符合条件的数据包则会被忽略。这样,用户就可以只关注那些自己感兴趣的数据包,而不需要在大量的数据包中手动查找。
注意事项
显示过滤器并不会删除或修改捕获文件中的数据包,它只是改变了Wireshark在显示数据包时的行为。因此,即使设置了显示过滤器,用户仍然可以随时删除或修改过滤条件,以恢复原始的数据包显示状态。
此外,由于显示过滤器是在数据包已经被捕获到内存之后应用的,因此它不会影响已经捕获到内存中的数据包。如果用户需要再次分析这些数据包,只需要重新加载捕获文件并设置相应的显示过滤器即可。
设置步骤
右键,显示表达式
一条基本的表达式由过滤项、过滤关系、过滤值三项组成。
比如:http contains baidu.com, http为过滤项, contains 为过滤关系, baidu.com 为过滤
值,表示显示http协议包中包含关键词"baidu.com"的所有数据包。
比如:ip.addr == 192.168.1.1,ip.addr是过滤项、==是过滤关系,192.168.1.1是过滤值,表达示的意思是找出所有ip协议中源或目标ip 等于 192.168.1.1的数据包。
配置后,就会自动生成过滤语句:
熟练使用wirshark后,可直接在此处填写过滤语句,效率更高。
因为去过滤表达式中一个一个找过滤项太麻烦了。
过滤关系
English | C-like | 说明 | 示例 |
---|---|---|---|
eq | == | 等于 (Equals) | ip.addr eq 192.168.1.1 筛选源或目标 IP 地址为 192.168.1.1 的数据包 |
ne | != | 不等于 (Not Equals) | tcp.port ne 80 筛选 TCP 端口号不是 80 的数据包 |
gt | > | 大于 (Greater Than) | frame.len gt 100 筛选帧长度大于 100 字节的数据包 |
lt | < | 小于 (Less Than) | frame.len lt 500 筛选帧长度小于 500 字节的数据包 |
ge | >= | 大于等于 (Greater Than or Equals) | tcp.seq ge 1000 筛选 TCP 序列号大于或等于 1000 的数据包 |
le | <= | 小于等于 (Less Than or Equals) | frame.number le 10 筛选前 10 个捕获的数据包 |
contains | (无) | 包含 (Contains) | http.request.uri contains "/search?" 筛选 HTTP 请求 URI 中包含 "/search?" 的数据包 |
matches | (无) | 匹配 (Matches),通常使用正则表达式 | ip.src matches "\b192\.168\.\d{1,3}\.\d{1,3}\b" 筛选源 IP 地址在 192.168.x.x 范围内的数据包 |
bitwise_and | & | 位与 (Bitwise AND) | 通常不常用在显示过滤器中,但可用于高级过滤需求,如 tcp.flags.syn & tcp.flags.ack == 1 筛选同时具有 SYN 和 ACK 标志的 TCP 数据包 |
复合过滤表达式
在Wireshark中,复合过滤表达式允许你将多个基本过滤表达式组合在一起,以创建更复杂的过滤条件。这些复合过滤表达式通常使用逻辑操作符(如 and
、or
和 not
)来连接基本过滤表达式。
以下是重新整理后的表格,包含了复合过滤表达式的英文单词、符号、说明以及示例:
English | C-like | 说明 | 示例 |
---|---|---|---|
and | && | 逻辑与,表示两个条件都必须满足 | ip.src == 192.168.1.1 && tcp.dstport == 80 ip.src == 192.168.1.1 and tcp.dstport == 80 筛选出所有源IP地址为 192.168.1.1 并且目的TCP端口为 80 的数据包。 |
or | || | 逻辑或,表示两个或更多条件中至少有一个满足 | ip.src == 192.168.1.1 || ip.dst == 10.0.0.1 ip.src == 192.168.1.1 or ip.dst == 10.0.0.1 筛选出所有源IP地址为 192.168.1.1 或者目的IP地址为 10.0.0.1 的数据包。 |
xor | ^^ | 逻辑异或,表示两个条件中只有一个满足 | 可以使用 && (逻辑与)和 ! (逻辑非)来模拟 xor (逻辑异或)的行为。(ip.src == 192.168.1.1 && !ip.dst == 10.0.0.1) || (!ip.src == 192.168.1.1 && ip.dst == 10.0.0.1) 筛选出所有源IP地址为 192.168.1.1 但目的IP地址不是 10.0.0.1 的数据包,或者源IP地址不是 192.168.1.1 但目的IP地址是 10.0.0.1 的数据包。 |
not | ! | 逻辑非,表示条件不满足 | !tcp.dstport == 80 not tcp.dstport == 80 筛选出所有目的TCP端口不是80的数据包。 |
[...] | (无直接符号) | 范围匹配,用于匹配字段的某个范围内的值 | 可以使用比较运算符(如>= 、<= )来指定一个值的范围。frame.number >= 10 and frame.number <= 20 当这两个条件同时满足时(即帧号在10到20之间,包括10和20),数据包就会被筛选出来。 |
in | (无直接符号,但可以用== 或matches 代替) | 集合匹配,用于匹配字段的某个集合中的值 | 可以使用== (等于)或matches (匹配)操作符与多个条件组合来实现类似的功能。ip.src == 192.168.1.1 or ip.src == 192.168.1.2 or ip.src == 10.0.0.1 ip.src matches "192.168.1.(1|2)|10.0.0.1" 正则表达式中的 | 表示逻辑或,(1|2) 表示匹配数字1或2,而整个表达式则匹配IP地址192.168.1.1 、192.168.1.2 或10.0.0.1 。 |
示例:执行ping www.baidu.com
ping 命令用的是ICMP 协议。
获取的数据包列表如下:
2 常见显示过滤需求及其表达式
2.1 数据链路层
- 筛选mac地址为04:f9:38:ad:13:26的数据包:
eth.addr== 04:f9:38:ad:13:26
- 筛选源mac地址为04:f9:38:ad:13:26的数据包:
eth.src == 04:f9:38:ad:13:26
2.2 网络层
- 筛选ip地址为192.168.1.1的数据包:
ip.addr == 192.168.1.1
或ip.src == 192.168.1.1
或ip.dst == 192.168.1.1
(取决于是否只关心源或目的IP) - 筛选192.168.1.0网段的数据:
ip.addr contains 192.168.1
(注意这可能也会匹配到192.168.10.x这样的地址,更精确的是使用CIDR表示法如ip.src cidr 192.168.1.0/24
) - 筛选192.168.1.1和192.168.1.2之间的数据包:
ip.addr == 192.168.1.1 && ip.addr == 192.168.1.2
- 筛选从192.168.1.1到192.168.1.2的数据包:
ip.src == 192.168.1.1 && ip.dst == 192.168.1.2
2.3 传输层
- 筛选tcp协议的数据包:
tcp
- 筛选除tcp协议以外的数据包:
!tcp
- 筛选端口为80的数据包:
tcp.port == 80
- 筛选12345端口和80端口之间的数据包:
tcp.port == 12345 && tcp.port == 80
- 筛选从12345端口到80端口的数据包:
tcp.srcport == 12345 && tcp.dstport == 80
2.4 应用层
- 特别说明:http中http.request表示请求头中的第一行(如GET index.jsp HTTP/1.1),http.response表示响应头中的第一行(如HTTP/1.1 200 OK),其他头部都用http.header_name形式。
- 筛选url中包含.php的http数据包:
http.request.uri contains .php
- 筛选内容包含username的http数据包:
http contains username
URL(Uniform Resource Locator,统一资源定位符)和URI(Uniform Resource Identifier,统一资源标识符)在Web和网络资源定位中扮演着重要的角色,但它们在定义和用途上有所不同。
URL是用于标识和定位互联网上资源的地址。它是一个标准的格式,用于表示互联网资源的位置,并且可以指向各种类型的资源,如网页、图片、视频、文件等。URL通常由多个部分组成,包括协议类型(如HTTP、HTTPS)、主机名(域名或IP地址)、路径(资源在主机上的位置)以及可选的查询参数(用于传递额外的信息)。通过URL,用户可以方便地访问和定位到特定的网络资源。
URI是一个更广泛的概念,用于标识某一互联网资源名称的字符串。URI允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源(如HTML文档、图像、视频片段、程序等)都由一个URI进行定位。URI可以包括URL和URN(Uniform Resource Name,统一资源名称)两个类别。URL是URI的一个子集,因此所有的URL都是URI,但并非所有的URI都是URL。
总的来说,URL和URI之间的关系可以理解为:URL是URI的一个子集,用于具体地标识和定位互联网上的资源,而URI是一个更广泛的概念,可以包括URL以及其他类型的资源标识符。
2.5 其他常见
- 筛选特定长度的数据包:
frame.len == 100
(其中100是数据包的长度) - 筛选特定时间范围内的数据包:
frame.time >= "2023-10-23 10:00:00" and frame.time <= "2023-10-23 11:00:00"
(注意时间格式可能因Wireshark版本而异) - 筛选特定接口上捕获的数据包:
wlan.iface.name == "Wi-Fi"
(假设你的无线接口名为"Wi-Fi")
3 使用wireshark分析TCP三次握手
第一次握手数据包:客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图:
第二次握手:服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的seq加1,即0+1=1。如下图:
4 使用wireshark分析TCP数据包
使用tcp调试助手向阿里云服务器TCP服务端发送hello,并且接收到服务器返回的hello world
发现wireshark捕获到了四条TCP数据