什么是 eBPF?入门指南

导航至

这篇文章由 Suleiman Abubakar Sadeeq 撰写。向下滚动查看作者简介。

Whats-Is-eBPF

有时需要修改操作系统的核心——例如,为了创建更大的灵活性或允许自定义代码在操作系统上运行。尽管这是可能的,但它可能导致一些不必要的问题,例如安全风险、性能问题,甚至损坏操作系统。假设您修改了操作系统的核心功能,并且一切正常。

现在这里的问题是,操作系统会定期更新,包含新的补丁和版本发布。在这种情况下,新的版本可能会删除您的修改所依赖的某个功能或特性,这将使您得到一个损坏的操作系统。为了避免这种情况,您可以使用一种工具,该工具可以在不实际修改操作系统核心的情况下影响它。在这篇文章中,我们将讨论 eBPF,它是什么,它是如何工作的,它的优点和缺点,以及它可以提供的一些帮助。

让我们首先定义 eBPF。

什么是 eBPF?

扩展伯克利包过滤器 (eBPF) 是一种技术,它创建了一个沙箱环境,允许 字节码 程序在操作系统内核的核心中运行,使用其资源,而无需实际修改或更改内核的默认行为。eBPF 源于 Linux 内核,其创建目的是为了防止不必要的包从内核空间传输到用户空间。

网站类比是描述 eBPF 在内核中作用的一个好方法。例如,假设您有一个用纯 HTML 构建的网站,我们都知道 HTML 是一种静态标记语言,这意味着您的网站将没有任何灵活性或可编程性。因此您想,“好吧,也许增加一些灵活性对用户有帮助。” 然后您决定添加 JavaScript,这将为网站带来可编程性和灵活性。现在,与 HTML 类似,Linux 内核不是很可定制的;即使有可能,也可能会给您留下太多的错误,甚至是一个损坏的内核。因此,eBPF 在这里扮演着类似于 JavaScript 在操作系统内核中的角色。

eBPF 是如何工作的?

您通常会有一个用某种语言(比如 C++)编写的程序,以在内核中执行一个事件。此程序可能正在访问文件或操作网络流量。eBPF 从用户空间访问此程序并将其编译为字节码,这是程序在 eBPF 中执行的标准方式。然后,它将字节码程序附加到指定的挂钩并将其加载到内核中。

但是在程序在 eBPF 流程中执行之前,它必须通过验证器。验证器对字节码运行一组安全和保证检查,以确保它可以在内核上安全运行,并且在出现不安全代码的情况下,它会终止程序的执行。在所有验证器检查通过后,eBPF 立即在其内置的即时 (JIT) 编译器的帮助下将字节码程序编译为本机代码。然后,它将其绑定到内核中的指定位置,以等待事件的发生。事件发生后,eBPF 将结果数据写入到一个映射,在该映射中,它存储状态并在程序内与用户空间共享状态。

让我们更详细地了解一下这些在 eBPF 中是如何工作的。

挂钩

由于 eBPF 的事件驱动性质,程序仅在应用程序触发挂钩时执行。这将启用数据的操作。eBPF 中可用的预定义挂钩包括 系统调用、跟踪点、网络事件、Kprobesuprobes

eBPF-kernel

辅助调用

为了访问内核功能(如内存),eBPF 使用辅助函数。这些函数被预留出来,为 eBPF 程序提供一种访问和修改内核功能的方式。在 eBPF 将程序附加到挂钩后,为了使挂钩执行程序,它依赖于辅助调用来执行访问内核的任务,就像 API 一样。辅助调用通常执行的一些任务包括网络数据包操作、生成随机数、访问数据和时间、访问套接字数据、执行尾调用等。

验证器

这是 eBPF 为确保程序加载和执行的完全安全而采取的步骤。此时,eBPF 程序通过一组条件检查,以强制执行合规性和安全策略,并且在验证失败的情况下,它会终止执行。eBPF 程序经历的一些验证检查包括以下内容

  • 它确保将程序加载到内核的进程具有该权限。
  • 它检查程序是否具有有限的执行周期,以防止其持续运行并导致内核损坏。
  • 它检查代码是否对内核有任何有害影响。

即时 (JIT)

