4. 过滤无用的数据包
单单依靠肉眼从海量信息中找到自己的目标,难度无异于大海捞针。
如何从这些流量中找到目标数据包:
- 伯克利包过滤
- WireShark中的捕获过滤器
- WireShark中的显示过滤器
4.1伯克利包过滤
1993年, Steven McCanne与Van Jacobson在Usenix’93会议上提出的一种机制-伯克利包过滤(Berkeley Packet Filter, BPF) ,它采用了一种与我们自然语言很接近的语法,利用这种语法构成的字符串可以确定保留哪些数据包以及忽略掉哪些数据包。
这种语法很容易理解,例如最简单的空字符串,表示就是不过滤任何数据包,也就是保留所有的数据包。如果这个字符串不为空的话,那么只有那些使字符串表达式值为“真" 的数据包才会被保留。这种字符串通常由一个或者多个原语所组成。每个原语又由一个标识符(名称或者数字)组成,再加上一个或者多个限定符。
伯克利包过滤中的限定符有下面的三种:
- Type:这种限定符表示指代的对象,例如IP地址,子网或者端口等。常见的有host(用来表示主机名和IP地址) , net (用来表示子网) , port (用来表示端口)。如果没有指定的话,默认为host.
- Dir:这种限定符表示数据包传输的方向,常见的有src (源地址)和dst (目的地址) 。如果没有指定的话,默认为"src or dst" 。例如"192.168.1.1"就表示无论源地址或者目的地址为192.168.1.1的都使得这个语句为真。
- Proto:这种限定符表示与数据包匹配的协议类型,常见的就是ether, ip, tcp, arp这些协议。
下面给出了一些常见的原语实例:
host 192.168.1.1//当数据包的目标地址或者源地址为192.168.1.1时,过滤语句为真。
dst host 192.168.1.1//当数据包的目标地址为192.168.1.1时,过滤语句为真。
src host 192.168.1.1 //当数据包的源地址为192.168.1.1时,过滤语句为真。
ether host 11:22:33:44:55:66 //当数据包的以太网源地址或者目的地址为11:22:33: 44:55:66时,过滤语句为真。
ether dst 11:22:33:44:55:66 //当数据包的以太网目的地址为11:22:33:44:55:66过滤语句为真。
. ether src 11:22:33:44:55:66 //当数据包的以太网源地址为11:22:33:44:55:66过滤语句为真。
伯克利包过滤也支持到位的操作。具体的语法为proto[expr:size]
,这里面的
proto指代协议, expr表示相对给出协议层的字节偏移量, size表示要操作的字节数。其中size的值是可选的,可以是1,2,4中的一个,默认值为1.
地址192.168.1.1
转换为16进制为"Oxc0a80101"
,最后就可以写成:ip[12:4] =0xc0a80101
4.2捕获过滤器
WireShark中提供了两种不同的过滤器:捕获过滤器和显示过滤器。其中捕获过滤器是在WireShark捕获过程的同时进行工作的,这意味着如果你使用了捕获过滤器,那么WireShark就不会捕获不符合规则的数据包。
而显示过滤器则不同,它是在WireShark捕获的过程后进行工作的,这表示即使你使用了显示过滤器, WireShark仍然会捕获不符合规则的数据包,但是并不会将它们显示在数据包面板上。
捕获过滤器的配置必须要在使用WireShark进行捕获数据包之前进行,配置过程的步骤如下所示:
- 首先依次选择菜单栏上的“捕获" -> "选项"按钮。
- 在"所选择接口的捕获过滤器"后面的文本框中填写字符串形式的过滤器。
捕获过滤器遵循了伯克利包过滤的语法,所以我们可以使用上一节中介绍的各种命令来完成各种过滤任务。例如下面给出了一些常见的过滤器:
tcp dst port 80//只保留目标端口为80的TCP数据包。
ip src host 192.168.1.1//只保留源地址为192.168.1.1的数据包。
src portrange 2000-2500//只保留源端口在2000-2500之间的UDP和TCP数据包。
not icmp//保留除了icmp以外的数据包。
下面需要先把捕获接口选好,在使用过滤器,输入时显示绿色表示语法可以理解,粉红色表示错误,系统无法理解
例子:捕获地址中有www.aqniukt.com网站的数据包
例子:捕获目标端口为80的数据包
访问网站后,捕获到目标端口为80的数据包
例子:捕获源端口为1-100的数据包
例子:源地址为192.168.0.7的,目标地址不在子网10.100.0.0/16范围的
src host 192.168.0.7 and not dst net 10.100.0.0/16
4.3显示过滤器
WireShark的显示过滤器与捕获过滤器有两点明显的不同,一是显示过滤器可以在WireShark捕获数据之后再使用,二是显示过滤器的语法与捕获过滤器语法并不相同。在WireShark中有多种创建显示过滤器的方法。
- 使用过滤器输入框创建显示过滤器
- 使用过滤器表达式创建过滤显示器
- 在数据包细节面板中创建显示过滤器
平时使用较多的是显示过滤器
4.3.1使用过滤器输入框创建
在WireShark中,在显示过滤器中使用网络协议时,这些网络协议都要使用小写的形式(例如arp, ip, icmp, tcp,udp,dns以及http等)。比如我们创建一个只显示TCP协议的显示过滤器,只需要在WireShark的显示过滤器的输入框中输"tcp"
例如:输入tcp,会显示所有tcp的包
在后面跟点.
会由联想功能(提示)
4.3.2使用过滤器表达式创建
我们也可以使用Wireshark过滤器输入框右侧的"表达式"按钮,单击这个按钮之后就可以查看到WireShark过滤器表达式对话窗口。列出支持的协议。
4.3.3在数据包细节面板中创建
在数据包详细列表处的中某一行单击,例如我们在Source: 116.211.186.209这-行单击鼠标右键的话,就会弹出一个菜单,这个菜单中选中"作为过滤器应用"会弹出一个新的菜单。
下方状态栏中括号里有提示
选中右键,直接把该行应用为条件