试想一下我们对数据包进行分析时,会关注哪些问题?MAC/IP/TCP/UDP/HTTP还是具体地应用信息?数据包大小、报文类型统计、还是流量的展示?为了方便快速的抓取或者过滤感兴趣的报文内容,从本次开始我们介绍抓包的过滤语法。

Wireshark采用了BPF语法进行数据包过滤,可以分为抓取之前过滤和对已抓取的数据包进行过滤。不同点为:抓取之前过滤,wireshark会根据过滤语法至保留匹配成功的数据包,其他数据包不保存。通过在wireshark主界面的Capture或者通过菜单栏capture-option-capture filter for selected interfaces。抓取之后过滤,是为了快速在抓取的数据包中过滤出需要的内容。

Wireshark过滤语法由限定条件+条件限定符+标识条件,例如ip.addr == 192.168.1.1,限定条件为要求为(ip.addr),条件限定符为(=),标识条件为(192.168.1.1),其中限定条件为必须,多个过滤条件间使用逻辑运算符与、或、非(&&,||,!),以下我们以实际的语法举例,先进行简单的语法过滤,大家可以举一反三:

1. 协议过滤,仅使用限定条件例如:eth、ip、tcp、udp、http、icmp等,在wireshark抓包主界面的过滤栏直接输入相关协议名称,例如输入http:

会在抓取到的所有数据包里过滤出http的数据内容,如下图:(其中数据包列表中对应TCP/IP的物理层、数据链路层、IP层、传输层、应用层)

协议过滤

2. 地址过滤,过滤二层或者三层地址。

2.1 二层过滤:例如,使用eth.addr == ff.ff.ff.ff.ff.ff过滤目的地址为广播的流量,例如ARP或者NBNS名称查询。

扩展一下,我们知道组播对应的mac地址为:01.00.5e.xx.xx.xx,如果要抓取所有目的为组播的地址应该怎么抓取呢?wireshark支持字节偏移型的过滤,MAC报头格式如下:

过滤组播

我们只需要匹配eth的0-3个字节即可,即使:eth[0:3] == 01.00.5e,过滤完如下图:

过滤结果

再扩展一下:我们知道以太网的上层协议有很多种,例如ip/arp等,上面讲过可以通过在过滤规则中直接输入协议来过滤,这里我们通过字节偏移来实现,看一下二层报头,在源目地址12字节后是上层协议的类型,ARP的类型占2个字节,RARP对应0x8035,IP对应0x0800,ARP对应0x0806,IPv6对应0x86DD,

过滤RARP

例如我们过滤上图的RARP,在过滤规则中输入eth[12:2] == 8035,也就是选择eth头部12位-14位,过滤结果如下:

过滤结果

如上图所示,只要我们足够了解eth报头的信息,我们就可以精确的过滤到我们感兴趣的内容。这些过滤的技巧在三层、四层中使用的会更多。二层的相关内容就介绍到这里,下次我们继续ip/tcp的分享。