eBPF ( Extended Berkeley Packet Filter)是一项革命性的技术,它实现了在Linux内核中安全地运行注入的回旋代码,不需要修改内核源码,也不需要加载内核模块,即可动态地增强系统能力。< /p>
从最初的网络分组过滤器(BPF,1992年)到现今的eBPF,这项技术已经演化成为现代事务型内核扩展的标准架构。现代云原生生态中,eBPF已成为可观测性、网络加速、安全监控等领域的核心基础设施,被巨头如Meta、Google、Netflix、Cloudfare并采用于生产环境。< /p>
Architecture Overview< /h2 >
eBPF的核心架构包含以下元素:< /p>
- BPF 虚拟机< /strong>:一个简单且安全的指令集架构(11 个64位寄存器,1 个程序计数器),支持在内核中将回旋代码执行。< /li>
- BPF 验证器 (Verifier)< /strong>,确保程序不会导致内核崩溃或安入漏洞:检查所有反转是否到达,检查寄存器使用和内存访问边界,检查函数调用权限。< /li>
- BPF JIT 编译器< /strong>,将BPF字节码编译为本机机器指令,提高执行效率。< /li>
- BPF Maps< /strong>,内核态与用户态之间高效交互的键值存储数据结构,支持Hash、Array、RingBuffer、LruHash、LpmTrie、ProgramArray等多种类型。< /li>
- 函数调用< /strong>(bpf_helper_),eBPF程序可以通过预定义的内核联系函数access内核数据结构,如bpf_map_lookup_elem、bpf_perf_event_output、bpf_get_pid_tgid等。< /li> < /ul>
Hook Types & Helpers< /h2 >
eBPF支持多种挂针类型,根据用途可以分为以下几类:< /p>
分组过滤 (XDP/EBPF):< /strong>在网络卡驱动层面处理入序分组,在数据包到达内核的前後单页内存处理,因此XDP可以在低延迟下实现分组过滤、测量、负载均衡。< /p> < /li>
系统调用过滤 (Tracer/EBPF):< /strong>在系统调用入口出口挂针,记录或拒绝系统调用,用于安全监控、可观测性。< /p> < /li>
Kprobe/Uprobe/Tracepoint:< /strong>< /p>
- kprobe:动态挂载内核函数,通过在目标函数首地址放置断点挂载eBPF程序,用于内核函数调试、性能分析。< /li>
- uprobe:用户态函数挂载,用于分析应用服务器行为。< /li>
- tracepoint:静态挂载点,由内核开发者预先定义(如sched_process_exec、netsize_skb等),是最稳定的eBPF挂载方式。< /li> < /ul> < /li>
Fentry/Fexit (BTF Function Tracing):< /strong>无需kprobe的内存写入,可以访问参数和返图值的环境信息,是kprobe的更优雅替代。< /p> < /li>
LSM (Linux Security Module):< /strong>在内核安入点增强安全策略,如BPF LSM(5.7+)可以直接拦截文件操作、网络接入、进程操作等操作。< /p> < /li> < /ul>
BPF Maps - The Bridge between Kernel and User Space< /h2 >
BPF Maps 是eBPF框构的核心数据通道,下面是常用类型及其适用场景:< /p>
Map Type< /th> Use Case< /th> Characteristic< /th> < /tr> < /thead > BPF_MAP_TYPE_HASH< /td> 速度用故事追踪,语义记录< /td> O(1) 读写,支持per-CPU 参数< /td> < /tr> BPF_MAP_TYPE_ARRAY< /td> 状态分及,配置设置< /td> 定长,索引操作,主要用于单次内核通信< /td> < /tr> BPF_MAP_TYPE_RINGBUF< /td> 数据流分析,事件监听,日志上报< /td> 高并发效率,自动滚动,支持内核-用户态高速传输< /td> < /tr> BPF_MAP_TYPE_LPM_TRIE< /td> 前缀匹配,IP 路由,网桥负载均衡< /td> 用户态显萁,Fast 查询< /td> < /tr> BPF_MAP_TYPE_LRU_HASH< /td> 缓存,高速取提,缓存用户贝取< /td> 自动驱退最久未用的元素< /td> < /tr> BPF_MAP_TYPE_PROG_ARRAY< /td> 回调路由,程序跳转表< /td> 将系统调用index映射到另一个eBPF程序< /td> < /tr> BPF_MAP_TYPE_PERF_EVENT_ARRAY< /td> 性能事件上报,用于perf监听< /td> 对接perf_event_open 系统调用,多核events 实时上报< /td> < /tr> < /tr> < /tbody> < /table> XDP - eXpress Data Path< /h2 >
XDP是eBPF在网络框构中最高效的应用场景。它可以在网络卡驱动中早期地处理大量的入序分组,无需通过内核网络栈,这将大幅提升分组处理速度。XDP的核心运行模式包括:< /p>
- XDP_DROP:< /strong>在驱动层面直接丢弃分组,避免多余内核联系,用于敀制DDoS 攻击。< /li>
- XDP_PASS:< /strong>将分组交给内核网络栈继续处理。< /li>
- XDP_TX:< /strong>反将分组从同一网卡释放,可用于单元测量。< /li>
- XDP_REDIRECT:< /strong>将分组重定向到另一网卡或CPU处理队列,用于负载均衡,cpus的网络加速。< /li>
- AF_XDP: < /strong>一种跨越通道,可
评论列表 共有 0 条评论
- XDP_PASS:< /strong>将分组交给内核网络栈继续处理。< /li>
- BPF 验证器 (Verifier)< /strong>,确保程序不会导致内核崩溃或安入漏洞:检查所有反转是否到达,检查寄存器使用和内存访问边界,检查函数调用权限。< /li>

发表评论 取消回复