eBPF:数据平面可编程又一利器?

操作系统的内核功能强大,它具有监督和控制整个系统的特权,通过软件方式,操作系统是实现观察性、安全性与网络功能的理想场所,但在操作系统的内核中进行任何修改,都会带来安全风险或性能损失,并会破坏原有软件对操作系统版本和模块的依赖关系。

能否实现操作系统可编程性,允许额外代码在不更改操作系统内核源代码的情况下运行,或在新模块中创建不需要的依赖项?

eBPF实现了这一点,它在操作系统中运行沙箱程序,可以方便地在不重建内核或加载内核模块的同时,实现网络、安全、应用程序分析/跟踪和性能故障排除等功能。由此,诞生了一波基于eBPF 的项目,包括下一代网络、可观察性和安全功能。

微软的新项目“eBPF for Windows”就是其中之一的开源项目。它面向 Windows 10 和 Windows Server 2016(及更高版本),旨在允许开发人员在现有 Windows 版本之上使用熟悉的 eBPF 工具链和应用程序编程接口 (API)。

什么是 eBPF?

Linux 将其内存分为两个不同的区域:内核空间和用户空间。内核空间是操作系统核心所在的地方,它可以完全不受限制地访问所有硬件——内存、存储、CPU 等。由于内核访问的特权性质,内核空间受到保护,只允许运行最受信任的代码,包括内核本身和各种设备驱动程序。

用户空间是任何非内核进程运行的地方,例如常规应用程序。用户空间代码对硬件的访问受到限制,并且依赖于在内核空间中运行的代码来进行特权操作,例如磁盘或网络 I/O。例如,要发送一个网络数据包,用户空间应用程序必须通过称为“系统调用”的内核 API 与内核空间网卡驱动程序对话。

由于内核具有监督和控制整个系统的特权,操作系统一直是实现可观察性、安全性和网络功能的理想场所。同时,操作系统内核由于其核心作用和对稳定性和安全性的高要求,难以演进。因此,与在操作系统之外实现的功能相比,操作系统级别的创新率传统上较低。


Linux内核4的发布提供了一种新的方法,称为eBPF技术。


eBPF下,内核包含了一个沙箱环境,可以让BPF字节码运行,这可以影响内核并使用内核资源——但实际上不会改变内核本身。


简化的 eBPF 架构

eBPF 与 Linux 内核的关系可以看作 JavaScript 与网页的关系:把HTML看作操作系统的内核,把网站看作产生的服务和行为。众所周知,HTML是静态的,但JavaScript的添加为网站带来了可编程性和灵活性——类似于eBPF为Linux内核带来可编程性的方式。

eBPF程序被加载到Linux环境中,并使用特定的触发器事件,称为hook。hook包括网络事件实例、内核跟踪点和内核函数。当遇到hook时,相应的eBPF代码被编译、验证和执行。

在加载到内核之前,eBPF 程序必须通过一组特定的检查。验证涉及在虚拟机中执行 eBPF 程序,这样做允许具有 10,000 多行代码的验证器执行一系列检查。验证器将遍历 eBPF 程序在内核中执行时可能采用的潜在路径,确保程序确实运行完成而没有任何循环。

最终,eBPF让程序员可以在 Linux 内核中安全地执行自定义字节码,而无需修改或添加内核源代码。eBPF 程序引入了自定义代码来与受保护的硬件资源交互,对内核的风险最小。

使用 eBPF,内核及其行为变得高度可定制,而不是固定的。

eBPF for Windows

去年,微软宣布了一个新的开源项目,简称为“eBPF for Windows”,将eBPF 引入Windows 10 和 Windows Server 2016,以及以后的版本,以支持拒绝服务保护和可观察性等用例。

让Linux 特性在 Windows上应用,这件事本身就值得关注。更重要的是,在过去的几年中,eBPF为Linux内核带来了新的可编程性。这也让业界对于这个新的开源项目十分感兴趣,这个新项目可以做些什么?当前的生态系统在eBPF开始向Windows发展的过程中又会如何演变?

eBPF 是为在 Windows 上运行而不是作为 Windows 的一部分而构建的,这意味着它将在现有版本的 Windows 上运行,而不需要对操作系统进行更新。

