捕获过滤器的BPF语法

使用BPF语法创建的过滤器被称为表达式,并且每个表达式包含一个或多个原语。每个原语包含一个或多个限定词,然后跟着一个ID名字或数字

限定词 说明 例子
类型限定词 指出名字或数字所代表的意义 host、net、host
传输方向限定词 指明传输方向是前往还是来自名字或数字 src、dst
协议限定词 限定所要匹配的协议 ether、ip、tcp、udp、http、ftp

可以使用以下3种逻辑运算符,对原语进行组合,从而创建更高级的表达式

捕获过滤器语法.drawio

  • 连接运算符 与(&&)
  • 选择运算符 或(||)
  • 否定运算符 非(!)

例如,源地址是192.168.0.10 并且 源或目标端口是80:

1
src 192.168.0.10 && port 80

Type:设置数字或者名称所指的类型,例如host www.baidu.com

  • hostport
  • net,设定子网,如 net 192.168.0.0 mask 255.255.255.0 等价于 net 192.168.0.0/24
  • portrange,设置端口范围,例如 portrange 6000-8000

Dir:设置网络出入方向,例如 dst port 80

  • srcdstsrcsrc or dstsrc and dstsrc 表示源,dst 表示目标)
  • rataaddr1addr2addr3addr4、(仅对 IEEE 802.11 Wireless LAN有效)

Proto:指定协议类型,例如 udp

  • etherfdditrwlanipip6arprarpdecnettcpudpicmpigmpicmpigrppimahespvrrp

其他

  • geteway:指明网关 IP 地址,等价于 ether host $ehost and not host $host
  • broadcast:广播报文,例如ether broadcast 或者 ip broadcast
  • multicast:多播报文,例如 ip multicast 或者 ip6 multicast
  • lessgreater小于或者大于

主机名和地址过滤器

可以根据设备的MAC地址、ipv4地址、ipv6地址或者DNS主机名配置过滤规则

1
2
3
4
5
6
7
8
# 根据IPv4地址过滤
host 172.16.16.149
# 根据IPv6地址过滤
host 2001:db8:85a3:8a2e:370:7334
# 根据主机名过滤
host testserver2
# 根据MAC地址过滤
ether host 00-1a-a0-52-e2-a0

传输方向限定词用来捕获流向或流出某台主机的流量

1
2
3
4
5
6
# 捕获来自某台主机的流量
src host 172.16.16.149
# 捕获流出某台主机的流量
dst host 172.16.16.149
# 没有类型限定符时默认为host
dst 173.16.16.149

端口和协议过滤器可以对基于每个数据包的端口进行过滤,端口过滤通常被用来过滤使用已知端口的服务和应用。端口过滤器可以和传输方向限定词一起使用

1
2
3
4
5
6
# 捕获8080端口的流量
port 8080
# 捕获8080端口外的流量
!port 8080
# 只捕获前往监听标准HTTP 80端口的Web服务器的流量
dst port 80

协议过滤器协议过滤器可以基于特定协议进行数据包过滤,这通常被用于那些不是应用层的不能简单地使用特定端口进行定义的协议

1
2
3
4
# 捕获ICMP流量
icmp
# 捕获除了ipv6之外的所有流量
!ip6

协议域过滤器可以通过检查协议头中的每一个字节来创建基于那些数据的特殊过滤器

& 指定在字节中检查的比特位置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 字节偏移量为0的位置为3的ICMP数据包
icmp[0]==3
# 检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包
icmp[0]==8||icmp[0]==0
# 检查数据包头部偏移了为0处的2个字节的ICMP过滤器,并与十六进制0301进行比较
icmp[0:2]==0x0301
# 只捕获带有RST标志的TCP数据包
tcp[13]&4==4
# 只捕获带有PSH标志的TCP数据包
tcp[13]&8==8

抓取 HTTP GET 报文:

1
port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420

注意 47455420 是 ASCII 码的 16 进制,表示 ‘GET’,TCP 报文头可能不只 20 字节,data offset 提示了承载数据的偏移,但它以 4 字节为单位

显示过滤器

比较操作符:==,!=,>,<,>=,<=

逻辑操作符:and,or,xor(有且仅有一个条件被满足),not

