eBPF 是一种革命性的内核技术,允许开发者编写自定义代码并动态加载到内核中,从而改变内核的行为。这种技术使得新一代高性能网络、可观察性和安全工具成为可能。

使用 eBPF 可以做的事情包括但不限于:

  • 几乎对系统的任何方面的性能追踪
  • 具有内置可见性的高性能网络
  • 检测并(可选地)阻止恶意活动

eBPF’s Roots: The Berkeley Packet Filter

我们今天所说的 “eBPF” 起源于 BSD 数据包过滤器 (BSD Packet Filter),最早在 1993 年的一篇论文中提出。

该论文讨论了一种能够运行过滤器的伪机器,这些过滤器是用来决定是否接受或拒绝网络数据包的程序。这些程序是用 BPF 指令集编写的,这是一组通用的 32 位指令,与汇编语言非常相似。

1
2
3
4
ldh [12]
jeq #ETHERTYPE IP, L1, L2
L1: ret #TRUE
L2: ret #0

这段简短的代码过滤掉不是互联网协议(IP 协议)的数据包。

  1. 该过滤器的输入是一个以太网数据包,第一条指令(ldh)从该数据包的第 12 字节开始加载一个 2 字节的值。
  2. 指令(jeq)将该值与代表 IP 数据包的值进行比较。如果匹配,则执行跳转到标记为 L1 的指令,并通过返回一个非零值(这里标识为 #TRUE)来接受数据包。
  3. 如果不匹配,则数据包不是 IP 数据包,通过返回 0 来拒绝该数据包。

您可以想象(或参考该论文找到示例)更复杂的过滤程序。重要的是,过滤器的作者可以编写自己的自定义程序在内核中执行,而这正是 eBPF 的核心功能。

BPF 是指 “Berkeley Packet Filter”,它首次引入 Linux 是在 1997 年的内核版本 2.1.75 中,作为一种高效的捕获数据包的方法用于 tcpdump 工具。

2012 年,seccomp-bpf 在内核版本 3.5 中引入。这使得 BPF 程序可以用来决定是否允许用户空间应用程序进行系统调用。