BPF表达式

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)

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值