《精通Wireshark》—第2章2.2节抓包过滤器

本节书摘来自异步社区《精通Wireshark》一书中的第2章2.2节抓包过滤器,作者【印度】Charit Mishra(夏里特 米什拉),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 抓包过滤器
抓包过滤器可以让管理员只抓取自己想要抓取的信息,同时丢弃其他的信息。抓包这个进程是一个处理器密集型任务,同时Wireshark也会占用大量的内存空间。所以,我们有时候需要保留一些资源以兹他用,这些资源可以用来进行数据包分析,有时候我们只想要抓取那些满足某些条件的数据包,同时丢弃其他的数据包。

Wireshark可以让用户采用一些比较有意思的方法来对接口进行配置,让软件只抓取那些满足某些条件的数据包,这些条件需要在Capture Options窗口中进行配置,这个窗口的截图如图2-1所示。


《精通Wireshark》—第2章2.2节抓包过滤器

下面是对话框中的一些抓包可选项。

Capture:在这个窗口中,用户可以选择自己想要抓包的接口,用户甚至可以一次性选择多个接口让软件进行监听。窗格中的每一列(如是否在这个接口抓包[Capture]、接口编号[Interface]、接口名称、该接口是否启用了杂合模式等)都会显示一个接口的详细信息。在Capture对话框下面,用户可以看到一个复选框,在这里可以选择杂合模式,甚至选择可选项Use promiscuous on all interfaces直接一次性激活所有接口的杂合模式。
Manage Interfaces:这个按钮可以添加或者删除用户希望监听的接口。用户甚至可以在这里添加远端的接口,不过这可能需要用户拥有根权限。
Capture Filter:点击Capture Filter按钮之后,用户就会看到一个图2-2所示的对话框。这个对话框中默认会显示用户已经配置好的抓包过滤器,而用户也可以在这个对话框中创建和保存自定义的抓包过滤器。


《精通Wireshark》—第2章2.2节抓包过滤器

首先,用户可以直接采用这些默认的过滤配置文件,以此来了解如何创建自定义的过滤参数。在读者熟练掌握了这些基本使用方法之后,就可以继续在同一个窗口中创建自己的自定义过滤器了,但一定要按照伯克利数据包过滤(BPF,Berkley Packet Filtering)语法来定义过滤。BPF语法是一种行业标准,很多协议分析软件都可以使用这种语法,因此不同协议分析软件中使用的过滤器配置也可以相互迁移。

为了帮助读者掌握这种方法,我们先来一起创建一个过滤器;假设我们需要抓取从一台位于192.168.1.1的Web服务器发来的数据包(如果读者在监测的Web服务器使用的并不是这个地址,读者可以进行相应地修改),就应该按照下面的步骤进行设置。

1.打开Capture Options(抓包可选项)对话框。

2.点击Capture Filter(抓包过滤器)。

3.点击New(新建)。

4. 在Filter name(过滤器名)文本框中输入Web server 192.168.1.1(见图2-3)。


《精通Wireshark》—第2章2.2节抓包过滤器

5.在Filter String(过滤器字符串)文本框中输入host 192.168.1.1 and port 80。

6.在完成上面的配置之后,点击OK;如果输入的内容正确,那么在Capture Filter按钮之后出现的文本框背景就是绿色的,如图2-4所示。


《精通Wireshark》—第2章2.2节抓包过滤器

Capture Files:这个选项可以让管理员将抓取的数据包保存到系统中已有的文件中。如果用户选择一个文件的话,抓取的数据包就会被添加到管理员选择的这个文件中。这时系统中会创建出一个临时文件,设备会将数据写入到这个临时文件中,这个文件会保存到用户指定的位置。可根据自己的需要选择文件的保存路径,为此输入文件的绝对路径,或者点击File文本框旁边的Browse(浏览)来选择路径。
如果选择了多个文件可选项,那么用户可以将数据包保存到多个文件中,这个过程可以描述为下面这样。
Next File Every:在抓取到一定量的数据之后,Wireshark会创建出一个新的文件,并且将这些数据添加进去。例如,我们可以在Wireshark抓取到2MB数据之后就创建一个新的文件。
Next File Every:在经过一段指定的时间之后,Wireshark会创建出一个新的文件,并且将这些数据添加进去。例如,我们可以在启动抓包进程之后每5分钟就创建一个新的文件。
Ring buffer:用户可以用这个可选项限制新文件的创建。Wireshark会根据先来后到(First in First Out)的次序将数据写入多个文件集当中。比如,我们选择了Ring buffer这个可选项,同时将文件的数量增加到了5个,同时我们配置了每抓取到5MB的数据,软件就会创建一个新的文件。
现在,根据之前我们所作的配置,一旦软件开始抓包,那么每抓取到5MB的数据,软件就会创建出一个新的文件,并且将抓取的数据包写入到文件中。一旦文件超出了我们在Ring buffer部分设置的参数值,Wireshark就不会再创建新的文件了。软件会回到第一个文件,在这个文件的基础上写入新的数据。图2-5显示的就是这种配置方法。

《精通Wireshark》—第2章2.2节抓包过滤器

Stop Capture Settings:这个可选项可以让软件在满足某项触发条件后即停止抓包的进程;有4种不同的触发因素。满足这些条件可以让Wireshark停止抓取新的数据包,这些因素如下所示。
Packet(s):在抓取的数据包达到某个数量之后,停止抓包。
File(s):在创建的文件达到某个数量之后,停止抓包。
Megabyte(s):在抓取数据的字节数达到某个数量之后,停止抓包。
Minute(s):在抓取数据包一段时间之后,停止抓包。
这里读者可能想问一个问题:如果我们同时选择多个可选项会怎么样呢?比如,按照图2-6进行勾选。

《精通Wireshark》—第2章2.2节抓包过滤器

用户可以一次勾选多个可选项;这样的话,Wireshark会在触发第一个条件时,就停止抓包。

Display Options:这里有很多可选项可以进行配置,来限制Packet List Pane(数据包列表面板)和Protocol Hierarchy(协议分层)窗口中显示的数据包及相关信息。读者可以参考图2-7来了解相关信息。


《精通Wireshark》—第2章2.2节抓包过滤器

如果选择了Update list of packet in real-time(数据包实时更新列表),就会发现每当Wireshark抓取到新的数据包时,Packet List Pane(数据包列表面板)中的信息就会更新,同时面板会自动向上滚动。用户要根据自己的需求来选择可选项;否则执行这两项任务所需要的资源就会用来执行其他进程了。

如果勾选了Hide capture info dialog(隐藏抓包信息对话框)复选框,那么Protocol Hierarchy(协议分层)窗口中(以百分比的形式)显示的统计数据就会隐藏起来。如果没有任何特定的目的,建议用户不要勾选这些可选项。

Name Resolution:如果勾选,这个特性可以将二层、三层和四层地址解析为对应的名称。为了解释清楚这个问题,请看图2-8。


《精通Wireshark》—第2章2.2节抓包过滤器

2.2.1 为什么要使用抓包过滤器
当网络中数据流的规模相当庞大时,只抓取满足某些条件的流量就显得十分重要了。如果用户需要在生产环境中进行流量分析,那他迟早会需要自定义抓包过滤器。用户要在开始抓包进程之前应用抓包过滤器。总之,Wireshark抓取的每个数据包都交给抓包引擎,再由抓包引擎将抓取的数据包转换成人类可以读懂的格式。但是如果用户应用了抓包过滤器,那么Wireshark就会丢弃与用户需求不符的那些数据包。Wireshark不会将这些丢弃的数据包交给抓包引擎进行转换。相比之下,显示过滤器就要具体和强大得多了;在使用抓包过滤器时,用户一定要谨慎,因为如果有数据包因为与用户定义的规则不符而被丢弃,这些数据包是无法恢复的。

创建过滤器时要使用伯克利数据包过滤器(BPF)语法,还有很多协议分析软件使用的也是这种语法,因为这种语法是行业标准。这种语法很容易学习和使用,使用基本的格式来构建用户的过滤标准就可以了。

2.2.2 如何使用抓包过滤器
我们之前使用BPF语法在capture filter对话框中创建了一个简单的抓包过滤器;下面我们来具体讨论一下这个抓包过滤器,这对于掌握BPF至关重要,毕竟大量协议分析软件都使用了BPF。

如果使用BPF语法,就必须按照一个格式结构来定义过滤器的标准,这个格式由两个参数组成,它们是标识符(identifier)和修饰符(qualifier),下面我们分别对这两个概念进行说明。