过滤器 说明
tcp.port==3389 排除RDP流量
tcp.flags.syn==1 具有SYN标志位的TCP数据包
tcp.flags.rst==1 具有RST标志位的TCP数据包
!arp 排除ARP流量
http 所有HTTP流量
tcp.port==23 || tcp.port==21 文本管理流量(Telnet或FTP)
smtp || pop || imap 文本email流量(SMTP、POP或IMAP)

Wireshark高级特性

统计窗口

Endpoint统计窗口(统计->Endpoints)给出了每一端点的许多有用的统计数据

会话统计窗口(统计->Conversations)显示了会话中端点的地址,以及每个设备发送或受到的数据包和字节数

协议分级统计窗口(统计->协议分级)查看正在使用协议的分布情况,提供一个网络中活动类型的直观快照,来得到网络中用户和设备的情况

名字解析

MAC地址解析:使用ARP协议将MAC地址转为IP地址,兜底策略为转换到设备IEEE指定制造商名称

网络名称解析:将IP地址解析为易读的主机名称

传输名称解析:将端口号转为一个与之相关的名字,如80端口显示为HTTP

数据包长度

统计->分组长度

较大的数据包通常是用于数据,而较小的数据包则一般是协议控制序列。

协议解析

更换解析器:右键,Decode As,在“当前”里修改解析器

解析器源码:epan/dissectors · master · Wireshark Foundation / wireshark · GitLab 名称为:packet-协议名.c

跟踪TCP流

Wireshark能将流重组成容易阅读的格式,可以将从客户端发往服务器的数据排好顺序使之容易查看,而不需要一小块一小块地看。这在查看HTTP、FTP等纯文本应用层协议时非常好用

右键,跟踪流,TCP流,这时TCP流就会在一个单独的窗口中显示出来。红色标明从源地址前往目标地址的流量,蓝色用来区分相反方向,颜色标记以哪方先开始通信为准。

图形展示

查看IO图(统计->I/O Graphs):可以对网络上的吞吐量进行绘图,显示捕获过程中每个周期的数据包的数量

双向时间图(统计->TCP流图形->往返时间):数据包已被成功接收所需的时间,每个点都代表了一个数据包的双向时间,默认按序列号排序。

数据流图(统计->流量图):数据流绘图功能对于将连接可视化,以及将一段时间中的数据流显示出来非常有用。数据流图一般以列的方式将主机之间的连接显示出来,并将数据流组织到一起,以便更直观地解读。

专家信息

分析->专家信息:可以得到使用这个协议的数据包中一些特定状态的信息。分为4类:

  • 对话信息:窗口更新
  • 注意信息:TCP重传输、重复ACK、零窗口探查、保活ACK、零窗口探查ACK、窗口已满
  • 警告信息:上一段丢失、收到丢失数据包的ACK、保活、零窗口、乱序、快速重传输
  • 错误信息

地址解析协议ARP

RFC:https://www.rfc-editor.org/rfc/rfc826.txt

将IP地址解析为MAC地址的过程称为地址解析协议(Address Resolution Protocol,ARP)。这个协议在RFC826中进行了定义,它的解析过程只使用两种数据包:一个ARP请求与一个ARP响应

ARP协议.drawio

一旦这个解析过程完成了,传输设备就会对这个设备MAC和IP对应关系的缓存进行更新,并且开始传输数据。

screenshot-20211222013912

  • 硬件类型:数据链路层使用的类型,一般是以太网(类型1)
  • 协议类型:ARP请求正在使用的高层协议
  • 硬件地址长度
  • 协议地址长度
  • 操作:ARP数据包的功能。1:请求,2:响应
  • 发送方硬件地址
  • 发送方协议地址
  • 目标硬件地址。ARP请求中为0
  • 目标协议地址

ARP请求:

screenshot-20211222014645

ARP响应:

screenshot-20211222014709

无偿ARP

一个设备的IP地址是可以改变的,此时网络主机中缓存的IP和MAC地址映射就不再有效了。为了防止造成通信错误,无偿的ARP请求会被发送到网络中,强制所有收到它的设备去用新的IP和MAC地址映射更新缓存

无偿ARP的发送方IP地址和目标IP地址是相同的。

ARP探针是一个全0 IP地址的广播请求,用来检测IPv4地址冲突。在开始使用一个IP地址之前,实现这个规范(RFC5227)的主机必须通过ARP探针测试地址是否被使用。

IP协议

RFC791

IPv4头

