2026/2/19 19:28:55
网站建设
项目流程
东鹏拼奖网站怎么做,怎么做自己淘宝优惠券网站,简网app工厂,罗湖商城网站设计制作eBPF 综合指南
目录
简介历史与演进eBPF 工作原理eBPF 架构eBPF 程序eBPF Maps应用场景工具与生态系统安全考虑性能特性快速入门未来发展方向 简介
eBPF#xff08;Extended Berkeley Packet Filter#xff09; 是一项革命性技术#xff0c;它允许在 Linux 内核中安全、高…eBPF 综合指南目录简介历史与演进eBPF 工作原理eBPF 架构eBPF 程序eBPF Maps应用场景工具与生态系统安全考虑性能特性快速入门未来发展方向简介eBPFExtended Berkeley Packet Filter是一项革命性技术它允许在 Linux 内核中安全、高效、可编程地执行沙盒程序而无需开发内核模块或修改内核源代码。eBPF 使开发者能够动态扩展内核功能提供前所未有的可观测性、安全性和网络功能同时通过验证过程确保安全性。核心特性安全性程序在执行前经过验证确保不会导致内核崩溃高效性通过 JIT即时编译编译为本地机器码实现接近原生的性能可扩展性可挂载到各种内核子系统无需修改内核代码可移植性通过 CO-RECompile Once, Run Everywhere支持在不同内核版本上运行可编程性使用熟悉的编程模型支持 C 或 Rust 语言历史与演进起源BPF1992年Berkeley Packet Filter 由 Steven McCanne 和 Van Jacobson 于 1992 年创建作为 BSD 操作系统中高效的数据包过滤机制。BPF 使用虚拟机在内核空间过滤数据包然后再将其复制到用户空间相比之前的方法显著提高了性能。演进为 eBPF2014年2014年Alexei Starovoitov 扩展了 BPF引入了新功能创建了 eBPF扩展的寄存器集从2个扩展到10个64位寄存器新的数据类型和指令支持 maps键值存储能够挂载到除数据包之外的各种内核事件JIT 编译支持重要里程碑年份里程碑1992原始 BPF 引入1997BPF 集成到 Linux 内核2011Seccomp-BPF 用于安全计算2014eBPF 合并到 Linux 内核v3.182017XDPeXpress Data Path引入2019CO-RECompile Once, Run Everywhere支持2020LSMLinux Security Modules钩子2021eBPF 成为 CNCF 孵化项目2023Windows eBPF 预览版发布eBPF 工作原理执行流程┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ eBPF 字节 │ │ 验证器 │ │ JIT/VM │ │ 代码 │────▶│ (安全性 │────▶│ 编译器 │ │ │ │ 检查) │ │ │ └─────────────┘ └──────────────┘ └─────────────┘ │ │ │ ▼ │ ┌──────────────┐ │ │ 本地 │ │ │ 执行 │ └─────────────────────────────▶│ 在内核中 │ └──────────────┘逐步流程程序编译eBPF 程序使用 C受限子集或 Rust 编写通过 LLVM/Clang 编译为 eBPF 字节码加载通过bpf()系统调用将字节码加载到内核验证内核验证器执行静态分析确保程序终止无无限循环检查越界内存访问验证寄存器使用和类型验证只调用允许的内核函数JIT 编译验证后的字节码被编译为主机架构的本地机器码挂载程序被挂载到特定的钩子点tracepoint、kprobe、socket 等执行当钩子被触发时eBPF 程序在该事件的上下文中执行eBPF 架构组件┌─────────────────────────────────────────────────────────────┐ │ 用户空间 │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ libbpf │ │ Cilium │ │ bcc │ │ bpftrace│ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ bpftool │ │ P4/eBPF │ │ XDP │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘ │ bpf() 系统调用 │ ┌─────────────────────────────────────────────────────────────┐ │ 内核空间 │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 验证器 │ │ JIT 引擎 │ │ Maps │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 钩子点 │ │ │ ├─────────┬──────────┬─────────┬─────────┬─────────────┤ │ │ │ Kprobes │ Tracepts │ Network │ LSM │ Socket │ │ │ └─────────┴──────────┴─────────┴─────────┴─────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ eBPF 程序 (JITed) │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘钩子点类型钩子类型描述使用场景Kprobes动态内核函数入口/返回函数跟踪、性能分析Uprobes用户空间函数跟踪应用程序分析Tracepoints静态内核检测点事件跟踪、调试Socket FiltersSocket 上的数据包过滤网络监控、防火墙XDPeXpress Data Path最早的数据包处理高性能网络、DDoS 防护TC流量控制QoS 和数据包操作网络策略、负载均衡cGroup每个 cgroup 的钩子资源监控、安全策略LSMLinux 安全模块安全钩子访问控制、运行时安全Perf Events性能监控事件CPU 分析、硬件计数器Socket OperationsSocket 创建、连接等网络可观测性eBPF 程序程序类型eBPF 支持多种程序类型每种都为特定目的而设计enumbpf_prog_type{BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,BPF_PROG_TYPE_SCHED_ACT,BPF_PROG_TYPE_TRACEPOINT,BPF_PROG_TYPE_XDP,BPF_PROG_TYPE_PERF_EVENT,BPF_PROG_TYPE_CGROUP_SKB,BPF_PROG_TYPE_CGROUP_SOCK,BPF_PROG_TYPE_LWT_IN,BPF_PROG_TYPE_LWT_OUT,BPF_PROG_TYPE_LWT_XMIT,BPF_PROG_TYPE_SOCK_OPS,BPF_PROG_TYPE_SK_SKB,BPF_PROG_TYPE_CGROUP_DEVICE,BPF_PROG_TYPE_SK_MSG,BPF_PROG_TYPE_RAW_TRACEPOINT,BPF_PROG_TYPE_CGROUP_SOCK_ADDR,BPF_PROG_TYPE_LWT_SEG6LOCAL,BPF_PROG_TYPE_LIRC_MODE2,BPF_PROG_TYPE_SK_REUSEPORT,BPF_PROG_TYPE_FLOW_DISSECTOR,BPF_PROG_TYPE_CGROUP_SYSCTL,BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,BPF_PROG_TYPE_CGROUP_SOCKOPT,BPF_PROG_TYPE_TRACING,BPF_PROG_TYPE_STRUCT_OPS,BPF_PROG_TYPE_EXT,BPF_PROG_TYPE_LSM,BPF_PROG_TYPE_SK_LOOKUP,BPF_PROG_TYPE_SYSCALL,};示例简单的 XDP 程序// xdp_drop.c#includelinux/bpf.h#includebpf/bpf_helpers.hSEC(xdp)intxdp_drop_prog(structxdp_md*ctx){void*data_end(void*)(long)ctx-data_end;void*data(void*)(long)ctx-data;// 丢弃所有数据包returnXDP_DROP;}char_license[]SEC(license)GPL;示例Kprobe 程序// trace_open.c#includelinux/bpf.h#includebpf/bpf_helpers.h#includebpf/bpf_tracing.hSEC(kprobe/do_sys_open)inttrace_do_sys_open(structpt_regs*ctx){// 记录文件打开事件bpf_printk(File opened: %s,PT_REGS_PARM1(ctx));return0;}char_license[]SEC(license)GPL;eBPF MapsMap 类型eBPF maps 是键值数据结构允许在 eBPF 程序之间以及内核和用户空间之间共享数据enumbpf_map_type{BPF_MAP_TYPE_HASH,BPF_MAP_TYPE_ARRAY,BPF_MAP_TYPE_PERCPU_HASH,BPF_MAP_TYPE_PERCPU_ARRAY,BPF_MAP_TYPE_LRU_HASH,BPF_MAP_TYPE_LRU_PERCPU_HASH,BPF_MAP_TYPE_LPM_TRIE,BPF_MAP_TYPE_ARRAY_OF_MAPS,BPF_MAP_TYPE_HASH_OF_MAPS,BPF_MAP_TYPE_DEVMAP,BPF_MAP_TYPE_SOCKMAP,BPF_MAP_TYPE_CPUMAP,BPF_MAP_TYPE_XSKMAP,BPF_MAP_TYPE_SOCKHASH,BPF_MAP_TYPE_CGROUP_STORAGE,BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,BPF_MAP_TYPE_QUEUE,BPF_MAP_TYPE_STACK,BPF_MAP_TYPE_SK_STORAGE,BPF_MAP_TYPE_DEVMAP_HASH,BPF_MAP_TYPE_STRUCT_OPS,BPF_MAP_TYPE_RINGBUF,BPF_MAP_TYPE_INODE_STORAGE,BPF_MAP_TYPE_TASK_STORAGE,BPF_MAP_TYPE_BLOOM_FILTER,};常用 Map 操作// 创建一个哈希表structbpf_map_defSEC(maps){.typeBPF_MAP_TYPE_HASH,.key_sizesizeof(__u32),.value_sizesizeof(__u64),.max_entries1024,}my_map;// eBPF 程序中的 map 操作__u32 key1;__u64 value42;// 查找bpf_map_lookup_elem(my_map,key);// 更新bpf_map_update_elem(my_map,key,value,BPF_ANY);// 删除bpf_map_delete_elem(my_map,key);Map 对比Map 类型描述使用场景HASH通用哈希表通用查找ARRAY固定大小数组索引数据、计数器PERCPU_HASH每个 CPU 的哈希表无锁统计LPM_TRIE最长前缀匹配树IP 路由、CIDR 匹配RINGBUF环形缓冲区高吞吐量事件流PERF_EVENT_ARRAY每个 CPU 的 perf 事件性能监控SOCKMAPSocket 映射Socket 重定向、连接跟踪应用场景1. 可观测性和监控eBPF 提供对系统行为的深度可见性且开销极小函数跟踪跟踪任何内核或用户空间函数性能分析CPU、内存、I/O 分析开销极低网络监控数据包级可见性、连接跟踪应用监控无需修改代码即可跟踪应用行为工具bpftrace、bcc、Bumblebee、Parca2. 网络eBPF 彻底改变了网络数据包处理XDPeXpress Data Path在最早阶段处理数据包实现高达 20M PPS负载均衡实现自定义负载均衡算法DDoS 防护以线速过滤恶意流量服务网格在内核中实现服务网格功能网络策略实施细粒度的网络安全策略项目Cilium、Katran、Cilium Enterprise、Facebook Katran3. 安全eBPF 提供强大的安全功能运行时安全实时检测和阻止可疑行为文件系统监控跟踪文件访问和修改进程跟踪监控进程创建、执行和终止网络安全实施入侵检测和防护容器安全保护容器化环境工具Falco、Tracee、Tetragon、BPF Observer4. 性能优化TCP 拥塞控制实现自定义拥塞控制算法Socket 优化优化 socket 缓冲区管理Cgroup 感知调度实现自定义调度策略I/O 优化优化块设备操作5. 故障排除和调试内核跟踪跟踪内核事件和函数应用调试无需重启即可调试应用程序延迟分析识别延迟瓶颈资源分析跟踪资源使用模式工具bpftrace、bcc、drgn工具与生态系统核心库和工具libbpf用于加载和与 eBPF 程序交互的官方 C 库。提供eBPF 程序加载Map 操作CO-RE 支持骨架生成# 安装 libbpfsudoaptinstalllibbpf-dev# Ubuntu/Debiansudoyuminstalllibbpf-devel# RHEL/CentOSbpftool用于检查和管理 eBPF 程序和 maps 的官方工具# 列出所有 eBPF 程序sudobpftool prog list# 显示程序详细信息sudobpftool prog showid123# 转储程序指令sudobpftool prog dump xlatedid123# 列出 mapssudobpftool map list# 转储 map 内容sudobpftool map dumpid456bccBPF Compiler Collection基于 Python 的框架用于编写带有嵌入式 C 的 eBPF 程序frombccimportBPF# 定义 eBPF 程序bpf_text #include uapi/linux/ptrace.h BPF_HASH(start, u32); int do_entry(struct pt_regs *ctx) { u32 pid bpf_get_current_pid_tgid(); u64 ts bpf_ktime_get_ns(); start.update(pid, ts); return 0; } # 加载和挂载bBPF(textbpf_text)b.attach_kprobe(eventdo_sys_open,fn_namedo_entry)bpftrace用于 eBPF 的高级跟踪语言# 按进程统计系统调用bpftrace -etracepoint:syscalls:sys_enter_* { [comm] count(); }# 分析 CPUbpftrace -eprofile:hz:99 { [stack] count(); }# 跟踪文件打开bpftrace -etracepoint:syscalls:sys_enter_openat { printf(%s %s\n, comm, str(args-filename)); }现代框架Cilium基于 eBPF 的 Kubernetes 网络、安全和可观测性使用 eBPF 的网络策略服务网格功能负载均衡可观测性Hubble# 安装 Ciliumciliuminstall--cluster-name my-clusterlibbpf-bootstrap使用 libbpf 和 CO-RE 开发 eBPF 应用程序的模板和示例gitclone https://github.com/libbpf/libbpf-bootstrapcdlibbpf-bootstrapmakeAya基于 Rust 的 eBPF 框架专注于开发者体验useaya::{Bpf,programs::KProbe};#[no_mangle]pubunsafeexternCfntry_to_wake_up(_ctx:*mutc_void)-i32{0}// 加载和挂载letmutbpfBpf::load([])?;letprogram:mutKProbebpf.program_mut(try_to_wake_up)?;program.load()?;program.attach(try_to_wake_up,0)?;可观测性工具工具语言使用场景bpftracebpftrace临时跟踪和分析bccPython复杂跟踪工具BumblebeeGoKubernetes 可观测性ParcaGo持续分析PixieCKubernetes 可观测性Ebpf-exporterGo从 eBPF 生成 Prometheus 指标安全工具工具描述Falco运行时安全监控TraceeLinux 安全可观测性Tetragon安全可观测性和执行BPF Observer安全监控平台安全考虑验证器eBPF 验证器是 eBPF 安全的基石。它执行控制流分析确保所有路径都终止内存安全验证所有内存访问类型检查强制类型安全权限检查验证只调用允许的辅助函数指针跟踪跟踪指针来源和边界安全特性沙盒执行程序在受限环境中运行无无限循环保证有界执行无内核内存损坏只有安全的内存访问权限分离CAP_BPF 能力用于加载程序命名空间隔离程序可以感知命名空间最佳实践使用最新内核较新的内核具有增强的验证器功能最小化复杂性更简单的程序更容易验证使用 CO-RE确保跨内核版本的可移植性遵循辅助函数限制只使用允许的辅助函数彻底测试首先在安全环境中验证程序安全顾虑信息泄露程序可能泄露内核内存拒绝服务复杂的程序可能减慢验证速度侧信道在某些情况下可能存在时序攻击权限提升谨慎使用 CAP_BPF 权限性能特性性能优势接近原生速度JIT 编译产生高效的本地代码零拷贝XDP 可以在不复制的情况下处理数据包低开销内核和用户空间之间的上下文切换最少可扩展每个 CPU 的 maps 实现无锁操作性能基准使用场景性能备注XDP Drop20-40 MPPS以线速丢弃数据包Socket Filter10-20 Gbps数据包过滤Kprobe Tracing1% 开销最小的性能影响Hash Map Lookup~50ns快速键值操作优化技术使用每个 CPU 的 Maps消除锁争用批量操作尽可能使用批量辅助函数提前退出尽可能提前返回避免循环首选展开代码或有界循环使用环形缓冲区高吞吐量事件流快速入门前置条件# 检查内核版本推荐 4.10uname-r# 安装所需工具sudoaptupdatesudoaptinstall-y\clang\llvm\libbpf-dev\linux-headers-$(uname-r)\bpfcc-tools\linux-tools-$(uname-r)\bpftoolHello World 示例1. 创建 eBPF 程序hello.bpf.c#includevmlinux.h#includebpf/bpf_helpers.h#includebpf/bpf_tracing.hSEC(tp/syscalls/sys_enter_execve)inthandle_execve(void*ctx){charcomm[16];bpf_get_current_comm(comm,sizeof(comm));bpf_printk(Hello, eBPF! Process: %s,comm);return0;}charLICENSE[]SEC(license)GPL;2. 创建加载器hello.c#includestdio.h#includeunistd.h#includebpf/libbpf.h#includebpf/bpf.hintmain(){structbpf_object*obj;structbpf_program*prog;interr;// 打开 eBPF 对象文件objbpf_object__open_file(hello.bpf.o,NULL);if(libbpf_get_error(obj)){fprintf(stderr,Failed to open eBPF object\n);return1;}// 加载 eBPF 程序errbpf_object__load(obj);if(err){fprintf(stderr,Failed to load eBPF object\n);return1;}// 查找程序progbpf_object__find_program_by_name(obj,handle_execve);if(!prog){fprintf(stderr,Program not found\n);return1;}// 挂载程序errbpf_program__attach(prog);if(err){fprintf(stderr,Failed to attach program\n);return1;}printf(eBPF program loaded! Press CtrlC to exit.\n);// 保持程序运行for(;;){sleep(1);}return0;}3. 编译和运行# 编译 eBPF 程序clang -g -O2 -target bpf -D__TARGET_ARCH_x86 -c hello.bpf.c -o hello.bpf.o# 编译加载器clang -g -O2 hello.c -o hello -lbpf -lelf# 运行sudo./hello# 在另一个终端查看日志sudocat/sys/kernel/debug/tracing/trace_pipe使用 bpftrace 进行快速实验# 按进程统计系统调用sudobpftrace -etracepoint:syscalls:sys_enter_* { [comm] count(); }# 分析 CPU 使用情况sudobpftrace -eprofile:hz:99 { [stack] count(); }# 跟踪文件打开sudobpftrace -etracepoint:syscalls:sys_enter_openat { printf(%s opened %s\n, comm, str(args-filename)); }未来发展方向新兴趋势Windows eBPFMicrosoft 正在开发 Windows 的 eBPF 支持用户空间 eBPF在用户空间运行 eBPF 程序ubpf硬件卸载将 eBPF 卸载到 NIC 和其他硬件基于 eBPF 的服务更多完全基于 eBPF 构建的服务改进的工具更好的开发工具和调试支持活跃开发领域CO-RE 改进更好的跨内核版本可移植性新的钩子点更多用于各种用例的挂载点增强的验证器更快、功能更强的验证Map 增强新的 map 类型和操作文档改进的文档和学习资源行业采用eBPF 正被主要公司采用Meta使用 eBPF 进行负载均衡Katran和监控Google在 GKE 中使用 eBPF 进行安全和网络Netflix使用 eBPF 进行可观测性和安全Cloudflare使用 eBPF 进行 DDoS 防护和网络Isovalent由 Cilium 创始人创立推动 eBPF 采用资源官方文档Linux Kernel eBPF 文档libbpf GitHubCilium 文档学习资源eBPF.io - eBPF 官方社区网站BPF 性能工具书籍Linux Observability with BPF工具和项目bcc - BPF 编译器集合bpftrace - 高级跟踪语言Cilium - 基于 eBPF 的网络和安全libbpf-bootstrap - libbpf 入门指南社区eBPF SlackeBPF 峰会CNCF eBPF 工作组结论eBPF 代表了我们与 Linux 内核交互方式的范式转变。通过提供安全、高效和可编程的内核内部接口eBPF 使我们在可观测性、网络、安全和性能优化方面能够实现前所未有的能力。随着生态系统的不断成熟和采用的增长eBPF 注定要成为云原生基础设施的基础技术使开发者能够在不修改内核代码的情况下构建更高效、安全和可观测的系统。eBPF 的未来是光明的持续的开发正在扩展其在操作系统和用例方面的能力。无论您是构建监控工具、保护容器还是优化网络性能eBPF 都为创新提供了强大的基础。