标识符:这是我们在数据包中寻找的参数。例如,如果想要过滤出某个IP地址的数据包,那么抓包过滤器就要定义类似于host 192.168.1.1这样的语句,其中192.168.1.1这个值就是标识符。
修饰符:修饰符可以分为3部分。
类型(Type):修饰符有3种类型:host、port和net。简言之,类型修饰符标识的是这个修饰符指代的名称或编号。例如,过滤器host 192.168.1.1.1中,host就是类型修饰符。
方向(Direction):有时,我们也需要抓取来自某个源地址或者去往某个目的地址的数据包,这时我们可以将方向作为一个修饰符。例如,在src host 192.168.1.1这个抓包过滤器中,src这个修饰符的作用就是让软件只抓取来自某台特定主机的数据包。同理,如果设置dst host 192.168.1.1这样一个抓包过滤器,那么软件就只会抓取去往host 192.168.1.1的数据包了。
协议(Proto):这是协议修饰符,它可以让用户指定要将哪个协议的流量添加到抓包过滤器的语法当中,来抓取该协议的数据包。例如,如果用户希望抓取主机192.168.1.1发送的http流量,那么抓包过滤器就应该写作src host 192.168.1.1 and tcp port 80。
在前面的示例中,我们用串联运算符(&/and)将两个表达式组合了起来。同理,我们还可以使用变更运算符(|/or)和否定运算符(!/not)来组合和创建复杂的过滤器。

例如,我们在前文中创建了过滤器src host 192.168.1.1 and tcp port 80,其效果是抓取所有始发自192.168.1.1这个地址,并且目的端口为80的流量。

如果使用的运算符是or,即过滤器为src host 192.168.1.1 or tcp port 80,那么只要流量与上面两个表达式中的任何一个相匹配,软件都会抓取流量。这也就是说,所有由192.168.1.1始发的流量,和所有发往80端口的流量,都会被软件抓取到,无论另一个条件是否匹配。

如果使用的运算符是not,那么抓包过滤器not port 80表示的就是所有与80端口有关的流量都不要抓取。

一旦开始在生产环境中抓包,读者就会发现and、or和not这样的运算符是多么常用。

2.2.3 抓包过滤器的示例
虽然Wireshark提供了大量的过滤器,这些过滤器都可以帮助用户熟悉BPF语法,不过要默认访问当前的过滤器,可以在主工具栏中选择Capture | Capture Filers或者点击Capture Options按钮,然后点击Capture Filter。我们可以在同一个窗口中创建已经介绍过的新过滤器。

要创建抓包过滤器,可以参考下表中的内容。


《精通Wireshark》—第2章2.2节抓包过滤器


《精通Wireshark》—第2章2.2节抓包过滤器

《精通Wireshark》—第2章2.2节抓包过滤器
熟练掌握BPF语法相当重要。在深入学习和使用Wireshark的过程中,读者就会意识到这种技能的重要性。建议读者不断进行练习,直到自己已经对BPF语法烂熟于胸为止。
2.2.4 使用协议头部参数的抓包过滤器
用户可以用协议头部字段中的参数来自定义抓包过滤器。创建这类过滤器的语法大概是这种形式:proto[offset:size(optional)]=value。在这里,proto是用户想要抓取流量的协议,offset是对应的数值在数据包头部中的位置,size是要抓取的数据长度,value是想要寻找的数据。

比如说,我们只想抓取ICMP响应数据包;那么,如果观察图2-9,就会发现ICMP头部类型处于最开始的位置,因此offset参数就应该从0开始。因此,在本例当中,offset值就应该设置为0,size部分应该设置为1字节。我们拥有所有创建抓包过滤器所必需的信息,所以,我们现在创建的表达式大致就会是这样:icmp[0:1]=0(见图2-10)。


《精通Wireshark》—第2章2.2节抓包过滤器

我们首先来尝试向www.google.com发起ping测试,看看是否可以实现通信(见图2-11)。


《精通Wireshark》—第2章2.2节抓包过滤器

设置的结果是,Wireshark就只会抓取ICMP响应数据包了。通过相同的方法,我们就可以按照协议头部的参数来过滤出自己想要的流量了。


《精通Wireshark》—第2章2.2节抓包过滤器

下表列出了一些基于TCP或UDP中某些字节的抓包过滤器;读者也不妨试着配置这些抓包过滤器。

《精通Wireshark》—第2章2.2节抓包过滤器
上一篇:数据抓取的一个类,包含一些常用的方法


下一篇:记一次性能测试实践