“对于已经在 Linux 上使用 eBPF 的开发人员,在 Windows 上使用 eBPF 以使相同类型的解决方案能够在两个平台上工作是很有吸引力的。即使对于那些只使用 Windows 的人,我们相信 eBPF 的可编程性、可扩展性和敏捷性优势将向更广泛的受众开放。”

SONiC 创始人兼 Azure 网络工程负责人Dave Maltz表示:“微软一直在投资 eBPF 的原因之一是,我们看到了让数据平面本身可编程和由软件控制的重要性。”

eBPF允许网络操作系统使用公共 API 来提供功能;提供该 API 的代码可以改进,但依赖它的代码在发生这种情况时不必更新,这使得网络堆栈有了更多的创新。分解网络堆栈意味着网络架构师可以选择他们想要运行的协议,并只使用所需的软件模块。

DASH(SONiC 主机的分布式 API)是一个网络项目,用于SDN数据平面,利用SmartNIC和其他硬件,通过在网络本身做更多工作(如加密或密钥管理),以合并计算和网络的方式,来提高云服务的网络性能。

“我们需要公开更高级别的 API 来控制该 SDN 数据路径,而 eBPF 是实现这一点的好方法,”Maltz 说。


eBPF -for-windows 项目架构概述

如图所示,现有的eBPF工具链(如clang)可以用于从各种语言的源代码生成eBPF字节码。生成的字节码可以被任何应用程序使用,也可以通过Windows netsh命令行工具手动使用,这两个工具都使用一个公开Libbpf API的共享库,不过这项工作仍在进行中。

该库将 eBPF 字节码发送给静态验证器,该验证器托管在一个用户模式保护进程中,这是一个 Windows 安全环境,允许内核组件由它信任的密钥签名的用户模式守护进程。如果字节码通过了验证器的所有安全检查,字节码就可以加载到运行在Windows内核模式执行上下文中的 uBPF解释器中,或者由 uBPF 即时 (JIT) 编译器编译并将本地代码加载到内核模式执行上下文。

安装到内核模式执行上下文中的 eBPF 程序可以附加到各种hook以处理事件,并调用 eBPF shim 公开的各种帮助程序 API,它在内部包装公共 Windows 内核 API,允许在现有版本的 Windows 上使用 eBPF。到目前为止,已经添加了两个hook(XDP 和套接字绑定),预计随着时间的推移,微软会添加更多的hook和helper。

“eBPF for Windows”项目仍处于起步阶段,长期目标是“将 eBPF 的力量带给 Windows 用户”,经过未来的发展,在理想情况下,大多数的 eBPF 程序在 Linux 和 Windows 上的行为方式相同。

当该项目成熟时,它将转移到eBPF 基金会。2021 年 8 月,Facebook、谷歌、Isovalent、微软和 Netflix 宣布成立eBPF 基金会。


该基金会以帮助支持该技术的发展,并促进许多正在发展的基于 eBPF 的开源项目之间的协作。

eBPF 的应用与挑战

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

另外,eBPF 很快就进入了大型数据中心的基础设施软件层,例如,Facebook 发布了基于 eBPF 的负载均衡器Katran,它已经为 Facebook 数据中心提供了几年的支持。

尽管 eBPF 是适应 Linux 内核的一种强大而有效的手段,但 eBPF 平台可能会给开发人员带来一定风险。eBPF 并不适合每个项目或情况。例如,eBPF 仅适用于最新的 Linux 内核,因此代码不容易移植到其他操作系统或项目。

此外,保护 eBPF 程序执行的安全特性也在一定程度上限制了 eBPF 的功能。

为了大家能够进一步探索论证开源的创新模式、协作模式、商业模式,我们将在5月24-26日举办2022网络开源技术生态线上峰会, “足不出户”尽享网络开源技术大咖带来的精彩分享。

参考文献:
https://www.techtarget.com/searchitoperations/tip/An-introduction-to-eBPF-and-where-it-shines
https://www.infoq.com/articles/gentle-linux-ebpf-introduction/
https://isovalent.com/blog/post/2021-08-ebpf-foundation-announcement


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/25703.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于22-04-19
0