eBPF技术介绍与应用实践总结
eBPF技术介绍
eBPF(Extended Berkeley Packet Filter)是一项起源于Linux内核的革命性技术,允许在内核中运行沙盒程序,扩展内核功能,同时保证安全性和执行效率。eBPF架构包括用户空间程序和内核程序两部分,通过bpf()系统调用将用户空间程序的BPF字节码加载到内核,经过Verifier验证和JIT编译后,在内核的指定位置执行。
eBPF架构
- eBPF加载过程:包括字节码读取、重定位和Verifier验证。
- 字节码读取:读取ELF格式的字节码文件,获取指令、map定义等信息。
- 重定位:将字节码中的临时数据替换为更准确的信息,确保数据的正确性和完整性。
- Verifier:静态代码安全检查器,检查eBPF程序的安全性,防止破坏内核。
- JIT编译:将BPF字节码编译成机器码并缓存,提高执行效率。
- 挂载与执行:eBPF程序挂载到内核的不同位置/HOOK点,根据事件触发执行,并通过eBPF map实现用户空间和内核空间的通信。
eBPF常见程序类型
- kprobe:用于在指定代码执行前或执行后触发回调函数,用于调试内核代码、跟踪应用程序执行和收集性能统计信息。
- XDP:Linux网络处理流程中的eBPF钩子,在网络数据包到达网卡驱动层时进行处理,具有非常优秀的数据面处理性能。
- TC:Linux操作系统中的调度器,管理网络设备和队列,实现对不同类型流量的流量限制、限流、分类和优化。
- Sock_ops:通过eBPF程序拦截socket操作,动态设置TCP参数,统计套接字信息。
- LSM:Linux安全模块框架,允许用户空间程序向Linux内核添加自定义的安全模块,实现内核和安全模块的解耦。
eBPF常见开发框架
- BCC:用Python封装编译、加载和读取数据过程,提供很多API,需要在用户环境中有LLVM和kernel-devel。
- bpfTrace:基于BPF和BCC构建的开源跟踪程序,提供高级编程语言和DSL,依赖于BCC提供的libbcc.so文件。
- libbpf:Linux内核代码库中的C库,用于创建BPF用户态程序,解决头文件、兼容性和性能问题。
- libbpf-bootstrap:基于libbpf开发的框架,提供样例程序和模板,帮助开发者理解和使用libbpf。
- cilium-ebpf:基于Go语言的BPF库,将eBPF系统调用抽象为Go接口,具有用户态程序开发简单、编译简单、支持CO-RE等特点。
- Coolbpf:以CORE为基础实现,支持多语言开发、自动化测试、多种编译方式和基础模块,适合生产环境批量部署。
基于eBPF的技术创新与应用实践
eBPF具有高性能、高扩展、安全性等优势,在多个领域得到广泛应用。
基于eBPF的系统诊断
- 系统诊断面临挑战:传统工具在网络抖动、IO、内存和调度等方面存在局限性。
- 网络:网络抖动问题定位周期长、难度大。
- IO:难以确定进程对I/O的贡献和I/O归属的磁盘或文件。
- 内存:内存泄漏问题难以调试。
- 调度:中断抢占、进程唤醒后长时间无法调度、CPU任务队列过长等问题难以定位。
- 基于eBPF的系统诊断方案:
- 网络:PingTrace工具可以快速定位网络中哪个位置出现了问题。
- IO:iofsstat工具可以从进程的角度统计IO信息和文件读写信息。
- 内存:Coolbpf提供的memleak工具用于检测内存泄漏问题。
- 调度:irqoff工具可以定位关中断场景下的抖动问题。
- 基于eBPF的Profiling:
- ContinuesProfiling:通过eBPF和PMU获取调用栈信息,实现函数级别的消耗、整体资源消耗、内存占用和释放情况、等待锁和循环操作的监控。
- 整体架构:包括内核态eBPF获取栈信息程序和用户态函数符号解析程序。
基于eBPF的虚拟化IO全链路时延监测
- 虚拟化IO全路径分析主要面临的挑战:IO路径长、地址映射复杂、“观测者效应”。
- 基于bpftrace虚拟化IO路径追踪解决方案:
- 主要功能:支持虚拟化IO全链路追踪分析,支持IO请求跨用户态/内核态的完整生命周期分析。
- 关键技术:虚拟化IO路径全视图分析、基础追踪工具选型(bpftrace)、IO请求层间映射表。
基于eBPF的TCP监控
- TCP监控面临的挑战:传统方法采集信息有限、引入较高性能负载、对用户业务逻辑有侵入。
- 基于eBPF的TCP监控方案:
- tcprt工具基于eBPF的tracepoint和sockops机制实现,监控应用的“请求”与“响应”处理状态,采集相关网络参数。
基于eBPF的网络性能优化
- Linux网络性能优化面临的挑战:
- 内核网络处理能力存在性能瓶颈。
- 传统网络性能优化方案存在诸多问题,如兼容性问题、调试和故障排查困难、安全性考虑、性价比问题。
- 基于eBPF的Linux内核网络性能优化解决方案:
- 整体架构:基于eBPF的网络性能优化具有灵活性强、资源占用少、应用场景更丰富、兼容性高等特点。
- 应用实践:
- 基于TCeBPF加速同节点Pod通信,TCP Throughput提升显著。
- 基于sockops/sockmap加速同节点Pod通信,TCP Throughput提升显著。
- 基于TCeBPF加速跨节点Pod通信,TCP Throughput提升显著。
- 基于Socket拦截加速东西向clusterIP访问,包转发率提高140%,CPU消耗降低46%。
- 基于XDP加速南北向本地NodePort访问,包转发率提高138%,CPU消耗降低65%。
- 基于DSR加速南北向远端NodePort访问,包转发率提高136%,CPU消耗降低47%。
- 基于TCeBPF针对指定端口定向到指定网卡的流量加速转发,DNS解析整体延迟减少20%以上。
基于eBPF的流量镜像
- 传统流量镜像面临的挑战:流量精准度问题、兼容性问题、可扩展性问题。
- 基于eBPF的流量镜像解决方案:
- 总体方案:在节点网卡TC位置的ingress方向挂载eBPF程序,拦截符合条件的流量,原始流量继续放行。
- 特点:内核态执行、轻量化、性能高、安全性高、基于软件实现、无特殊硬件要求、可兼容更多的云平台网络方案、可扩展性高、易于观测。
- 应用实践:在某大型企业客服系统容器化迁移项目中,基于eBPF的流量镜像实现更加精准有效的流量采集。
网络访问控制
- 传统网络访问控制面临的挑战:可维护性问题、兼容性问题、可扩展性问题。
- 基于eBPF的网络访问控制解决方案:
- 总体方案:基于eBPF编写安全加固处理程序,并将其挂载在XDP、TC等linux操作系统网络流量入口。
- 特点:兼容性强、性能更优、可扩展性高、易于观测。
- 应用实践:某银行清算系统通过基于eBPF的网络访问控制,实现更加安全的网络访问控制。
优化基于eBPF的软件网络功能
- 基于eBPF实现网络功能的优势:
- 集成到云生态中。
- 性能和CPU利用率、安全、隔离性、运维成本之间的平衡。
- 动态加载用户代码,无需修改内核源代码,提高可维护性和灵活性。
- eBPF实现网络功能面临的技术挑战:
- 无法实现特定的网络功能,如基于跳表的key-value store和基于红黑树的优先级队列。
- 性能次优,RISC指令集缺乏对特定指令的支持,帮助函数性能开销大。
- 基于标准库的优化eBPF网络功能技术方案:
- 整体架构:设计并实现一个可供eBPF调用的网络功能标准库eNetSTL,将通用模式抽象并实现为高性能低开销的API。
- 技术实践:
- 基于eNetSTL实现跳表,性能损耗在10%以下。
- 基于eNetSTL实现sketch,平均性能提升了47.9%。
- 基于eNetSTL优化CuckooSwitch中的hash性能,平均性能提升27.4%。
基于eBPF的安全实践
- 传统解决方案面临挑战:内核模块技术存在安全风险。
- 基于eBPF的新一代安全解决方案:
- 浪潮信息云峦服务器操作系统KeyarchOS提供轻量化的安全防御组件KSecure,采用eBPF技术路线,提供主机、容器安全检测和防御能力。
- 主要功能:关键文件/进程防护、主机入侵检测、容器逃逸防护、容器入侵检测、安全基线检测、安全管理。
- 整体架构:基于eBPF的系统内多层次hook技术,将eBPF程序hook到操作系统内核的多个层级。
- 基于eBPF的主机安全:
- eBPF-LSM hook技术:实现入侵检测和关键文件和进程防御功能。
- 基于eBPF的内核监控技术:监控系统中的文件操作、进程创建、网络连接等行为,实现入侵事件识别和攻击阻断。
- 基于eBPF的容器安全:
- 容器逃逸防护技术:分析各类容器逃逸行为,识别并阻断逃逸行为。
- 容器定位技术:内核态获取更多进程信息,配合用户态获取的容器信息定位具体容器。
- 应用场景:
- 安全加固:提升操作系统的合规性和安全性。
- 黑客入侵:降低因系统漏洞利用导致的提权攻击、Rootkit攻击、进程注入等风险。
- 业务防护:为关键业务服务器提供保护,限制非法操作。
挑战与展望
eBPF技术面临一些挑战,如恶意使用bpfTrace可能引发安全攻击、eBPF程序的安全性风险、兼容性问题、基础技术碎片化等。
对eBPF技术的展望包括:
- 更完备的编程能力。
- 更强的安全性。
- 更广泛的移植能力。
- 更强的可编程能力。
- 定制化调度。
- 智能化。
eBPF技术将继续在云原生、可观测、性能调优、安全、硬件加速、AI等领域实现技术创新与应用场景扩展,提供更多的工具和方案,以应对不断增长的各种挑战和需求。