screenshot-20211222015520

  • 版本号:IP所使用的版本
  • 首部长度:IP头的长度
  • 服务类型:优先级标志位和服务类型标志位,被路由器用来进行流量的优先级排序
  • 总长度:IP头与数据包中数据的长度
  • 标识符:一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序
  • 标记:用来标记一个数据包是否是一组分片数据包的一部分
  • 分片偏移:一个数据包时一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装
  • 存活时间:用来定义数据包的生命周期,以经过路由器的跳数/描述进行描述
  • 协议:用来标识在数据包序列中上层协议数据包的类型
  • 首部校验和:一个错误检测机制,用来确认IP头部的内容没有被损坏或者篡改(算的是哪一部分的?)
  • 源IP地址
  • 目的IP地址
  • 选项:保留作额外的IP选项,它包含着源站路由和时间戳的一些选项
  • 数据

IP分片

  1. 设备将数据分为若干个可成功进行传输的数据包
  2. 每个IP头的总长度域会被设置为每个分片的片段长度
  3. 除了最后一个数据包,更多分片标志将会在数据流的所有数据包中设置为1
  4. IP头中分片部分的分片偏移将会被设置。分片偏移=MTU-上一个分片的数据包的IP头长度(若无选项,则为20字节)
  5. 发送数据包

传输控制协议TCP

RFC793

screenshot-20211222020034

  • 源端口
  • 目的端口
  • 序号:用来标识一个TCP片段。这个域用来保证数据流中的部分没有缺失
  • 确认号:通信中希望从另一个设备得到的下一个数据包的序号
  • 标记:URG、ACK、PSH、RST、SYN、FIN标记都是用来标识所传输的TCP数据包的类型
  • 窗口大小:TCP接收者缓冲的字节大小
  • 校验和:用来保证TCP的头和数据的内容在抵达目的地时的完整性
  • 紧急指针:如果设置了URG位,这个域将被检查作为额外的指令,告诉CPU从数据包的哪里开始读取数据
  • 选项:各种可选的域,可以在TCP与数据包中进行指定
  • TCP的三次握手
  • 握手过程的目的:
  • 保证源主机确定目的主机在线,并且可以进行通信
  • 让源主机检查它是否在监听试图去连接的端口
  • 允许源主机向接收者发送它的初始序列号,使得两台主机可以将数据包流保持有序

三次握手

  1. A->B: SYN 序列号=x
  2. B->A: SYN+ACK 序列号=y 确认号=x+1
  3. A->B: ACK 序列号=x+1 确认号=y+1

四次挥手

  1. A->B: FIN+ACK  序列号=x 确认号=y
  2. B->A: ACK 序列号=y 确认号=x+1
  3. B->A: FIN+ACK 可能:序列号=y 确认号=x+1
  4. A->B: ACK 序列号=x+1 确认号=y+1

TCP重置

RST标志用来指出连接被异常中止或拒绝连接请求。 RST数据包除了包含RST和ACK标志外,没有任何其他的东西,之后也并没有额外的通信。 RST数据包可以在通信序列的开始或者主机通信的过程中终止通信。

用户数据包协议UDP

UDP主要是为了提供高速的传输,是一种尽力服务,被称为无连接协议,并不会正式地建立和结束主机之间的连接,也没有TCP那样的握手和终止过程。

无连接协议意味着不可靠服务,这将使得UDP流量不稳定,但依赖于UDP的协议通常都会有内置的可靠性服务,或者使用ICMP的一些功能来保证连接更可靠

UDP并不关心传输的可靠性,所以任何使用UDP的应用在必要的时候都需要采取特殊的步骤,以保证可靠的传输

screenshot-20211222020218

  • 数据包长度:数据包的字节长度
  • 校验和:用来确保UDP的头和数据到达时的完整性

screenshot-20211222020239

互联网控制消息协议ICMP

RFC792

screenshot-20211222020500

ICMP是IP的一部分并依赖IP来传递信息。ICMP头相对较小并根据用途而改变。

  • 类型:ICMP消息基于RFC规范的类型或分类
  • 代码:ICMP消息基于RFC规范的子类型
  • 校验和:用来保证ICMP头和数据在抵达目的地时的完整性
  • 可变域:依赖于类型和代码域的部分

ICMP数据包的结构取决于它由类型和代码域中的值所定义的用途

使用ping命令可以发送echo请求:echo请求和响应有着不同的Type,有着相同的序列号说明响应与请求匹配, 响应数据包中有着和请求中传输的字符串一样的内容。