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数据包分析实战(第二版)”