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
2
3
4
5
6
7
8
# 使用and,过滤目的地址为192.168.66.247的tcp 80端口数据
tcpdump -i br0 -n dst host 192.168.66.247 and tcp port 80

# 使用&&符号,需要用单引号包过滤器语法括起来
tcpdump -i br0 -n 'dst host 192.168.66.247 && tcp port 80'

# 使用括号,同样需要使用单引号。过滤目的地址为192.168.66.247的http,https数据
tcpdump -i br0 -n 'dst host 192.168.66.247 && (tcp port 80 || tcp port 443)'

举例

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协议头的第一个字节是否等于3
icmp[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报文

参考

Berkeley 包过滤器
BPF过滤规则


BPF包过滤规则语法
https://leon0625.github.io/2024/03/15/a10497a90091/
作者
leon.liu
发布于
2024年3月15日
许可协议