eBPF 是一种革命性的内核技术,允许开发者编写自定义代码并动态加载到内核中,从而改变内核的行为。这种技术使得新一代高性能网络、可观察性和安全工具成为可能。
使用 eBPF 可以做的事情包括但不限于:
- 几乎对系统的任何方面的性能追踪
- 具有内置可见性的高性能网络
- 检测并(可选地)阻止恶意活动
eBPF’s Roots: The Berkeley Packet Filter
我们今天所说的 “eBPF” 起源于 BSD 数据包过滤器 (BSD Packet Filter),最早在 1993 年的一篇论文中提出。
该论文讨论了一种能够运行过滤器的伪机器,这些过滤器是用来决定是否接受或拒绝网络数据包的程序。这些程序是用 BPF 指令集编写的,这是一组通用的 32 位指令,与汇编语言非常相似。
1 | ldh [12] |
这段简短的代码过滤掉不是互联网协议(IP 协议)的数据包。
- 该过滤器的输入是一个以太网数据包,第一条指令(
ldh)从该数据包的第 12 字节开始加载一个 2 字节的值。 - 指令(
jeq)将该值与代表 IP 数据包的值进行比较。如果匹配,则执行跳转到标记为L1的指令,并通过返回一个非零值(这里标识为#TRUE)来接受数据包。 - 如果不匹配,则数据包不是 IP 数据包,通过返回
0来拒绝该数据包。
您可以想象(或参考该论文找到示例)更复杂的过滤程序。重要的是,过滤器的作者可以编写自己的自定义程序在内核中执行,而这正是 eBPF 的核心功能。
BPF 是指 “Berkeley Packet Filter”,它首次引入 Linux 是在 1997 年的内核版本 2.1.75 中,作为一种高效的捕获数据包的方法用于 tcpdump 工具。
2012 年,seccomp-bpf 在内核版本 3.5 中引入。这使得 BPF 程序可以用来决定是否允许用户空间应用程序进行系统调用。