第 1 章. 什么是 eBPF,为什么它很重要?
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
eBPF 是一种革命性的内核技术,它允许开发人员编写可动态加载到内核中的自定义代码,从而改变内核的运行方式。(如果你对内核还不太了解,也不用担心,本章很快就会讲到)。
这使得新一代高性能网络、可观察性和安全工具成为可能。正如你将看到的那样,如果你想用这些基于 eBPF 的工具对应用程序进行检测,你不需要以任何方式修改或重新配置应用程序,这要归功于 eBPF 在内核中的有利位置。
使用 eBPF 可以做的事情包括
-
对系统的几乎所有方面进行性能跟踪
-
高性能网络,内置可视性
-
检测和(有选择地)预防恶意活动
让我们从伯克利数据包过滤器开始,简要回顾一下 eBPF 的历史。
eBPF 的根源:伯克利数据包过滤器
我们今天所说的 "eBPF "起源于 BSD 包过滤器。1劳伦斯伯克利国家实验室的Steven McCanne 和 Van Jacobson 撰写的一篇论文中首次描述。这篇论文讨论了一种可以运行过滤器的伪机器,过滤器是为决定接受还是拒绝网络数据包而编写的程序。这些程序是用 BPF 指令集编写的,BPF 指令集是一套 32 位指令的通用指令集,与汇编语言非常相似。下面是直接摘自该论文的一个例子:
ldh [12] jeq #ETHERTYPE IP, L1, L2 L1: ret #TRUE L2: ret #0
这一小段代码可以过滤掉不是互联网协议(IP)数据包的数据包。该过滤器的输入是一个以太网数据包,第一条指令 (ldh) 从数据包的第 12 字节开始加载一个 2 字节的值。在下一条指令 (jeq) 中,该值与代表 IP 数据包的值进行比较。如果匹配,执行将跳转到标有L1 的指令,并通过返回一个非零值(此处标识为#TRUE )来接受数据包。如果不匹配,则该数据包不是 IP 数据包,并通过返回0 而被拒绝。
你可以想象(或者参阅论文中的例子)更复杂的过滤程序,根据数据包的其他方面做出决定。重要的是,过滤器的作者可以编写自己的定制程序在内核中执行,这就是 eBPF 的核心功能。
BPF 是 "Berkeley Packet Filter(伯克利数据包过滤器)"的缩写,于 1997 年首次引入 Linux,内核版本为 2.1.75、2它被用在 tcpdump 工具中,作为捕获要追踪的数据包的有效方法。
转眼到了 2012 年,内核 3.5 版本引入了 seccomp-bpf。这使得 BPF 程序可以决定是否允许或拒绝用户空间应用程序进行系统调用。我们将在第 10 章对此进行更详细的探讨。这是 BPF 从狭义的数据包过滤发展到今天的通用平台的第一步。从这时起,BPF 名称中的 "包过滤 "一词开始变得毫无意义!
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access