BPF包过滤规则语法
本文最后更新于:2025年11月19日 下午
BPF(Berkeley Packet Filter)全称为伯克利包过滤,是一种功能非常强大的过滤语法.这个语法被广泛应用于多种数据包嗅探软件,因为大部分数据包嗅探软件都依赖于使用BPF的libpcap/WinPcap库.诸如tcpdump,wireshark等等。
语法
使用BPF语法创建的过滤器被称为表达式,并且每个表达式包含一个或多个原语。原语是对网络协议标头中的字段(例如,主机、端口或 TCP 端口)的引用。 BPF 语法由一个或多个原语组成,而原语通常包含以一个或多个限定符作为前缀的标识(通常为名称或数字)。
type 限定符Type 限定符用于指示标识名称或数字所引用的信息类型。 例如,type 可能是 host、net、port 或 portrange。 不存在 type 限定符时,假设为 host。
dir 限定符Dir 限定符指定与标识相关的传输方向。 例如,dir 限定符可能是 src、dst 或 src or dst。
proto 限定符proto 限定符将协议匹配限制于特定协议。 可能的协议包括 ether、fddi、tr、wlan、ip、ip6、arp、rarp、decnet、TCP 或 UDP。

操作符
操作符有(),!=,&&,||。
英文有and,or,not。推荐使用英文,而非符号,因为使用符号需要加单引号,不然与shell的符号冲突。
比如:
1 | |
举例
host IP过滤
[src|dst] host <host>
dst host 192.168.1.2过滤IP地址src host 192.168.1只匹配前面的IP即可,等同于src net 192.168.1.0/24
host mac过滤
ether [src|dst] host <mac>
ether src host ae:96:be:6f:ab:53过滤源mac
net 网段过滤
[src|dst] net <network>
src net 192.168.1.0/24等同于src host 192.168.1
按协议过滤
(ether|ip|ip6) proto <protocol>
普通的协议直接输入协议名即可,如icmp6。一些特殊的协议可以输入数字:
ether proto 0x893a过滤ieee1905协议。ip proto 0xaa89过滤自定义协议
按端口过滤
[src|dst] port <port> or [tcp|udp] [src|dst] port <port>
按协议的字节偏移内容过滤
icmp[0]==3 icmp协议头的第一个字节是否等于3icmp[0]&0x2==1 位运算后比较icmp[12:3]==0x3a3a3a 取多字节,从位置12开始取3个字节
针对一些自定义协议,就可以通过字节偏移来过滤ether[34:2]=0x370 过滤从以太网头开始的35,36字节为0x370的。
注意:一般描述从第1字节开始,但是数组下标是从0开始,要多减1
| BPF 过滤器示例 | 描述 |
|---|---|
udp dst port not 53 |
未与端口 53 绑定的 UDP。 |
host 10.0.0.1 && host 10.0.0.2 |
这些主机之间的流量。 |
tcp dst port 80 or 8080 |
发往任一个指定 TCP 端口的包。 |
ether[0:4] & 0xffffff0f > 25 |
基于范围的掩码,它应用于大于 25 的字节。 |
ip[1] != 0 |
捕获 IP 标头中的 Types of Service (TOS) 字段不为 0 的包。 |
ether host 11:22:33:44:55:66 |
匹配具有该 Mac 地址的特定主机。 |
ether[0] & 1 = 0 and ip[16] >= 224 |
捕获并非通过以太网广播或多点广播来发送的 IP 广播或多点广播。 |
icmp[icmptype] != icmp-echo |
捕获所有并非回传请求的 ICMP 包。 |
ip[0] & 0xf !=5 |
捕获所有具有选项的 IP 包。 |
ip[6:2] & 0x1fff = 0 |
仅捕获未分段的 IPv4 数据报以及分段 IPv4 数据报的分段零。 |
icmp6[0]==135 or icmp6[0]==136 |
过滤NS或者NA报文 |