eBPF技术实践白皮书.pdf
《eBPF技术实践白皮书.pdf》由会员分享,可在线阅读,更多相关《eBPF技术实践白皮书.pdf(65页珍藏版)》请在咨信网上搜索。
1、 编写说明编写说明 编写单位编写单位:浪潮电子信息产业股份有限公司、阿里云计算有限公司 参编组织参编组织:龙蜥社区 编写组成员编写组成员:苏志远、吴栋、方浩、王传国、梁媛、黄吉旺、毛文安、程书意、甄鹏、李宏伟、彭彬彬 前言 eBPF 的诞生是 BPF 技术的一个转折点,使得 BPF 不再仅限于网络栈,而是成为内核的一个顶级子系统。在内核发展的同时,eBPF 繁荣的生态也进一步促进了 eBPF 技术的蓬勃发展。随着内核的复杂性不断增加,eBPF 以安全、稳定、零侵入、方便的内核可编程性等特点成为实现内核定制与功能多样性的最佳选择,为内核提供了应对未来挑战的基础。本白皮书重点介绍 eBPF 技术的
2、概念、技术实践以及发展趋势。本书首先梳理了eBPF 的架构和重要技术原理,然后分析了 eBPF 在多种典型应用场景的使用方案,并进一步对 eBPF 技术的发展趋势做了探讨。目录目录 eBPF 简介.6 eBPF 技术介绍.7 2.1 eBPF 架构.7 2.1.1 eBPF 加载过程.8 2.1.2 JIT 编译.9 2.1.3 挂载与执行.10 2.2 eBPF 常见的开发框架.17 2.2.1 BCC.17 2.2.2 bpfTrace.18 2.2.3 libbpf.18 2.2.4 libbpf-bootstrap.19 2.2.5 cilium-ebpf.19 2.2.6 Coolb
3、pf.19 eBPF 的应用场景与实践.23 3.1 基于 eBPF 的系统诊断.23 3.1.1 系统诊断面临挑战.23 3.1.2 基于 eBPF 的系统诊断方案.28 3.2 基于 eBPF 的虚拟化 IO 全链路时延监测.34 3.2.1 虚拟化 IO 全路径分析主要面临的挑战.34 3.2.2 基于 bpftrace 虚拟化 IO 路径追踪解决方案.36 3.3 基于 eBPF 的网络性能优化.41 3.3.1 Linux 网络性能优化面临的技术挑战.41 3.3.2 基于 eBPF 的 Linux 内核网络性能优化解决方案.44 3.4 基于 eBPF 的主机安全.53 3.4.1
4、 传统解决方案面临挑战.53 3.4.2 基于 eBPF 的新一代主机安全解决方案.54 挑战与展望.63 eBPF 简介 eBPFeBPF 简介简介 eBPF 是一项起源于 Linux 内核的革命性技术,可以在特权上下文中(如操作系统内核)运行沙盒程序。它可以安全有效地扩展内核的功能,并且不需要更改内核源代码或加载内核模块。内核因具有监督和控制整个系统的特权,一直是实现可观察性、安全性和网络功能的理想场所。同时,由于对稳定性和安全性的高要求,内核发展相对缓慢,与内核之外实现的功能相比,创新速度较慢。eBPF 从根本上改变了上述情况,它允许在内核中运行沙箱程序,即通过运行eBPF 程序向正在运
5、行中的操作系统添加额外的功能,并通过验证引擎和即时编译器保证安全性和执行效率,由此衍生出了一系列的产品和项目,涉及下一代网络、可观察性和安全技术。如今,eBPF 在多种应用场景中起到重要作用:在现代数据中心和云原生环境中提供高性能网络和负载均衡,以低开销提取细粒度的安全可观察性数据,帮助应用程序开发人员跟踪应用程序的运行状态,高效进行性能故障定位,保证应用程序和容器运行时安全等。eBPF 引领的创新才刚刚开始,一切皆有可能。eBPF 技术介绍 eBPFeBPF 技术介绍技术介绍 2.1 eBPFeBPF 架构架构 eBPF 包括用户空间程序和内核程序两部分,用户空间程序负责加载 BPF 字节码
6、至内核,内核中的 BPF 程序负责在内核中执行特定事件,用户空间程序与内核 BPF程序可以使用 map 结构实现双向通信,这为内核中运行的 BPF 程序提供了更加灵活的控制。eBPF 的工作逻辑如下:1、eBPF Program 通过 LLVM/Clang 编译成 eBPF 定义的字节码;2、通过系统调用 bpf()将字节码指令传入内核中;3、由 Verifier 检验字节码的安全性、合规性;4、在确认字节码程序的安全性后,JIT Compiler 会将其转换成可以在当前系统运行的机器码;5、根据程序类型的不同,把可运行机器码挂载到内核不同的位置/HOOK 点;6、等待触发执行,其中不同的程序
7、类型、不同的 HOOK 点的触发时机是不相同的;并且在 eBPF 程序运行过程中,用户空间可通过 eBPF map 与内核进行双向通信;eBPF 技术介绍 图 2-1-1 eBPF 基本架构与使用示意图 2.1.1 eBPFeBPF 加载过程加载过程 编译得到的 BPF 字节码文件,经过字节码读取、重定位和 Verifier 等过程,加载到内核中。1 1、字节码读取字节码读取 通常 eBPF 字节码文件都是 ELF 格式,各 section 中保存着字节码所有的信息,包括字节码指令、map 定义、BTF 信息,以及需要重定位的变量和函数等;eBPF 加载时,依照 ELF 格式读取字节码文件,把
8、各种信息按照一定的格式保存起来。2 2、重定位、重定位 重定位是指在编译、加载的过程中把字节码中一些临时数据以更准确的信息进行替换,比如用 map 句柄替换 map 索引,用 map 地址替换 map 句柄。经过多轮重定位,可以确保 eBPF 程序在内核中运行所需数据的正确性和完整性。需要重定位的对象有:map、函数调用、Helper 函数调用、字段、Extern 内核符号和 kconfig。eBPF 技术介绍 重定位操作主要分为 2 类:1)BPF 基础设施提供了一组有限的“稳定接口”,通过 convert_ctx_access 对CTX 进行转换,实现内核版本升级时的稳定性和兼容性。2)C
9、O-RE 采用(BTF)非硬编码的形式对成员在结构中的偏移位置进行描述,解决不同版本之间的差异性问题。3 3、V Verifiererifier Verifier 是一个静态代码安全检查器,用于检查 eBPF 程序的安全性,保证 eBPF程序不会破坏内核,影响内核的稳定性。安全检查主要分成两个阶段。第一个阶段检查函数的深度和指令数,通过使用深度优先遍历,来检查是否为有向无环图(DAG)。第二个阶段检查每条 bytecode 指令,根据指令的分类(class),检查其操作寄存器的读写属性、内存访问是否越界、BPF_CALL 是否符合接口协议等。指针的安全性检查在第二个阶段实现,每次把指针加载到寄
10、存器时都会进行指针类型的判定,根据指针类型定义确定读写属性和大小,实现针对指针操作的安全性检查;未识别的指针类型不允许解引用。2.1.2 JITJIT 编译编译 执行字节码是一个模拟 CPU 执行机器码的过程,在运行时需要先把指令依次翻译成机器码之后才能运行,所以比机器码的执行效率低很多。JIT(Just In Time)的eBPF 技术介绍 中文意思是即时编译,主要为了解决虚拟机运行中间码时效率不高的问题。JIT 编译在执行前先把中间码编译成对应的机器码并缓存起来,从而运行时能够直接执行机器码,这样就解决了每次执行都需要进行中间码解析的问题,如下图所示:图 2-1-2 JIT 的作用示意图
11、2.1.3 挂载与执行挂载与执行 eBPF 在内核提供了大量的挂载点,算上 kprobe 挂载点,几乎可以在内核代码的任意函数挂载一段 eBPF 程序。不同 eBPF 程序类型的挂载点各不相同,挂载点是根据设计与需求提前在内核指定位置通过提前嵌入代码实现的,初始时函数指针是空,挂载 eBPF 程序后,对指针赋值,指向 eBPF 内核程序。为了安全性,挂载 eBPF 程序需要 root 权限或 CAP_BPF capability,不过目前也有设计允许非 root 权限帐号载入 eBPF 程序,比如将 kernel.unprivileged_bpf_disabled sysctl 设置为 fal
12、se 的情况下,非 root 帐号能够使用 bpf()系统调用。eBPF 技术介绍 eBPF 内核程序基于事件触发,当内核执行到对应的挂载点时就会执行挂载在此处的 eBPF 程序。eBPF 执行过程中会用到一个很重要的数据结构 map,map 的主要功能是用来实现 BPF 程序执行过程中用户空间程序与内核 BPF 程序之间的双向通信,这也为内核中运行的 BPF 程序提供了更加灵活的控制。1、map 的的实现实现 map 的定义信息在编译后会保存到字节码文件中名为 maps 的 section 中,bpf 加载器读取到 map 信息后调用系统调用创建 eBPF map,系统调用返回由 anon_
13、inodefs文件系统生成的 fd。加载器将内核返回的 map 的 fd,替换到使用 map 的 eBPF 指令的常量字段中,相当于直接修改编译后的 BPF 指令。加载器在指令替换 map fd 后,才会调用 cmd 为 BPF_PROG_LOAD 的 bpf 系统调用,将程序加载到内核。内核在加载eBPF程序系统调用过程中,会根据eBPF指令中常量字段存储的map fd,找到内核态中的 map,然后将 map 内存地址替换到对应的 BPF 指令。最终,BPF 程序在内核执行阶段能根据指令存储的内存地址访问到 map。在 eBPF 数据面中,使用 eBPF map 只需要按照规范定义 map
14、的结构,然后使用bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等 helper function就可以对 map 进行查询、更新、删除等操作。2、map 的的性能性能 eBPF 技术介绍 eBPF map 有多种不同类型,支持不同的数据结构,最常见的例如 Array、Percpu Array、Hash、Percpu Hash、Lru Hash、Percpu lru Hash、Lpm 等等。常用 map 的查询性能比较如下:Array Percpu Array Hash Percpu Hash Lru Hash Lpm 需
15、要着重说明的是,Array 的查询性能比 Percpu Array 更好,Hash 的查询性能也比 Percpu Hash 更好,这是由于 Array 和 Hash 的 lookup helper 层面在内核有更多的优化。对于读多写少的情况下,使用 Array 比 Percpu Array 更优(Hash、Percpu Hash 同理),而对于读少写多的情况(比如统计计数)使用 Percpu 更优。2.1.3.1 eBPF 常见程序类型常见程序类型 eBPF 作为一个通用执行引擎,可用于性能分析工具、软件定义网络等诸多场景的开发工作。根据应用场景的不同,eBPF 程序类型大致可以分为三类:表
16、2-1-1 eBPF 程序类型分类 分类 用途 包含的程序类型 跟踪 主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑 tracepoint,kprobe,perf_event 等 网络 主要用于对网络数据包进行过滤和处理,进而实现网络的观测、过滤、流量xdp,sock_ops,sk_msg,sk_skb,sk_reuseport,socket_filter,eBPF 技术介绍 控制以及性能优化等各种丰富的功能 cgroup_sock_addr 等 其他 主要用于安全和其他功能 LSM,flow_dissector,lwt_in,lwt_out,lwt_xmit 等 1、
17、kprobe kprobe 是 linux 系统的一个动态调试机制,使用它可以向内核添加探针(Probe),在代码执行前或执行后触发一个回调函数。这个机制通常用于调试内核代码,跟踪应用程序执行或收集性能统计信息。通过使用 kprobe,开发人员可以在不影响系统运行逻辑的情况下,对操作系统进行深入的分析和调试。kprobe 机制提供了两种形式的探测点,一种最基本的 kprobe:用于在指定代码执行前、执行后进行探测,挂载点可以是内核代码的任何指令处;一种是 kretprobe:用于完成指定函数返回值的探测功能,挂载点是内核函数的返回位置;当内核执行到指定的探测函数时,会调用回调函数,用户便可收集
18、所需的信息,在完成回调函数后,内核会继续回到原来的位置正常执行。如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态的移除探测点。eBPF 可以在内核态高效的分析 kprobe 采集到的数据,仅把结果反馈到用户空间,而不需要像传统系统一样必须将大量的采样数据全部传输到用户空间再进行分析,极大地减轻了内核态与用户态的通信压力,使得持续地实时分析成为可能。eBPF 技术介绍 2、XDP XDP 全称 eXpress Data Path,即快速数据路径,XDP 是 Linux 网络处理流程中的一个 eBPF 钩子,能够挂载 eBPF 程序,它能够在网络数据包到达网卡驱动层时对其进行处理,具有
19、非常优秀的数据面处理性能,打通了 Linux 网络处理的高速公路。XDP 程序最常用的模式是 native,它的挂载点处于网卡驱动之中,在网络驱动程序刚收到数据包时触发,无需通过网络协议栈,可用来实现高性能网络处理方案,常用于 DDos 防御,防火墙,4 层负载均衡等场景。图 2-1-3 XDP 的工作过程示意图 XDP 程序在处理网络包后,有不同处理方式 表 2-1-2 XDP 的处理方式 命令码 含义 使用场景 eBPF 技术介绍 XDP_DROP 丢包 防火墙,DDOS 攻击防御 XDP_PASS 传递到内核协议栈 正常处理 XDP_TX/XDP_REDIRECT 转发到同一/不同网卡
20、负载均衡 XDP_ABORTED 错误 XDP 处理错误 3、TC Linux TC 是 Linux 操作系统中的一个调度器,它是 Traffic Control 的缩写,是一种网络流量控制、流量压缩和 QoS(Quality of Service)保证机制,在 Linux 内核中相当于一个独立的子系统,它管理着 Linux 内核中的网络设备和队列,可以实现对不同类型的流(如 HTTP、FTP、SSH 等)的流量限制、限流、分类和优化等,所有这些功能都是经过用户态 TC 命令工具来完成的,一般包括以下的步骤:1、为网卡配置一个队列;2、在该队列上创建分类;3、根据需要创建子队列和子分类;4、为
21、每一个分类创建过滤器。eBPF 在 TC 功能的 sch_handle_ingress、sch_handle_egress 函数中分别添加 HOOK点实现了 TC ingress 和 TC egress 两个挂载点,用于实现对网络流量的整形调度和带宽控制。eBPF 技术介绍 eBPF/TC 直接获取内核解析后的网络报文数据结构 sk_buff,可以获取到更详细的数据。而且由于 eBPF 程序的引入,可以通过 eBPF map 实现用户态与内核态的数据交互,而 map 数据结构则相比 TC 的规则更加直观,也更加好管理。4、Sock_ops sock_ops 是一种通过 eBPF 程序拦截 so
22、cket 操作,然后动态设置 TCP 参数的机制。它总共提供了 15 个挂载点,分别位于 TCP socket 实现的各个阶段,包括三次握手和四次挥手,可用于动态设置 TCP 参数,也可用于统计套接字信息。sock_ops BPF 程序会利用 socket 的一些信息(例如 IP 和 port)来决定 TCP 的最佳配置。例如,在 TCP 建立连接时,如果判断 client 和 server 处于同一个数据中心(网络质量非常好),那么就可以通过如下设置优化这个 TCP 连接:1、设置更合适的 buffer size:RTT 越小,所需的 buffer 越小;2、修改 SYN RTO 和 SYN
23、-ACK RTO,大大降低重传等待时间;3、如果通信双方都支持 ECN,就将 TCP 拥塞控制设置为 DCTCP(DataCenter TCP)。5、LSM LSM(Linux Security Modules)是一个框架,允许用户空间程序向 Linux 内核添加自定义的安全模块。这些模块可以实施 MAC(Mandatory Access Control)、RBAC(Role-Based Access Control)等各种策略。LSM 在 Linux 内核安全相关的关键路径上预置了一批 hook 点,从而实现了内核eBPF 技术介绍 和安全模块的解耦,使不同的安全模块可以自由地在内核中加载/
24、卸载,无需修改原有的内核代码就可以加入安全检查功能。在过去,使用 LSM 主要通过配置已有的安全模块(如 SELinux 和 AppArmor)或编写自己的内核模块;而在 Linux 引入 BPF LSM 机制后,一切都变得不同了:现在,开发人员可以通过 eBPF 编写自定义的安全策略,并将其动态加载到内核中的 LSM挂载点,而无需配置或编写内核模块。当 eBPF 与 LSM 结合使用时,可以通过在 eBPF 程序中访问 LSM 接口来增强内核安全性,并对系统进行更细粒度的访问控制。例如,在 eBPF 程序中使用 LSM 接口来限制进程对某些敏感文件或目录的访问权限。此外,还可以在 eBPF
25、程序中启用LSM Hook 以监视系统调用和网络连接,并执行适当的操作以保护系统免受恶意软件攻击。结合使用 eBPF 和 LSM 还可以使系统更加安全和高效,并提供更多的可定制化选项。2.2 eBPFeBPF 常见的开发框架常见的开发框架 2.2.1 BCCBCC BCC 是如今最热门也是对新手最友好的开源平台,它用 python 封装了编译、加载和读取数据的过程,提供了很多非常好用的 API;和 libbpf 需要提前把 bpf 程序编译成 bpf.o 不同,BCC 是在运行时才调用 LLVM 进行编译的,所以要求用户环境上有 LLVM 和 kernel-devel。eBPF 技术介绍 2.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eBPF 技术 实践 白皮书
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【Stan****Shan】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【Stan****Shan】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。