伯克利包过滤器

伯克利包过滤器(BPF)

什么是BPF?

BPF,即伯克利包过滤器 Berkeley Packet Filter,诞生于1992年,其作用是提供一种过滤包的方法来避免在内核空间复制无用的数据到用户空间。由于其简化的语言以及存在于内核中的即时编译器(JIT),使BPF成为一个性能卓越的包过滤工具。

BPF语法

  • BPF过滤规则由一个或多个原语(原子式)组成。原语通常由一个标识(id,名称或数字)和标识前面的一个或多个限定词组成。
  • BPF过滤规则有三种类型的限定词,分别为type、dir和 proto。

type限定词

  • type限定词用于说明标识的类型,即名字的类型或数字的类型,主要有host、netport三种类型。
  • 例如:host foo,net 128.3,port 20
  • 注:如果不指定类型修饰字,就使用默认的host

dir限定词

  • dir限定词用于说明相对于标识的传输方向,即数据是传入还是传出标识。
  • 有src,dst,src or dst和 src and dst
  • 例如:src host192.168.0.1,dst net128.3,src or dst port ftp-data
  • 注:如果不指定方向限定词,就使用默认的 src or dst。对于点到点类型的链路协议,用 inbound和 outbound限定词指定所需的传输方向。

proto限定词

  • proto限定词用于说明过滤规则指定的协议。
  • 可以使用的协议有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp 和 udp。
  • 例如,ether src foo,arp net 128.3,tcp port 21
  • 注:如果不指定协议限定词,就使用最优匹配的协议。例如,port 53指(tcp或udp)port 53

特殊原语

  • less length

    • 如果报文的长度小于等于 length,则逻辑为真。即只捕获所有长度小于 length的网络数据包。它等同于:len<= length
  • greater length

    • 如果报文的长度大于等于 length,则逻辑为真。即只捕获所有长度大于 length的网络数据包。它等同于:len>= length.
  • ip proto protocol

    • 如果报文是 IP 数据报,其内容的协议类型是 protocol,则逻辑为真。即只捕获网络协议类型是 protocol 的 ip 数据包。protocol 可以是数字,也可以是下列名称中的一个:icmp, igrp,udp, nd 或 tcp。注意这些标识符 tcp, udp 和 icmp 也同样是关键字,所以必须用反斜杠(\)义。
  • ether proto protocol

    • 如果报文协议属于以太类型的 protocol,则逻辑为真。Protocol 可以是数字,也可以是名字,如 ip, arp 或 rarp。注意这些标识符也是关键字,所以必须用反斜杠(\)转义。
  • ether broadcast

    • 如果报文是以太广播报文,则逻辑为真。即捕获以太网广播数据包。关键字 ether是可选的。
  • ip broadcast

    • 如果报文是IP广播报文,则逻辑为真。检查全0和全1的广播约定,并且检查本地的子网掩码。
  • ether multicast

    • 如果报文是以太多目传送报文(multicast),则过滤规则逻辑为真。关键字 ether是可选的。这实际上是 ’ ether[0]&1!=0 ’ 的简写。
  • ip multicast

    • 如果报文是IP多目传送报文,则过滤规则逻辑为真。即捕获IP多目传送报文。
  • proto [expr : size]

    • proto是 ether,fddi,ip,arp,rarp,tcp,udp,or Icmp之一,同时也指出了下标操作的协议层。expr给出字节单位的偏移量,该偏移量相对于指定的协议层。Size是可选项,指出感兴趣的字节数;它可以是1,2,4,默认为1字节。
    • ether[o] & 1 != 0捕捉所有的多目传送报文。
    • ip[0] & 0xf != 5捕捉所有带可选域的IP报文。
    • ip[6:2] & 0x1ff = 0只捕捉未分片和片偏移为0的数据报。

复合过滤规则

  • 复杂的过滤器表达式可以通过and(&&),or(||)和 not(!)连接原语来组建。
  • host foo and not port ftp and not port ftp-data
  • 为了简便,可以忽略相同的限定词。
    • 例如,tcp dst port ftp or ftp-data or domain实际上等价于tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain

练习

  • ip src net 192.168.1 and tcp dst port 80

    • 捕获源地址来自于192.168.1网段,并且目的端口为tcp的80端口的数据包
  • udp dst port 53 and udp[4: 2]<100

    • 捕获目的端口为53,并且长度小于100字节的UDP报文
  • ip src net 200.100.1 and ip dst host 200.200.1.2 and tcp dst port 80 and tcp[13]&0x40=0x40

    • 捕获源网络为200.100.1,并且目的地址为200.200.1.2,并且目的端口为tcp的80端口,并且tcp控制位全零保留位最后一位为1的数据包
  • 若需捕获192.168.1.0/24网络中的主机telnet到服务器10.1.1.1的数据包

    • ip src net 192.168.1 and ip dst host 10.1.1.1 and tcp dst port 23
  • 若需捕获源自200.1.1.0/24网络,发送到服务器10.2.2.2的21端口的数据

    • ip src net 200.1.1 and ip dst host 10.2.2.2 and dst port 21
  • 若需捕获所有RIPv2协议数据包(RIPV2协议采用组播方式传输,组播地址224.0.0.9,且使用UDP 520端口交换信息)

    • ip dst host 224.0.0.9 and udp src or dst port 520
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章