BPF(Berkeley Packet Filters)是一个强大的网络分析工具,通过指定过滤条件,BPF过滤器可以极大的减少捕获的数据包,tcpdump和wireshark都支持BPF过滤器。
BPF表达式
BPF表达式由一个或者多个原语(primitives)组成。
[not] primitive [and|or [not] primitive …]
原语(primitive)
原语由标识符(Identifiers), 以及描述它的多个限定词(qualifiers)组成。
qualifier Identifier
host www.baidu.com, host是限定词,wwww.baidu.com是标识符。
标识符(Identifier)
名字或者数值。例如:www.baidu.com, 80
限定词(qualifiers)
-
Type 设置名称或者数字所指示类型。
Type的可选值有:- host: IP或者域名地址
- net: 设定子网。
net 192.168.0.0 mask 255.255.255.0 等价于 net 192.168.0.0/24 - port: 端口
- portrange: 设置端口范围.
例如 portrange 6000-8000
-
Dir: 设置网络出入方向
Dir的取值: src, dst, src or dst 和 src and dst。例如 dst port 80
-
Proto: 指定具体的协议
Proto的可选值有ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp 和 udp.
-
其他
gateway: 指明网关 IP 地址,等价于 ether host ehost and not host host
广播broadcast与多播multicast: 例如 ether broadcast 或者 ip6 multicast
运算符
用于组合多个原语
- 非:! 或者 not
- 与:&& 或者 and
- 或:|| 或者 or
"非"的优先级最高,“与”和“或”的优先级相同,优先级的顺序为从左到右。
筛选数据包的内容
expr relop expr
如果relop两侧的操作数expr满足指定的关系,那么结果为true。
- relop指关系操作符:>, <, >=, <=, =, !=
- expr为算术表达式,表达式中可以使用整型常量(与标准C中一致),二进制操作符,长度操作符,以及对特定数据包中数据的引用。
引用数据包中的数据:
proto [expr : size]
- expr指定数据包中的偏移字
- size是可选的,表示数据段的长度,如果不指定size, 则默认为1字节
ip[6:2] & 0x1fff = 0 捕获片偏移为0的IPV4数据包, IP报文中第6,7字节用于分片,片偏移为13位。
例子
进出主机myhost的数据包:
host myhost
非53端口的UDP报文
udp dst port not 53
非本地连接(src和dst都是本地网卡)的SYN和FIN报文
tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet
所有IPV4的HTTP包,源端口和目的端口为80,包里要有数据,不包含SYN、FIN和ACK包。
tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)