TOC
该文章是由 Suleiman Abubakar Sadeeq 撰写的。Suleiman Abubakar Sadeeq 是一位有抱负的 React 开发人员,正在学习并帮助构建企业应用程序。在空闲时间,他会踢足球,观看足球比赛并喜欢玩视频游戏。
译者: 梁远鹏
什么是eBPF?一个入门指南
作者:社区 / 2023年3月14日 / 开发人员 本文由 Suleiman Abubakar Sadeeq 撰写。向下滚动以查看作者的个人简介。
什么是eBPF?
有时需要修改操作系统的核心,例如创建更多的灵活性或允许在操作系统上运行自定义代码。尽管这是可能的,但它可能会导致一些不必要的问题,如安全风险、性能问题或甚至操作系统的损坏。假设您修改了操作系统的核心函数,一切都运行正常。
现在问题在于,操作系统会定期更新,发布新的补丁和版本。在这种情况下,新版本可能会删除您的修改所依赖的某个函数或功能,这将使您的操作系统受到损害。为了避免这种情况,您可以使用一种可以影响操作系统核心而不实际修改它的工具。在本文中,我们将讨论 eBPF,它是什么,它是如何工作的,它的优缺点以及它可以帮助的一些方法。
让我们首先定义一下 eBPF。
什么是eBPF?
扩展伯克利数据包过滤器(eBPF)是一种技术,可以创建一个沙箱环境,允许字节码程序在操作系统内核的核心中运行,使用其资源而不实际修改或更改内核的默认行为。eBPF 起源于 Linux 内核,旨在防止不必要的数据包从内核空间传输到用户空间。
网站类比是描述 eBPF 与内核关系的好方法。例如,假设您有一个由纯HTML制作的网站,我们都知道HTML是一种静态标记语言,这意味着您的网站将没有任何灵活性或可编程性。因此,您认为“添加一些灵活性可能对用户有所帮助”。然后,您决定添加 JavaScript,这将为网站带来可编程性和灵活性。现在,与 HTML 类似,Linux 内核不太可定制。即使可能,它可能会留下太多的错误甚至会导致内核崩溃。因此,eBPF 在这里扮演了与 JavaScript 相似的角色,用于操作系统内核。
eBPF如何工作?
您通常会编写某种语言的程序,比如 C ++,以执行内核中的事件。此程序可能会访问文件或操作网络流量。 eBPF 从用户空间访问此程序并将其编译为字节码,这是在 eBPF 中执行程序的标准方式。然后,它将字节码程序附加到指定的钩子并加载到内核中。
但在程序在eBPF流中执行之前,它必须经过验证器。验证器在字节码上运行一组安全性和保障检查,以确保它在内核上运行时是安全的,如果存在不安全的代码,则终止程序的执行。在所有验证器检查通过后,eBPF 立即使用其内置的即时编译器(JIT)将字节码程序编译为本地代码。然后,它将其绑定到内核中的指定位置以等待事件的发生。事件发生后,eBPF 将结果数据写入映射中,在其中存储和共享程序中的状态与用户空间。
让我们稍微详细地看看这些在 eBPF 中如何工作。
Hooks(钩子)
由于 eBPF 是基于事件驱动的,程序只有在应用程序触发钩子时才会执行。这样就可以对数据进行操作。eBPF 中可用的预定义钩子包括系统调用、跟踪点、网络事件、Kprobes 和 uprobes。
Helper calls
为了访问内核功能,如内存,eBPF 使用帮助程序函数。这些函数被保留下来,以为 eBPF 程序提供一种访问和修改内核函数的方式。在 eBPF 将程序附加到钩子后,为了使钩子执行程序,它依赖于帮助程序调用来执行访问内核的任务,就像 API 一样。帮助程序调用通常执行的任务包括网络数据包操作、生成随机数、访问数据和时间、访问套接字数据、执行尾调用等。
Verifier
这是 eBPF 采取的一步,以确保程序加载和执行的完全安全性。在这一点上,eBPF 程序经过一系列条件检查,以强制执行遵循的合规性和安全策略,在验证失败的情况下,它会终止执行。eBPF 程序经过的一些验证检查包括以下内容:
它确保加载程序到内核的进程具有该特权。 它检查程序具有有限的执行期限,以防止其持续运行并导致内核损坏。 它检查代码是否对内核有任何有害影响。
Just-In-Time (JIT)
JIT 将字节码程序编译为本机机器代码,以增强 eBPF 程序在内核中的执行速度。
Map
eBPF 程序可以通过映射将信息从内核共享到用户空间。映射有助于将检索到的统计报告或数据存储和共享到不同的数据结构集,包括数组、哈希表、堆栈跟踪和环形缓冲区。
eBPF 可以用在哪些领域呢?
- 资源管理:您可以使用 eBPF 监控和管理系统资源的使用情况,例如内存、输入和输出磁盘,以确保在整个系统中适当地管理资源。
- 网络:网络是 eBPF 的主要应用之一。您可以使用它创建自定义数据包过滤器,根据数据包的内容、IP 地址或协议类型来过滤网络数据包。通过这个自定义过滤器,您可以增强您的网络安全,改善流量或负载平衡。
- 安全:您可以利用 eBPF 实现运行时安全策略。使用 eBPF 可以创建用于实时监控和控制应用程序行为的策略,以防止应用程序执行未经授权的操作,例如进行系统调用、执行恶意代码和桥接访问策略。这有助于提高应用程序的性能和效率,可以确保您对应用程序的安全性具有控制权。
- 可观察性和调试:您可以利用 eBPF 创建自定义跟踪系统,以帮助识别运行时可能不容易跟踪或识别的复杂问题。您可以使用它来尽早修复程序中的错误和问题,以提高性能和稳定性。
现在我们来讨论一些使用 eBPF 的优缺点。
优点:
-
可以放心地通过 eBPF 运行任何程序,因为它运行在沙盒环境中,以安全的方式进行验证和执行。这可以确保没有任何代码会影响内核,并为程序提供安全的运行环境。
-
使用 eBPF 不需要进一步定制内核模块以与内核进行交互或影响内核本身。这是编写与内核交互的程序的更可靠和灵活的方式。
-
eBPF 已经证明是技术巨头处理内核操作的首选技术。例如,Meta 在网络负载平衡中使用 eBPF 来处理 Katran,其他使用 eBPF 的产品包括 Cilium、Falco 等。
缺点:
-
由于 eBPF 在程序执行中强制执行安全性和验证,如果您的目标是希望程序执行更灵活并掌握更多的控制权,则可能不是最佳选择。
-
在应用大量 IP 地址的网络策略时,最好使用像 Iptables 这样的本地基准测试工具,而不是使用 eBPF,因为后者可能导致高 CPU 使用率。
eBPF的替代方案
以下是几个与 eBPF 类似的技术的简要概述:
-
Iptables:这是用于 Linux 的网络地址转换(NAT)和数据包过滤工具。
-
SystemTap:这是一个开源工具,为开发人员提供了一个命令行界面和脚本语言,使他们能够从 Linux 系统中收集数据,有助于诊断和解决问题。
-
LTTng:Linux Trace Toolkit Next Generation 是一个跟踪框架,为开发人员提供了一种追踪系统活动的方法,以优化和改进其性能。它也是开源的。
你是否需要eBPF?
正如我们之前提到的,对于某些用例,如当您想要以更灵活的方式运行程序在内核中时,eBPF可能不是您的最佳选择。在这种情况下,更好的做法可能是创建自己的内核模块。但是,在需要从内核中提取一些指标而不改变或破坏内核本身的情况下,eBPF 毫无疑问在这种用例中是最好的选择。
结论
在本文中,我们讨论了什么是eBPF,它如何工作,它的一些核心组件以及eBPF的优缺点。希望本文能够给您对eBPF的初步了解。如需进一步阅读,您可以参考eBPF的官方文档。
作者简介
本文是由 Suleiman Abubakar Sadeeq 撰写的。Suleiman Abubakar Sadeeq是一名有抱负的 React 开发人员,正在学习和帮助构建企业应用程序。在业余时间,他喜欢踢足球,观看足球比赛和玩视频游戏。
原文
https://www.influxdata.com/blog/what-is-ebpf-introductory-guide/
微信公众号
扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。