系列简介
eBPF(extended Berkeley Packet Filter)是 Linux 内核近十年来最具革命性的技术之一。它允许你在不修改内核源码、不加载内核模块的前提下,安全地在内核中运行自定义逻辑——就像给内核装上了”可编程的插件系统”。从网络数据包的高性能处理(XDP/TC),到安全策略的实时执行(LSM),再到全链路可观测性(bpftrace/BCC),eBPF 正在重新定义人与内核交互的方式。
本系列从 eBPF 的底层原理出发,逐步构建完整的技术认知体系:虚拟机指令集如何工作?验证器如何保证安全?Map 如何在内核态与用户态之间传递数据?CO-RE 如何实现”一次编译到处运行”?XDP 为什么能达到每秒数千万包的处理能力?Cilium 如何用 eBPF 替代 kube-proxy?eBPF 与 WebAssembly 的融合会带来什么?在生产环境中如何调试和优化 eBPF 程序?
每一章都配有可在你自己的 Linux 系统上验证的实践操作,让你从「听说过 eBPF」进阶到「能用 eBPF 解决真实问题」。
场景驱动阅读路线
以下 5 条路线从你日常遇到的真实问题出发,按”你需要什么→eBPF 怎么实现”的顺序串联章节。每条路线可独立阅读,前置依赖已在路线内标注。
路线总览
路线A:网络性能优化
场景:你的服务每秒需要处理百万级数据包,iptables 规则链越来越长导致延迟飙升,L4 负载均衡成为瓶颈——如何用 eBPF 突破内核网络栈的性能极限?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 eBPF 全景 | 建立 eBPF 整体认知——理解”内核可编程”的含义与能力边界 |
| 2 | Ch5 Hook 点 | 理解 kprobe/tracepoint/uprobe 三大 Hook 机制——eBPF 程序挂载到内核的入口 |
| 3 | Ch7 XDP | 核心:XDP 在驱动层处理数据包,绕过内核协议栈,实现千万级 PPS |
| 4 | Ch8 TC | TC 层 eBPF 处理——比 XDP 更灵活,可访问 skb 完整信息 |
| 5 | Ch9 eBPF 网络 | eBPF 如何替代 iptables/kube-proxy,实现连接跟踪与 NAT |
| 6 | Ch12 Cilium 深入 | Cilium 如何将 XDP+TC+连接跟踪组合为生产级网络方案 |
路线逻辑:从理解 eBPF 的 Hook 机制出发,先掌握 XDP 这一最快的数据包处理路径,再理解 TC 层的灵活处理,然后看 eBPF 如何重构网络功能,最终落地到 Cilium 的生产实践。
路线B:安全监控与防护
场景:需要实时监控进程行为、检测异常系统调用、实现细粒度的安全策略——传统方案要么性能开销大(Audit),要么不够灵活(Seccomp),eBPF 如何提供新的安全范式?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 eBPF 全景 | 理解 eBPF 的安全模型——验证器如何保证内核安全 |
| 2 | Ch3 验证器 | 核心:验证器是 eBPF 安全的基石——理解它如何阻止危险操作 |
| 3 | Ch5 Hook 点 | LSM BPF 如何在安全检查点挂载 eBPF 程序 |
| 4 | Ch10 eBPF 安全 | LSM BPF + Tetragon——eBPF 安全的完整方案 |
| 5 | Ch16 内存管理 | 理解 eBPF 程序的内存限制与安全边界 |
| 6 | Ch18 综合实战 | 构建完整的 eBPF 网络安全工具 |
路线逻辑:先理解 eBPF 自身的安全保证(验证器),再理解 eBPF 如何用于安全监控(LSM BPF),然后深入内存安全边界,最终通过实战构建安全工具。
路线C:可观测性与排障
场景:凌晨 3 点服务延迟飙升,需要知道哪个函数耗时最长、哪个系统调用最频繁、哪个进程在疯狂分配内存——eBPF 如何实现零侵入的全链路可观测?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 eBPF 全景 | 理解 eBPF 可观测性的核心优势——零侵入、低开销、内核级 |
| 2 | Ch4 Map 数据结构 | Map 是数据传递的核心——Perf Buffer、Ring Buffer 如何高效传输追踪数据 |
| 3 | Ch11 eBPF 可观测性 | 核心:bpftrace/BCC/Beyla——三大可观测性工具链 |
| 4 | Ch13 开发框架 | 选择合适的开发框架——libbpf/Aya/Go eBPF 各有适用场景 |
| 5 | Ch17 生产部署 | 生产环境中的性能开销、调试方法、灰度策略 |
| 6 | Ch18 综合实战 | 端到端构建可观测+安全工具 |
路线逻辑:从理解数据传递机制(Map)出发,掌握可观测性工具链,选择开发框架,最后解决生产部署中的实际问题。
路线D:Kubernetes 网络与安全
场景:Kubernetes 集群中 kube-proxy 的 iptables 模式在大规模 Service 下性能急剧下降,NetworkPolicy 无法实现 L7 策略——Cilium + eBPF 如何重塑 K8s 网络?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 eBPF 全景 | 理解 eBPF 在云原生场景的定位 |
| 2 | Ch7 XDP | XDP 加速 NodePort 和 LoadBalancer Service |
| 3 | Ch9 eBPF 网络 | eBPF 替代 kube-proxy 的完整方案 |
| 4 | Ch12 Cilium 深入 | 核心:Cilium 的身份安全模型、Hubble 可观测性、ClusterMesh |
| 5 | Ch15 eBPF 在 K8s | eBPF CNI 对比、Ambient Mesh、K8s 网络策略增强 |
| 6 | Ch17 生产部署 | K8s 集群中部署 Cilium 的最佳实践 |
路线逻辑:从 eBPF 网络基础出发,理解 kube-proxy 替代方案,深入 Cilium 架构,再看 K8s 集成与生产部署。
路线E:eBPF 开发入门
场景:你想从零开始学习 eBPF 开发——从写第一个 eBPF 程序到选择开发框架,从理解指令集到掌握 CO-RE 可移植性。
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 eBPF 全景 | 建立 eBPF 全局认知 |
| 2 | Ch2 虚拟机 | 理解 eBPF 指令集与寄存器模型——写出正确的 eBPF 字节码 |
| 3 | Ch4 Map 数据结构 | 掌握内核态与用户态的数据交互方式 |
| 4 | Ch6 CO-RE | 核心:BTF + libbpf 实现”一次编译到处运行” |
| 5 | Ch13 开发框架 | libbpf/Aya/Go eBPF/bpftrace——选择最适合你的框架 |
| 6 | Ch18 综合实战 | 从零构建完整的 eBPF 网络安全工具 |
路线逻辑:从底层原理(虚拟机、指令集)到数据交互(Map),到可移植性(CO-RE),到开发框架,最终通过实战综合运用。
路线交叉参考
同一章节在不同路线中的关注点不同:
| 章节 | 路线A 关注点 | 路线B 关注点 | 路线C 关注点 | 路线D 关注点 | 路线E 关注点 |
|---|---|---|---|---|---|
| Ch1 | 内核可编程能力边界 | 安全模型 | 零侵入优势 | 云原生定位 | 全局认知 |
| Ch2 | — | — | — | — | 指令集与寄存器 |
| Ch3 | — | 验证器安全保证 | — | — | — |
| Ch4 | — | — | Ring Buffer 传输 | — | 数据交互核心 |
| Ch5 | kprobe/tracepoint | LSM Hook | — | — | — |
| Ch6 | — | — | — | — | CO-RE 可移植性 |
| Ch7 | XDP 核心原理 | — | — | NodePort 加速 | — |
| Ch8 | TC 流量控制 | — | — | — | — |
| Ch9 | 连接跟踪/NAT | — | — | kube-proxy 替代 | — |
| Ch10 | — | LSM BPF + Tetragon | — | — | — |
| Ch11 | — | — | bpftrace/BCC | — | — |
| Ch12 | Cilium 网络方案 | — | — | Cilium 核心 | — |
| Ch13 | — | — | 框架选型 | — | 开发框架 |
| Ch15 | — | — | — | K8s CNI/Ambient | — |
| Ch16 | — | 内存安全边界 | — | — | — |
| Ch17 | — | — | 生产调试 | K8s 部署实践 | — |
| Ch18 | 网络安全工具 | 安全工具构建 | 可观测工具 | — | 综合开发 |
知识导图
以下导图展示 18 章知识之间的网络关系。这里强调跨领域的连接——一个 XDP 程序同时涉及虚拟机、验证器、Map、网络协议栈;一个 Cilium 部署同时依赖 XDP、TC、连接跟踪、身份安全。
概念关系图
章节网络关系图
知识关联参考表
按四层模型组织:基础层(eBPF 运行机制)→ 网络层(网络应用)→ 安全可观测层(监控能力)→ 生态层(开发与部署)。
| 基础概念 | 对应章节 | 网络应用 | 对应章节 | 安全可观测 | 对应章节 | 生态实践 | 对应章节 |
|---|---|---|---|---|---|---|---|
| eBPF 指令集 | Ch2 | XDP 快速路径 | Ch7 | LSM BPF | Ch10 | libbpf 开发 | Ch13 |
| 验证器安全 | Ch3 | TC 流量控制 | Ch8 | bpftrace 追踪 | Ch11 | Aya (Rust) | Ch13 |
| Hash/Array Map | Ch4 | 连接跟踪/NAT | Ch9 | Tetragon 监控 | Ch10 | Wasm-eBPF | Ch14 |
| kprobe/tracepoint | Ch5 | Cilium 身份安全 | Ch12 | Beyla 自动化 | Ch11 | K8s CNI | Ch15 |
| BTF + CO-RE | Ch6 | kube-proxy 替代 | Ch9 | 容器内存 | Ch16 | 生产部署 | Ch17 |
系列大纲
以下是按章节编号排列的完整目录。建议结合上方的场景驱动阅读路线和知识导图选择适合你的阅读顺序。
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 0 | 系列导读 | 系列定位、场景路线、知识导图、环境搭建 |
| 1 | eBPF 全景 | eBPF 起源、架构总览、程序类型、Map 概览、Hello World |
| 2 | eBPF 虚拟机 | 指令集、寄存器模型、ALU/JMP/内存指令、JIT 编译 |
| 3 | 验证器 | DAG 验证、路径探索、安全检查、复杂度限制、常见拒绝原因 |
| 4 | Map 数据结构 | Hash/Array/Per-CPU/Ring Buffer/Stack/Queue/LRU |
| 5 | Hook 点 | kprobe/kretprobe、tracepoint、uprobe/uretprobe、USDT |
| 6 | CO-RE | BTF 类型信息、vmlinux.h、libbpf 骨架、一次编译到处运行 |
| 7 | XDP | XDP 程序类型、XDP_PASS/DROP/TX/REDIRECT、驱动模式、性能对比 |
| 8 | TC | cls_bpf、ingress/egress、direct action、skb 操作 |
| 9 | eBPF 网络 | 连接跟踪、NAT、kube-proxy 替代、Socket Filter |
| 10 | eBPF 安全 | LSM BPF、Tetragon、进程监控、运行时安全 |
| 11 | eBPF 可观测性 | bpftrace、BCC、Beyla、性能分析、分布式追踪 |
| 12 | Cilium 深入 | 身份安全模型、Hubble、ClusterMesh、eBPF 管线 |
| 13 | eBPF 开发框架 | libbpf、Aya、Go eBPF、bpftrace、框架选型 |
| 14 | eBPF 与 WebAssembly | Wasm-eBPF、用户态 eBPF 运行时、跨平台可移植性 |
| 15 | eBPF 在 Kubernetes | CNI 对比、Ambient Mesh、网络策略增强、多集群 |
| 16 | eBPF 与内存管理 | eBPF-mm、容器内存追踪、Map 内存开销、内存限制 |
| 17 | eBPF 生产部署 | 性能开销、调试方法、灰度策略、内核兼容性 |
| 18 | 综合实战 | 构建完整的 eBPF 网络安全工具:XDP+TC+LSM |
开发环境搭建
系统要求
# 检查内核版本(需要 5.15+)uname -r# 5.15.0-91-generic
# 检查 BTF 支持(CO-RE 必需)ls /sys/kernel/btf/vmlinux# /sys/kernel/btf/vmlinux ← 存在即支持
# 检查 eBPF 特性支持bpftool feature probe | head -20安装开发工具
# Ubuntu 22.04+sudo apt updatesudo apt install -y build-essential clang llvm bpftool libbpf-dev linux-headers-$(uname -r)
# 验证安装clang --version # 需要 12+llc --version # LLVM 静态编译器bpftool version # eBPF 工具安装 bpftrace(可观测性工具)
# Ubuntu 22.04+sudo apt install -y bpftrace
# 验证bpftrace --version
# 运行第一个 bpftrace 程序sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s opened %s\n", comm, str(args->filename)); }'安装 BCC 工具集
# Ubuntu 22.04+sudo apt install -y bpfcc-tools linux-headers-$(uname -r)
# BCC 工具安装在 /usr/share/bcc/tools/ 下ls /usr/share/bcc/tools/# execsnoop opensnoop biolatency tcplife ...
# 运行 opensnoopsudo /usr/share/bcc/tools/execsnoop安装 Go eBPF 开发环境
# 安装 Gowget https://go.dev/dl/go1.22.0.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gzexport PATH=$PATH:/usr/local/go/bin
# 安装 cilium/ebpf 库go get github.com/cilium/ebpf
# 安装 eBPF code generatorgo install github.com/cilium/ebpf/cmd/bpf2go@latest编译第一个 eBPF 程序
# 创建工作目录mkdir -p ~/ebpf-lab && cd ~/ebpf-lab
# 编写 eBPF 程序(C)cat > hello.bpf.c << 'EOF'#include <linux/bpf.h>#include <bpf/bpf_helpers.h>
SEC("tracepoint/syscalls/sys_enter_execve")int hello_execve(void *ctx){ char msg[] = "Hello, eBPF!"; bpf_trace_printk(msg, sizeof(msg)); return 0;}
char LICENSE[] SEC("license") = "GPL";EOF
# 编译 eBPF 程序clang -g -O2 -target bpf -D__TARGET_ARCH_x86 \ -I/usr/include/$(uname -m)-linux-gnu \ -c hello.bpf.c -o hello.bpf.o
# 加载并运行sudo bpftool prog load hello.bpf.o /sys/fs/bpf/hello \ type tracepoint name sys_enter_execve
# 查看输出sudo cat /sys/kernel/debug/tracing/trace_pipe本系列的实践方法论
本系列遵循 理解原理 → 编写代码 → 验证效果 → 生产落地 的学习方法:
- 理解原理:通过架构图和源码分析,理解 eBPF 机制的设计动机与实现方式
- 编写代码:每章提供完整的可编译 eBPF 程序,从 Hello World 到生产级工具
- 验证效果:通过 bpftool、bpftrace、perf 等工具验证程序行为与性能
- 生产落地:讨论部署策略、兼容性处理、性能调优等工程实践
每章的「动手实践」部分都遵循这一方法论,让你不仅知道”是什么”,更理解”为什么”和”怎么做”。
推荐参考资料
经典教材
| 书籍 | 作者 | 特点 |
|---|---|---|
| 《BPF Performance Tools》 | Brendan Gregg | eBPF 性能分析的百科全书,覆盖所有 BCC 工具 |
| 《Learning eBPF》 | Liz Rice | eBPF 入门最佳读物,从原理到实践循序渐进 |
| 《Systems Performance》 | Brendan Gregg | 性能分析方法论,eBPF 是其中核心工具 |
| 《Linux Observability with BPF》 | David Calavera 等 | eBPF 可观测性专题,libbpf 实践丰富 |
| 《What is eBPF?》 | Liz Rice | O’Reilly 迷你书,1 小时快速理解 eBPF |
在线资源
- eBPF.io — eBPF 官方门户,文档、教程、生态一览
- Cilium Documentation — Cilium 官方文档,eBPF 网络最佳实践
- Linux Kernel BPF Documentation — 内核 BPF 子系统文档
- BPF & XDP Reference Guide — Cilium 维护的 BPF/XDP 参考指南
- Brendan Gregg’s eBPF Page — eBPF 性能分析参考
开发工具
- bpftool:eBPF 程序/Map 的瑞士军刀,查看、加载、调试
- bpftrace:高级追踪语言,一行命令即可追踪内核行为
- BCC (BPF Compiler Collection):Python/Lua 前端 + eBPF 后端的工具集
- libbpf:C 语言 eBPF 开发库,CO-RE 的基石
- pahole:BTF 类型信息生成工具
本系列所有 eBPF 程序均可在 Ubuntu 22.04(内核 5.15+)上运行。如果你的内核版本较低,部分高级特性(如 bpf_timer、bpf_kptr)可能不可用,但基础功能不受影响。
准备好开始了吗?从 eBPF 全景 开始你的 eBPF 之旅吧!
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






