过滤器可以让你找出你所希望进行分析的数据包。简单来说,一个过滤器就是定义了一定条件,用来包含或者排除数据包的表达式。如果你不希望看到一些数据包,你可以写一恶搞过滤器来屏蔽它们。如果你希望只看到某些数据包,你可以写一个只显示这些数据包的过滤器。
Wireshark主要提供两种主要的过滤器。
- 捕获过滤器:当进行数据包捕获时,只有那些满足给定的包含/排除表达式的数据包会被捕获。
- 显示过滤器:该过滤器根据指定的表达式用于在一个已捕获的数据包集合中,隐藏不想显示的数据包,或者只显示那些需要的数据包。
这里我们先介绍一下捕获过滤器。
捕获过滤器用于进行数据包补货的是机场和,使用它的一个主要原因就是性能。如果你知道你并不需要分析某个类型的流量,你可以简单地使用捕获过滤器过滤掉它,从而节省那些会被用来捕获这些数据包的处理器资源。
当处理大量数据的时候,创建自定义的捕获过滤器时相当好用的。它可以让你专注于那些与你手头事情有关的数据包,从而加速分析过程。
举个例子,你在一台多角色的服务器上捕获流量时,很可能会用到捕获过滤器,假设你正在解决一个运行于262端口的网络服务问题,如果你正在分析的那台服务器在许多端口运行着各种不同的昂罗服务,找到并分析只运行于262端口的流量本身可能就具有一定的工作量。你可以通过Capture Options对话框达到目的,步骤如下所示。
- 选择捕获->捕获过滤器,然后编辑一个新的捕获过滤器选项:名称为“port 262”(这个可以随便取),过滤器为“port 262”
- 选择“捕获->选项”,然后在对应的网卡的后面(或者选定给定网卡后,在下方的捕获过滤器)中输入“port 262”
- 当你设定好你的过滤器之后,单击“开始”开始捕获。
1.捕获过滤器的BPF语法
捕获过滤器应用于WinPcap,并使用Berkeley Packet Filter(BPF)语法。这个语法被广泛用于多种数据包嗅探软件,主要因为大部分数据包嗅探软件都依赖于使用BPF的libpcap/WinPcap库。掌握BPF语法对你在数据包层级更深入地探索网络来说,非常关键。
使用BPF语法创建的过滤器被称为表达式,并且表达式包含一个或多个原语。每个原语包含一个或多个限定词,然后跟着一个ID名字或者数字,如:
限定词 | 说明 | 例子 |
---|---|---|
Type | 指出名字或数字所代表的意义 | host、net、port |
Dir | 指明传输方向时前往还是来自名字或数字 | src、dst |
Proto | 限定所要匹配的协议 | ether、ip、tcp、udp、http、ftp |
一个捕获过滤器样例
在给定表达式的组成部分中,一个src限定词和192.168.0.10组成了一个原语。这个源于本身就是表达式,可以用它只捕获那些目标IP地址时192.168.0.10的流量。
你可以使用一下3中逻辑运算符,对原语进行组合,从而创建更高级的表达式。
- 连接运算符 与 (&&)
- 选择运算符 或 (||)
- 否定运算符 非 (!)
举例来说,下面的这个表达式只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。
src 192.168.0.10 && port 80
2.主机名和地址过滤器
你所创建的大多数过滤器都会关注与一个或一些特定的网络设备。根据这个情况,可以根据设备的MAC地址、IPv4地址、IPv6地址或者DNS主机名配置过滤规则。
举例来说,假设你对一个正在和你网络中某个服务器进行交互的主机所产生的流量感兴趣,你在这台服务器上可以创建一个使用host限定词的过滤器,来捕获所有和那台主机IPv4地址相关的流量。
host 172.16.16.149
去过你在使用一个IPv6网络,你可能需要使用基于IPv6地址的host限定词进行过滤,如下所示。
host 2001:0:9d38:6ab8:3845:3f91:9aca:947a
你同样可以使用基于一台设备的主机名host限定词进行过滤,就像一下这样。
host testserver2
或者,如果你考虑到一台主机的IP地址可能会变化,你可以通过加入ether协议限定词,对它的MAC地址进行过滤。
ether host 00-1a-a0-52-e2-a0
传输方向限定词通常会和前面例子演示的那些过滤器一起使用,来捕获流向或者流出某台主机的流量。举例来说,如果想捕获来自某台主机的流量,加入src限定词。
src host 172.16.16.149
当你在一个原语中没有指定一种类型限定符(host、net或者port)时,host限定词将作为默认选择。所以上面的那个例子也可以写成没有类型限定符的样子。
dst 172.16.16.149
3.端口和协议过滤器
不仅仅可以基于主机过滤,你还可以对基于每个数据包的端口进行过滤。端口过滤通常被用来过滤使用已知端口的服务和应用。举例来说,下面是一个只对8080端口进行流量捕获的简单过滤器的例子。
port 8080
如果想要捕获除8080端口外的所有流量,如下所示。
!port 8080
端口过滤器可以和传输方向限定符一起使用。举例来说,如果希望只捕获前往监听标准HTTP80端口的Web服务器的流量,使用dst限定符。
dst port 80
4.协议过滤器
协议过滤器可以让你基于特定协议进行数据包过滤。这通常被用于那些不是应用层的不能简单地使用特定端口进行定义的协议。所以如果你只想看看ICMP流量,可以使用下面这个过滤器。
icmp
如果你想看除了IPv6之外的所有流量,下面这个过滤器能够满足要求。
!ip6
5.协议域过滤器
BPF语法提供给我们的一个强大功能,就是hi我们可以通过检查协议头中的每一字节来创建基于那些数据的特殊过滤器。
举例来说,假设我们想要基于ICMP过滤器的类型域进行过滤,而类型域位于数据包最开头也就是偏移量为0的位置,那么我们可以通过在协议限定符后输入由方括号括起的字节偏移量,在这个例子中就是icmp[0],来指定我们想在一个数据包内进行检查的位置。这样将返回一个1字节的整型值用于比较。比如只想要得到代表目标不可达(类型3)信息的ICMP数据包,我们在我们的过滤器表达式中令其等于3,如下所示。
icmp[0]==3
如果只想要检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包,使用带有OR运算符的两个原语。
icmp[0]==8||icmp[0]==0
这些过滤器尽管很好用,但是只能基于数据包头部的1个字节进行过滤。当然,你可以在方括号中偏移值的后面以冒号分割加上一个字节长度,来制定你希望返回给过滤器表达式的数据长度。
举例来说,我们想要创建一个捕获所有以类型3代码1表示的目标不可达、主机不可达的ICMP数据包,它们都是彼此相邻的1字节字段,位于数据包头部偏移量为0的位置。那么我们通过创建一个检查数据包头部偏移量为0处为2个字节数据的过滤器,并与十六进制值0301(类型3、代码1)进行比较,如下所示。
icmp[0:2]==0x0301
一个常用的场景是只捕获带有RST标志的TCP数据包。但是RST位对应的比特位对应tcp[13]这个字节的数值4所在的那个二进制位。所以过滤器看上去是这样的。
tcp[13]&4==4
如果希望所有被设置了PSH标志(比特位代表数字8)的数据包,我们的过滤器应该会将其相应位置替换成这样。
tcp[13]&8==8
6.捕获过滤器表达式样例
常用捕获过滤器
过滤器 | 说明 |
---|---|
tcp[13]&32==32 | 设置了URG位的TCP数据包 |
tcp[13]&16==16 | 设置了ACK位的TCP数据包 |
tcp[13]&8==8 | 设置了PSH位的TCP数据包 |
tcp[13]&4==4 | 设置了RST位的TCP数据包 |
tcp[13]&2==2 | 设置了SYN位的TCP数据包 |
tcp[13]&1==1 | 设置了FIN位的TCP数据包 |
tcp[13]==18 | TCP SYN-ACK数据包 |
ether host 00:00:00:00:00:00(替换为你的MAC) | 流入或流出你MAC地址的流量 |
!ether host 00:00:00:00:00:00(替换为你的MAC) | 不流入或流出你MAC地址的流量 |
broadcast | 仅广播流量 |
icmp | ICMP流量 |
icmp[0:2]==0x0301 | ICMP目标不可达、主机不可达 |
ip | 仅IPv4流量 |
ip6 | 仅IPv6流量 |
udp | 仅UDP流量 |