1
计算机网络技术理论与实践
1.3.3.3 2.3.3 Wireshark包过滤方法

2.3.3 Wireshark包过滤方法

当需要按照需求抓取某些特定的数据包时,可以采用以下两种方法:

·在抓取数据包时,先定义好抓包过滤器,这样Wireshark就只抓取满足过滤条件的那些数据包,其他数据包直接丢弃;

·Wireshark将本机收到或者发出的所有数据包全部抓取下来,然后使用显示过滤器,只让Wireshark显示出满足显示过滤条件的数据包,这种方式的好处是将所有数据包抓取下来,按照用户的观看需求灵活地显示出需要关注的各种数据包。

(1)抓包过滤器

抓包过滤器可以用来抓取感兴趣的包,用在抓包过程中。抓包过滤器使用的是libcap过滤器语言,在Tcpdump的手册中有详细的解释。

抓包过滤器中过滤条件的基本结构是:[not]primitive[and|or[not]primitive...]Primitive为基本的过滤单元,这些单元既可以用not(取反),也可以通过and(与)或者or(或)进行连接。

Primitive可以是下面的任意一个:

·[src|dst]host<host>,此基本单元允许过滤主机IP地址或名称。可以通过src|dst关键词来指定关注的是源地址还是目标地址。如果未指定,则指定的IP地址出现在源地址或目标地址中的包都会被抓取。

·ether[src|dst]host<ehost>,此单元允许过滤主机以太网地址。可以在关键词ether和host之间指定关键词src|dst,来确定关注的是源地址还是目标地址,如果未指定,则在源以太网地址或目标以太网地址中出现指定地址的包都会被抓取。

·gateway host<host>,过滤指定host作为网关的包。这就是指那些以太网源地址或目标地址是host,但源IP地址和目标IP地址都不是host的包。

·[src|dst]net<net>[{mask<mask>}|{len<len>}],通过网络号进行过滤。可以选择优先指定src|dst来确定感兴趣的是源网络还是目的网络。如果两个都没指定。指定网络出现在源网络还是目的网络的都会被选择。另外,可以选择子网掩码或者CIDR(无类别域形式)。

·[tcp|udp][src|dst]port<port>,过滤TCP、UDP及端口号。可以使用src|dst和tcp|udp关键词来确定来自源还是目标,是TCP协议还是UDP协议。tcp|udp必须出现在src|dst之前。

·less|greater<length>,选择长度符合要求的包(大于等于或小于等于)。

·ip|ether proto<protocol>,选择在以太网层或是IP层有指定协议的包。

·ether|ip broadcast|multicast,选择以太网/IP层的广播或多播数据包。

·<expr>relop<expr>,创建一个复杂过滤表达式,来选择字节或字节范围符合要求的包。

例1:tcp port 80and host 192.168.0.1

表示IP地址为192.168.0.1的主机发送或者接收的HTTP数据包(TCP端口号为80,表示使用的是HTTP协议)。

例2:not src host 192.168.0.1

表示所有不是从IP地址为192.168.0.1的主机发送出来的数据包。

(2)显示过滤器

在抓包完成以后,通过显示过滤器可以查找并显示感兴趣的数据包,Wireshark提供了简单而强大的过滤语法,可以用它们建立复杂的过滤表达式。通常可以根据以下几个方面来查找感兴趣的包:

·是否采用了某种协议,比如只想查看使用TCP协议的数据包,在Wireshark窗口的Filter项中输入“TCP”,然后回车,Wireshark就会只显示出所有包含了TCP协议的数据包;

·是否存在某个域;

·域值之间的比较。

域值之间的比较是使用最多的过滤方式,可以使用表2-1所示的操作符来构造显示过滤器的过滤表达式,使用条件关系判断时,既可以使用英语操作符,也可以使用类似C语言的条件操作符。

表2-1 比较操作符

img30

表达式可以通过逻辑操作符组合起来,形成更加复杂的过滤表达式。逻辑操作符如表2-2所示,在使用逻辑操作符时,既可以使用英语操作符,也可以使用类似C语言的逻辑操作符。

表2-2 逻辑操作符

img31

当对各个协议字段名称非常熟悉时,可以很快地用比较操作符和逻辑操作符组合出想要的显示过滤条件,但是对于初学者想记住如此多的协议字段名称是很困难的,这时可以采用过滤表达式对话框来辅助用户输入显示过滤条件。

单击显示过滤输入栏右边的“Expression”按钮就可以调出过滤表达式对话框,如图2-10所示。

img32

图2-10 显示过滤条件对话框

从中可以看出,对话框的左边是“Field name”,可以从下面列表框中的协议字段树中选择想要比较的协议字段。协议树列表框将所有的协议字段按照协议类型进行分组组织,其中列出了Wireshark支持的可过滤协议,单击协议边上的“+”号可以展开列表,显示出该协议中的所有协议字段,单击需要过滤的字段即可。

对话框的中间是“Relation”,可以从下方的关系列表框中选择需要使用的关系操作符,其中的“is present”是一元关系,表示如果用户选择的字段存在,表达式就为真值。其他关系都为二元关系,需要协议字段与一个值进行比较。

如果在“Relation”中选择了一个二元关系操作符,那么就需要输入关系操作符的另一个值。在“Value”下方的文本输入框中输入该值即可。有些协议字段包含预设值可用,这些预设的值会显示在“Predefined values”下的列表框中,直接在列表框中选择所需值即可。

从图2-10中可以看出,“Field name”域中选择的是IP协议中的dst字段,也就是目的IP地址,“Relation”中选择的是“==”相等判别操作符,“Value”中填入的是“192.168.1.1”,这样当单击“确定”时,就会在显示过滤输入框中显示出过滤条件:

ip.dst==192.168.1.1