BPF –什么是伯克利分组过滤器?

2020年12月28日17:18:50 发表评论 140 次浏览

本文概述

伯克利包过滤器介绍

伯克利包过滤器(BPF)或伯克利过滤器是相关的适用于所有类Unix操作系统, 例如Linux。专用虚拟机(于1992年开发)的主要任务是过滤来自网络的数据包并将其嵌入内核。 BPF为数据内容或程序提供了带有安全层的接口。安全层负责确保数据包的可靠传输和调节访问这些数据包.

例如, 当接收方接收到这样的数据包时, BPF会从该数据包中读取安全层数据并查找错误。这使收件人可以解决任何错误。而且, 它可以将数据与过滤器定义进行比较, 接受或丢弃数据包取决于是否将其分类为相关。这样可以节省大量的计算能力。

内容

  1. 伯克利包过滤器如何工作?
  2. 伯克利过滤器的优点
  3. 使用BPF编程过滤器
  4. eBPF验证程序的安全性

伯克利包过滤器如何工作?

为了执行其功能, 伯克利分组过滤器作为机器语言的解释器被嵌入到虚拟机中。结果, BPF执行预定义的指令格式。伯克利过滤器以解释器的身份读取源文件, 对其进行分析并逐条指令运行。反过来, 它将指令翻译成机器代码, 从而可以直接执行。

使用SysCalls–即调用特殊的操作系统功能–伯克利过滤器将请求发送到内核。这将在确认或拒绝请求之前检查访问权限。大约330Linux SysCalls包括以下这些:

  • 读–允许读取文件
  • 写–允许写入文件
  • 打开–打开文件或设备
  • 关–关闭文件或设备
  • 统计–请求文件状态

由于正在进行的开发, BPF现在可以作为通用虚拟机直接在内核中运行, 其中整个流程和数据的组织发生。凭借其许多新功能, 该过滤器被称为扩展BPF –简称eBPF。它可以安全地运行任何应用的中间语言(字节码)在运行期间(即时编译)直接在内核中进行。扩展BPF在内核中的隔离环境中运行, 因此在保护下执行。这种环境模型(称为沙箱)有助于降低系统对内核逻辑产生不利影响的风险。

伯克利过滤器的优点

使用eBPF, 你可以过滤数据包并防止无关的数据降低PC性能。不可用或错误的数据集可以立即被拒绝或修复。此外, 扩展的BPF还提供增加安全性与SysCalls;你可以通过系统调用或跟踪流程轻松衡量自己的性能。

BPF的实施扩展为"零拷贝缓冲区扩展"在2007年推出。借助这些扩展功能, 设备驱动程序可以将收集的数据包直接保存在程序中, 而无需先复制数据。

使用BPF编程过滤器

在用户模式下, 你可以随时为Berkeley过滤器界面定义单个过滤器。相关代码以前是手动编写的, 然后转换为BPF字节代码。如今, LLVM Clang编译器使直接翻译字节码成为可能。

示例程序也存储在内核库中, 从而简化了定义eBPF程序的过程。各种帮助功能使使用过滤器更加轻松。

eBPF验证程序的安全性

在内核中执行系统调用始终伴随着某些安全性和稳定性风险。在加载eBPF SysCall之前, 它必须经过一系列检查:

  1. 首先, 检查系统调用已结束和不包含任何循环。否则, 这可能导致内核崩溃。在此过程中, 将检查程序的控制流程图(CFG), 以检测无法随后加载的不可访问指令。
  2. 在执行指令之前和之后, eBPF系统调用的状态被检查。这是为了确保扩展BPF仅在允许的区域内起作用, 并且不会访问沙箱外部的数据。但是, 并非每个途径都需要单独检查。通常一个子集就足够了。
  3. 最后, SysCall类型已配置。此步骤对于限制可以从SysCall调用哪些内核功能以及可以访问哪些数据结构非常重要。这样, 你可以使用系统调用直接访问网络数据包数据。

的SysCall类型通常处理以下四个功能:可以附加程序的位置, 可以调用哪些内核帮助功能, 可以直接还是间接访问网络数据包数据以及在系统调用中优先传输哪种对象类型。

内核当前支持以下eBPF SysCall类型:

  • BPF_PROG_TYPE_SOCKET_FILTER
  • BPF_PROG_TYPE_KPROBE
  • BPF_PROG_TYPE_SCHED_CLS
  • BPF_PROG_TYPE_SCHED_ACT
  • BPF_PROG_TYPE_TRACEPOINT
  • BPF_PROG_TYPE_XDP
  • BPF_PROG_TYPE_PERF_EVENT
  • BPF_PROG_TYPE_CGROUP_SKB
  • BPF_PROG_TYPE_CGROUP_SOCK
  • BPF_PROG_TYPE_LWT_ *
  • BPF_PROG_TYPE_SOCK_OPS
  • BPF_PROG_TYPE_SK_SKB
  • BPF_PROG_CGROUP_DEVICE
一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: