1. eBPF 技术全景

eBPF(extended Berkeley Packet Filter)是一项革命性的内核沙箱技术,允许用户在操作系统内核中安全、高效地运行自定义程序,而无需修改内核源码或加载内核模块。本章从发展历史、内核版本演进、与内核模块的对比以及核心应用场景四个维度,构建 eBPF 技术的完整知识图谱。

1.1 eBPF 发展历史与内核版本演进

eBPF 并非一蹴而就,其演进经历了从网络包过滤工具到通用内核可编程平台的蜕变。下表梳理了关键里程碑与对应内核版本。

时间 / 内核版本 里程碑事件 核心能力
1992 (BPF) Steven McCanne 和 Van Jacobson 在 BSD 系统中提出 BPF 用户态网络包过滤,tcpdump 核心引擎
2014 (Linux 3.18) Alexei Starovoitov 将 eBPF 合入主线内核 寄存器架构、JIT 编译、Map 数据结构、kprobe/tracepoint 挂载
2016 (Linux 4.8-4.10) XDP(eXpress Data Path)与 TC BPF 成熟 网卡驱动层高速包处理、流量控制
2018 (Linux 4.15-4.20) BPF 跟踪能力增强(BCC、bpftrace 生态爆发) perf_event、raw_tracepoint、BPF_PROG_TYPE_TRACING
2020 (Linux 5.5-5.10) BPF CO-RE(Compile Once – Run Everywhere) BTF 类型信息、BPF 骨架、libbpf 标准化
2022+ (Linux 5.15-6.x) BPF 调度器、BPF 安全模块、BPF 轻量级隧道 struct_ops、BPF LSM、BPF Netkit
关键认知: eBPF 的演进本质是“从网络专用到通用可编程”的跨越。CO-RE 机制的引入解决了 eBPF 程序在不同内核版本间的移植难题,是 eBPF 从实验室走向大规模生产环境的基石。

1.2 eBPF 与内核模块对比

在 eBPF 出现之前,内核模块是扩展内核功能的唯一途径。两者在安全性、开发效率、可移植性等方面存在本质差异。

对比维度 eBPF 程序 内核模块
安全性 严格验证器(Verifier)检查,禁止非法内存访问、死循环 无运行时安全沙箱,Bug 可直接导致内核崩溃
开发语言 受限 C(eBPF C 子集),编译为 BPF 字节码 完整 C/C++,可调用任意内核 API
内核版本兼容性 CO-RE + BTF 实现跨版本兼容 需针对不同内核版本重新编译,维护成本高
加载与卸载 用户态通过 bpf() 系统调用动态加载,无需重启 insmod/rmmod,需 root 权限,卸载不干净可能残留
性能开销 JIT 编译后接近原生,无上下文切换 函数调用开销,但无额外沙箱开销
适用场景 观测、网络、安全策略、性能调优 设备驱动、文件系统、调度器、硬件交互
选型建议: 对于网络观测、安全策略、性能追踪等场景,优先选择 eBPF。只有当需要深度操作内核数据结构、实现新硬件驱动或修改核心调度逻辑时,才考虑内核模块。eBPF 不是内核模块的完全替代品,而是互补方案。

1.3 eBPF 核心应用场景

eBPF 的三大核心应用领域为网络、安全和观测。下图展示了 eBPF 程序在内核中的挂载点与数据流。

eBPF 内核挂载点与数据流全景 用户态控制面(bpftrace / BCC / libbpf 应用) bpf() 系统调用 / BPF 验证器 / JIT 编译器 内核态 eBPF 程序挂载点 网络 XDP / TC / Socket Filter 流量控制 / 负载均衡 安全 BPF LSM / seccomp 运行时安全策略 观测 kprobe / tracepoint perf_event / 延迟追踪 BPF Map / perf ring buffer / 全局变量 说明: eBPF 程序通过 bpf() 系统调用加载,经验证器安全检查后由 JIT 编译为本地指令。 程序挂载到网络、安全、观测等内核事件点,通过 Map 或 ring buffer 与用户态交互。

1.4 三大场景详解

1.4.1 网络场景

  • XDP(eXpress Data Path): 在网卡驱动层(RX 队列)直接处理数据包,实现 DDoS 防御、负载均衡、包过滤,性能可达 10M+ pps。
  • TC BPF: 在 Linux 流量控制层进行包转发、整形、封装/解封装,支持容器网络策略(Cilium、Calico 核心引擎)。
  • Socket Filter / BPF_PROG_TYPE_SOCK_OPS: 在 socket 层实现连接跟踪、拥塞控制、透明代理。

1.4.2 安全场景

  • BPF LSM(Linux Security Module): 在内核安全钩子处执行自定义策略,实现文件访问控制、进程权限管理、网络连接审计。
  • seccomp BPF: 限制进程可使用的系统调用,构建容器沙箱安全边界。
  • 运行时异常检测: 通过 kprobe 监控关键内核函数,检测提权、内核 Rootkit 等攻击行为。

1.4.3 观测场景

  • kprobe / uprobe: 动态插桩内核/用户函数,采集函数入参、返回值、执行耗时,用于延迟曲线分析。
  • tracepoint: 在内核预定义静态事件点采集数据,稳定性高,适合长期监控。
  • perf_event: 采集 CPU 性能计数器、内存访问、缓存命中率,辅助性能瓶颈定位。
  • 延迟曲线生成: 通过 eBPF 记录请求在各阶段的纳秒级时间戳,聚合生成 P50/P90/P99 延迟分布曲线。