初识eBPF

一、BPF

BPF(Berkeley Packet Filter ),中文翻译为伯克利包过滤器,是类 Unix 系统上数据链路层的一种原始接口,提供原始链路层封包的收发。1992 年,Steven McCanne 和 Van Jacobson 写了一篇名为《BSD数据包过滤:一种新的用户级包捕获架构》的论文。在文中,作者描述了他们如何在 Unix 内核实现网络数据包过滤,这种新的技术比当时最先进的数据包过滤技术快 20 倍。BPF 在数据包过滤上引入了两大革新:

  • 一个新的虚拟机 (VM) 设计,可以有效地工作在基于寄存器结构的 CPU 之上;

  • 应用程序使用缓存只复制与过滤数据包相关的数据,不会复制数据包的所有信息。这样可以最大程度地减少BPF 处理的数据;

tcpdump 的底层采用 BPF 作为底层包过滤技术,tcpdump 运行架构图如下。

二、eBPF是什么?

eBPF 全称 (extended Berkeley Packet Filter),中文意思是扩展的伯克利包过滤器。是一项革命性的技术,起源于 Linux 内核,可以在如操作系统内核中运行沙箱程序。它用于安全有效地扩展内核的功能,而无需更改内核源代码或加载内核模块。然后,操作系统保证安全性和执行效率,就像在实时 (JIT) 编译器和验证引擎的帮助下进行本机编译一样。

eBPF的特性

  • 稳定:有循环次数和代码路径触达限制,保证程序可以固定时间结束;

  • 高效:可通过JIT方式翻译成本地机器码,执行效率高效;

  • 安全:验证器会对eBPF程序的可访问函数集合和内存地址有严格限制。

  • 热加载/卸载(持续交付):可热加载/卸载eBPF程序,无需重启 Linux系统;

  • 内核内置:eBPF自身提供了稳定的 API(帮助程序调用);

上述是eBPF的全景图

三、eBPF的应用场景

eBPF 被广泛用于驱动各种用例:在现代数据中心和云原生环境中提供高性能网络和负载平衡,以低开销提取细粒度的安全可观测性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排除、预防性应用程序和容器运行时安全实施提供见解等等。

BPF 技术目前主要用于以下场景:

  1. 网络(Network)

  2. 安全(Security)

  3. 可观测性和监控(Obervability & Monitoring)

  4. 追踪和性能分析(Tracing & Profiling)

 

上图为使用eBPF成功的案例。

四、eBPF代码的执行流程

正在上传…重新上传取消

  1. 用户编写 eBPF 程序,可以使用 eBPF 汇编或者 eBPF 特有的 C 语言来编写。

  2. 使用 LLVM/CLang 编译器,将 eBPF 程序编译成 eBPF 字节码。

  3. 调用bpf()系统调用把 eBPF 字节码加载到内核。

eBPF Maps:为eBPF程序提供广泛的数据结构,以便于eBPF程序存储数据和索引数据。eBPF 映射可以从 eBPF 程序访问,也可以通过系统调用从用户空间中的应用程序访问。提供用户和内存之间一个数据交换的桥梁。

在eBPF代码进入内核之前需要进行相应的检查:

验证

  • 加载 eBPF 程序的进程具有所需的功能(权限)。除非启用了非特权 eBPF,否则只有特权进程才能加载 eBPF 程序。

  • 该程序不会崩溃或以其他方式损坏系统。

  • 程序总是运行到完成(即程序不会永远处于循环中,从而阻止进一步的处理。

    即时编译

即时 (JIT) 编译步骤将程序的通用字节码转换为特定于机器的指令集,以优化程序的执行速度。这使得 eBPF 程序的运行效率与本机编译的内核代码或作为内核模块加载的代码一样高效。

eBPF辅助程序

eBPF 程序不能调用任意内核函数。允许这样做会将 eBPF 程序绑定到特定的内核版本,并使程序的兼容性复杂化。相反,eBPF 程序可以将函数调用到帮助程序函数中,这是内核提供的众所周知且稳定的 API。

可用的帮助程序调用示例:

  • 生成随机数

  • 获取当前时间和日期

  • eBPF 地图访问

  • 获取进程/c组上下文

  • 操作网络数据包和转发逻辑

    开发工具

  1. BCC

    BCC用于基于 BPF 的高效内核跟踪的工具包和库。BCC 是一个工具包,用于创建基于 eBPF 构建的高效内核跟踪和操作程序,

  2. bpftrace

    bpftrace 是 Linux eBPF 的高级跟踪语言,做内核动态跟踪。

  3. eBPF Go库

    eBPF Go库提供了一个通用的eBPF库,它将获取eBPF字节码的过程与eBPF程序的加载到内核中。

  4. libbpf C/C++ Library

    libbpf 库是一个基于 C/C++ 的通用 eBPF 库,它有助于将 clang/LLVM 编译器生成的 eBPF 对象文件加载到内核中。

五、基于eBPF成熟的应用

1.clium

2.Falco

 

3.Pwrn

正在上传…重新上传取消

 

4.BCC 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值