JIT 将字节码程序编译为本机机器代码,以便增强 eBPF 程序在内核中的执行速度。

映射

eBPF 程序可以通过映射将信息从内核共享到用户空间。映射有助于存储和共享检索到不同数据集结构中的统计报告或数据,这些数据结构包括数组、哈希表、堆栈跟踪和环形缓冲区。

eBPF 可以用在哪些地方?

  • 资源管理:您可以使用 eBPF 来监控和管理某些系统资源的使用情况——例如,内存、输入和输出磁盘,以确保系统范围内资源的适当管理。

  • 网络:网络是 eBPF 的主要用途之一。您可以使用它来创建自定义数据包过滤器,以根据数据包的负载、IP 地址或协议类型等来过滤网络数据包。使用此自定义过滤器,您可以增强网络安全性并改善流量或负载均衡。

  • 安全:您可以利用 eBPF 来实施运行时 安全 策略。可以使用 eBPF 创建策略来监控和控制应用程序在实时中的行为方式,从而防止应用程序执行未经授权的操作,例如发出系统调用、执行恶意代码和桥接访问策略。这可以帮助提高应用程序的性能和效率,并且可以确保您控制应用程序的安全性。

  • 可观测性和调试:您可以利用 eBPF 来创建自定义跟踪系统,该系统可以帮助识别复杂的、可能不容易使用传统跟踪工具在运行时跟踪或识别的问题。您可以使用它来尽早修复程序中的错误和问题,并提高性能和稳定性。

考虑到 eBPF 的用途,现在让我们介绍一下使用它的优缺点。

优点

  • 请放心,您通过 eBPF 传递的任何程序都在沙箱环境中运行,在该环境中,它经过验证并以安全的方法执行。这确保了没有代码实际影响内核,并为程序执行提供了安全的环境。

  • 使用 eBPF 不需要进一步自定义内核模块来与内核本身交互或影响内核本身。这是一种更可靠、更灵活的编写与内核交互的程序的方式。

  • eBPF 已被证明是科技巨头用来处理内核操作的首选技术。例如,Meta 在 Katran 中使用 eBPF 进行网络负载均衡,其他使用 eBPF 的产品包括 Cilium、Falco 等。

缺点

  • 由于 eBPF 在程序执行中强制执行安全性和验证的程度,如果您的目标是对程序的执行方式具有更大的灵活性和控制权,那么它可能不是最佳技术。

  • 最好使用像 Iptables 这样的本机基准测试工具来应用具有大量 IP 地址的网络策略,而不是使用 eBPF,这可能会导致较高的 CPU 使用率。

eBPF 的替代方案

以下是与 eBPF 类似的一些技术的简要概述

  1. Iptables:这是用于 Linux 的网络地址转换 (NAT) 和数据包过滤工具。

  2. SystemTap:这是一个开源工具,为开发人员提供了一个命令行界面和脚本语言,使他们能够从 Linux 系统收集数据,这可以帮助诊断和解决问题。

  3. LTTng:Linux Trace Toolkit Next Generation 是一个跟踪框架,为开发人员提供了一种跟踪系统活动以优化和提高其性能的方法。它也是开源的。

您需要 eBPF 吗?

正如我们上面提到的,在某些用例中,eBPF 可能不是您的最佳选择,例如,当您希望对程序在内核中的运行方式具有更大的灵活性时。在这种情况下,更好的做法可能是创建您自己的内核模块。但是在您的程序需要从内核中提取一些指标,而无需更改或破坏内核本身的情况下,那么 eBPF 在这种用例中无疑会大放异彩。

eBPF-Guide

结论

在这篇文章中,我们讨论了 eBPF 是什么、它是如何工作的、它的一些核心组件以及 eBPF 的优缺点。因此,希望这篇文章为您提供了对 eBPF 的入门见解。如需进一步阅读,您可以参考 eBPF 的 官方文档

作者简介

这篇文章由 Suleiman Abubakar Sadeeq 撰写。 Suleiman Abubakar Sadeeq 是一位雄心勃勃的 react 开发者,他正在学习并帮助构建企业应用程序。在空闲时间,他踢足球、看足球比赛,并喜欢玩电子游戏。