0%

BPF过滤规则

BPF简介

BPF(Berkeley Packet Filter)全称为伯克利包过滤,是一种功能非常强大的过滤语法.这个语法被广泛应用于多种数据包嗅探软件,因为大部分数据包嗅探软件都依赖于使用BPF的libpcap/WinPcap库.诸如tcpdump,wireshark等等

BPF详解

使用BPF语法创建的过滤器被称为表达式,并且每个表达式包含一个或多个原语.每个原语包含一个或多个限定词,然后跟着一个ID或者数字

BPF限定词:

限定词 说明 例子
Type 指出ID或数字所代表的含义 host, net, port
Dir 指明数据包传输方向 src, dst
Proto 限定所要匹配的协议 ether, ip, tcp, udp, http, ftp

表达式示例:

过滤器示例

该表达式的含义是只捕获目的地址为192.168.0.10以及端口为80的tcp流量

可以使用以下3种逻辑运算符,对原语进行组合,从而创建出更高级的表达式

  • &&:连接运算符 与
  • ||:选择运算符 或
  • !:否定运算符 非

主机名和地址过滤器

大多数过滤器都专注于一个特定的网络设备.这种情况下,可以根据设备的MAC地址,IPv4地址,IPv6地址或者DNS主机名配置过滤规则

host限定词用于捕获特定主机名或IP地址的流量:

host 192.168.10.1
host fe80::3c42:d5ff:fe22:1d63
host testserver

如果考虑到一台主机的IP地址会变化,可以加入ether限定词对MAC地址进行过滤:

ether host 3e:42:d5:22:1d:63

传输方向限定词可以用来捕获流入或流出某台主机的流量:

src host 192.168.10.1

当一个原语中没有指定一种类型限定符时,host限定词将作为默认选择:

src 192.168.10.1

端口和协议过滤器

不仅仅可以基于主机过滤,也可以基于端口进行过滤:

port 80

如果想要捕获非80端口的流量:

!port 80

端口限定符可以和传输方向限定符一起使用:

dst port 80

端口限定符也可以和某些基于端口之上的协议一起过滤:

tcp port 8080

另外一些协议并不能简单的使用端口定义:

icmp

!ip6

协议域过滤器

协议域过滤器是BPF语法的一个强大的功能,我们可以通过检查协议头的限定字节来创建基于某些数据的过滤器

代表目标不可达(类型3)信息的ICMP数据包:

icmp[0]==3 //icmp协议头的第一个字节是否等于3

代表echo请求(类型8)或echo回复(类型0)的ICMP数据包:

icmp[0]==8||icmp[0]==0

可以在偏移值的后面以冒号分隔加上一个数值,代表数据长度:

icmp[0:3]==0x030104

还有一种情况是一个字节中每一个比特位都是标志位,这样我们需要先引用相关的字节,再使用”位掩码”逐位地把我们需要检查的位分离出来:

tcp[13]&4==4

ip[0] & 0x0F > 0x05

文档

FreeSaber:伯克利包过滤(Berkeley Packet Filter,BPF)语言

“Wireshark数据包分析实战(第二版)”