Wireshark 中有两种过滤器:

  • 捕获过滤器:用于在数据包捕获阶段过滤数据包,只捕获符合条件的数据包,这样可以减少捕获不必要的数据包,从而提高性能。
  • 显示过滤器:用于在已经捕获的数据包中过滤出符合条件的数据包进行显示,它使用的是 Wireshark 自己的语法。

一、捕获过滤器

在 Wireshark 的开始页面或者在捕获选型页面中选择需要捕获的网络适配器,然后输入捕获过滤器规则,设置完成之后,点击“开始”按钮即可使用该规则在对应适配器上进行网络流量抓取。

1.1 BPF语法

捕获过滤器使用的是 BPF(Berkeley Packet Filter)语法,BPF语法规则如下:

  1. 一个过滤表达式(expression)由一个或多个原语(primitives)组成。
  2. 一个原语(primitive)由一个或多个限定词(qualifiers)组成,限定词之间使用空格分隔。
  3. 每组限定词最后跟着值,表示最后的计算结果等于该值时条件成立,而不支持大于、小于等其他比较运算符。
  4. 原语之间使用逻辑操作符(operators)连接,逻辑操作符可以使用 and、or、not 表示,也可以使用 &&、||、!。

如下图所示:

如下面的捕获过滤器表示:只捕获源 IP地址 为 192.168.1.100 且目的 TCP 端口为 80 的数据包。

1
ip src 192.168.1.100 and tcp dst port 80

Wireshark是非常遵守网络协议的,在过滤器中的ip表示的是ip协议,而不是我们通常认为的ip地址。

各个限定词出现的先后顺序也是按照网络协议的规则而来的,比如IP协议有源地址和目标地址之说,因此针对源地址和目标地址的捕获表达式分别如下:

1
2
ip src 192.168.1.100
ip dest 192.168.1.101

捕获过滤器不支持直接过滤应用层的协议,如http、ftp等,因为为了保证效率,在捕获时还未进行协议解析。

1.2 常用捕获过滤规则

地址过滤

  • host 192.168.1.33:捕获与 192.168.1.33 这个 IPv4 地址相关的所有流量。
  • host 2308:8277:420:152a:819:41f0:28fa:8862: 捕获与这个 IPv6 地址相关的所有流量。
  • host www.baidu.com: 捕获与域名 www.baidu.com 相关的所有流量。
  • ether host 52:54:99:2f:37:b1: 捕获与这个 MAC 地址相关的所有流量。
  • src host 192.168.1.33:只捕获源地址为 192.168.1.33 的流量。
  • dest host 192.168.1.33:只捕获目标地址为 192.168.1.33 的流量。

端口过滤

  • port 8080:捕获 8080 端口的流量,包括流入或流出的,这里无关使用的是哪一种传输层协议,tcp、udp还是其他,只要端口为8080就都捕获。
  • !src port 8080 不捕获掉源端口为 8080 流量。

协议过滤

  • icmp:只捕获 icmp 协议产生的流量。
  • !ip6: 不捕获 IPv6 的流量。

二、显示过滤器

显示过滤器的规则与捕获过滤器类似,但有些地方不一样。

显示过滤器的限定词之间使用.进行分割,而捕获过滤器使用的是空格;

捕获过滤器只支持等于这一种比较运算符,而显示过滤器支持更多的比较运算符,如==><!=>=<=

虽然逻辑运算符与捕获过滤器类似,但多了一种异或运算符,使用 xor 表示。

下面示例表示:捕获ip源地址不等于192.168.1.1,并且tcp协议端口号为80的流量。

1
ip.src != 192.168.1.1 and tcp.port > 80

不同于捕获过滤器,显示过滤器的规则需要更加地明确,如:

  • 对端口号的指定需要加上协议限定词,如tcp.port == 80,而不能像捕获过滤器那样不管协议,只要是该端口就捕获,如 port 80
  • 显示过滤器不能使用host,因为 host 太笼统了,既可以表示ip源/目标地址,也可以表示域名,在显示过滤器中可以使用 ip.srcip.desthttp.host 替代。

2.1 小技巧

显示过滤器规则有很多,我们都需要记住吗?记不住,也没必要,我们只需要记住常用的规则就可以了。

在使用Wireshark抓包时,我们可以选择报文中的某一项,点击右键,选择“作为过滤器应用”即可使用该项作为过滤器,如下图所示: