什么是eBPF?入门指南

导航至

本文由Suleiman Abubakar Sadeeq撰写。向下滚动查看作者的简介。

Whats-Is-eBPF

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

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

让我们先定义eBPF。

什么是eBPF?

扩展伯克利包过滤器(eBPF)是一种技术,它创建一个沙箱环境,允许在操作系统内核的核心运行字节码程序。程序可以使用内核资源,而不修改或改变内核的默认行为。从Linux内核中衍生出来,eBPF是为了防止从内核空间到用户空间的无效数据包传输而创建的。

将网站比喻为描述eBPF与内核之间角色的一种好方法。比如说,假设你有一个用纯HTML编写的网站,我们都知道HTML是一种静态标记语言,这意味着你的网站将没有任何灵活性或可编程性。所以你想,“好吧,也许添加一些灵活性可能会对用户有帮助。”然后你决定添加JavaScript,这将给网站带来可编程性和灵活性。现在,与HTML类似,Linux内核并不是非常可定制的;尽管可能,但它可能会给你留下太多的错误,甚至可能会损坏内核。所以在这里,eBPF扮演的角色与JavaScript与操作系统内核类似。

eBPF是如何工作的?

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

但在程序在eBPF流中执行之前,它必须通过验证器。验证器运行一系列安全和保证检查,对字节码进行验证以确保它在内核上运行的安全性,如果代码不安全,则终止程序的执行。在所有验证器检查都通过后,eBPF在帮助内置的即时编译器(JIT)的帮助下将字节码程序编译成本地代码。然后,它将其绑定到内核中指定的位置,等待事件的触发。事件发生后,eBPF将结果数据写入映射,其中在程序中存储和与用户空间共享状态。

让我们更详细地看看这些如何在eBPF中工作。

钩子

由于eBPF的事件驱动特性,程序仅在应用程序触发钩子时执行。这将允许操纵数据。eBPF中可用的预定义钩子包括系统调用、tracepoints、网络事件、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在程序执行中强制执行了大量的安全和验证,如果您的目标是拥有更多对程序执行方式的灵活性和控制权,它可能不是最佳技术。

  • 对于应用大量IP地址的网络策略,最好使用本机基准测试工具Iptables,而不是使用可能会造成高CPU使用的eBPF。

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开发者,正在学习和帮助构建企业应用程序。在空闲时间,他踢足球、看足球比赛并享受玩电子游戏。