与EBPF相关的令人敬畏的项目的精心策划列表。
BPF(如伯克利数据包过滤器中)是一种从用户空间传递的内核虚拟机。最初在BSD,然后是Linux上实现的(现为遗产)“经典BPF”或CBPF计算机将与TCPDUMP之类的工具一起使用,用于过滤内核中的数据包,以避免使用用户空间的无用副本。最近,Linux中的BPF基础架构已完全重新设计,并赋予了“扩展的BPF”或EBPF的生命,该基础架构获得了新功能(安全性和终止检查,用于程序,持久地图,标准库,硬件卸载支持等),现在用于许多任务。处理非常低级别(XDP)的处理数据包,系统上的跟踪和监视事件,或对CGROUP进行访问控制只是EBPF带来性能,可编程性和灵活性的一些示例。
最近,Cilium推出了一个关于EBPF的很棒的网站,称为EBPF.IO。它具有与此列表相似的目的,并介绍了EBPF并链接到相关项目。
注意:EBPF是一项令人兴奋的技术,其生态系统正在不断发展。我们希望您能为您提供帮助,以使这一出色的列表保持最新状态,并以我们可以提高其信噪比。请随时留下任何反馈。
bpf(2) - 关于bpf()系统调用的手册页,用于管理BPF程序和用户空间中的地图。tc-bpf(8) - 有关将BPF与TC一起使用的手册页,包括示例命令和代码示例。bpf-helpers(7)人页 - 内核内帮手功能的描述,形成了BPF标准库。IO遮阳板的非官方EBPF规格 - EBPF语法和操作代码的摘要。
Jesper Dangaard Brouer的文档 - 正在进行的工作,欢迎捐款。
从戴维·米勒(David Miller)到XDP纽比斯邮件列表的电子邮件:
每个内核版本的BPF功能列表
如果您是EBPF的新手,则可能需要尝试本节中描述的“介绍”的链接。
简要介绍XDP和EBPF-可访问的简介提供了上下文,历史记录以及有关EBPF功能的详细信息。
EBPF概述 - Adrian Ratiu的博客系列,涵盖EBPF基础架构的许多方面:
Ferris Ellis关于EBPF的博客文章 - 他们有一些有关EBPF的文章:
BPF参考指南 - 关于BCC存储库的BPF C和BCC Python帮助者。
通过BPF和XDP使内核的网络数据路径可以编程 - 一组幻灯片涵盖了有关EBPF和XDP的所有基础知识(主要用于网络处理)。
BSD数据包过滤器 - 简介主要涵盖了追踪方面。
BPF:跟踪等等 - 介绍主要涵盖追踪方面。
Linux BPF SuperPowers-简介主要涵盖了带有火焰图的第一部分。
IO遮阳板 - 还介绍了IO遮阳板项目。
BPF-内核虚拟机 - 由EBPF的作者演示。
扩展了扩展BPF-从2014年开始的一篇博客文章,介绍了BPF的开发并通过将EBPF程序附加到套接字上,以使用状态套接字过滤的示例来说明它可以做什么。
格雷格·马斯登(Greg Marsden)提供了一些有关EBPF的文件:
Linux内核通过EBPF的可观察性 - 涵盖EBPF的基础知识的博客文章以及如何在如何构建和加载最小的EBPF程序中的代码样本中。
EBPF-从程序员的角度来看 - 一篇简短的论文描述了EBPF的基础知识以及如何开始编写EBPF程序。
CloudFlare在EBPF上的博客文章 - 有关网络用例和EBPF低级方面的不同博客文章。
Linux扩展BPF(EBPF)跟踪工具 - 围绕使用EBPF的性能分析工具的示例的深入信息集合。在页面末尾还包含有关其他资源的部分。
EBPF的初学者指南 - 一组实时编码对话和随附的代码示例,使用各种库和程序类型介绍EBPF编程。
丹尼尔·伯克曼(Daniel Borkmann)做了几篇演讲和论文,涵盖了EBPF的内部,特别是关于与TC的使用。
IO遮阳板博客
Linux网络解释了 - Linux网络内部设备,有关EBPF的一部分。
Express数据路径 - 对XDP的非常易于访问的介绍,提供了示例代码以显示如何处理数据包。
技术论文中的所有XDP详细信息:Express数据路径:操作系统内核中的快速可编程数据包处理,TokeHøiland-Jørgensen,Jesper Dangaard Brouer,Daniel Borkmann,John Fastabend,Tom Fastabend,Tom Herbert,David Ahern和David Ahern,都是必不可少的EBPF和XDP贡献者。
XDP的进行工作文档
BPF和XDP参考指南 - Cilium Project的指南。
XDP项目概述
Express Data Path(XDP) - 关于XDP的第一个介绍。
BOF- BPF可以为您做什么?
Express数据路径 - 包含使用MLX4驱动程序获得的一些基准结果。
Jesper Dangaard Brouer有几套幻灯片描述XDP的内部:
XDP研讨会 - 简介,经验和未来开发(视频)
Linux上的高速数据包过滤 - 关于Linux上的数据包过滤,DDOS保护,内核中的数据包处理,内核旁路,XDP和EBPF。
如何删除每秒1000万个数据包-Cloudflare的博客文章,谈论他们使用XDP进行数据包过滤的转移。
xt_bpf模块的iptables使用BPF字节码。tc ,以及用于管理XDP程序的ip 。与BPF相关的大多数代码都在lib/bpf.c中。LLVM-包含EBPF工作流中使用的几种工具。可以从此处检索到Ubuntu/Debian的最新版本的快照。
cargo generate 。bpftool-也在内核树中的其他一些工具,在Linux/Tools/net/for for 4.15之前的版本或Linux/Tools/bpf/之后:
bpftool可用于与用户空间中的EBPF程序和地图进行交互的通用实用程序,例如显示,转储,加载,拆卸,固定,PIN程序,或显示,创建,固定,更新,删除地图,或将程序连接和分离为Cgroups。bpf_asm最小CBPF组装程序。bpf_dbg CBPF程序的小型调试器。bpf_jit_disasm两种BPF口味的拆卸器,对于JIT调试可能非常有用。P4与EBPF有一些互动:
Cilium Project(GitHub存储库)是一项依靠BPF和XDP的技术,可以为基于Fly Fly生成的EBPF程序的容器提供“快速内核网络和安全策略执行”。许多演示文稿可用(重叠):
Open Vswitch(OVS)及其相关项目开放虚拟网络(OVN,开源网络虚拟化解决方案)正在考虑在各个级别使用EBPF:
Katran-基于XDP的第4层负载 - 平衡器,由Facebook开源。
实践中XDP:在我们的DDOS缓解管道中集成XDP - 在CloudFlare的XDP对DDOS的保护。
液滴:由BPF + XDP驱动的DDOS对策 - 在Facebook上使用XDP对DDOS进行保护。
DPDK具有基于AF_XDP的投票模式驱动程序(PMD)
CETH用于XDP-更快网络I/O的常见以太网驱动程序框架,这是Mellanox发起的一项技术。
开源侵入检测系统Suricata依靠EBPF组件的“捕获旁路”功能:
Project Calico -Calico是用于容器,虚拟机和基于本机主机工作负载的开源网络和网络安全解决方案。 Calico的EBPF数据平面具有富含网络安全策略模型的低潜伏期,高吞吐量数据平面。
MERBRIDGE-使用EBPF加快服务网格。 Merbridge用EBPF替换Iptables规则以拦截流量。它还结合了msg_redirect,以减少延迟,并在旁边和服务之间缩短数据路径。
PCApplusplus-一个开源C ++库,用于捕获,解析和制作网络数据包。它具有用于创建AF_XDP插座的C ++接口,从而易于通过它们发送和接收数据包。
linux/include/linux/bpf.h-与linux/include/upli/uapi/bpf.h:与EBPF相关的定义,分别在内核中使用并与用户空间程序进行交互。
linux/include/linux/filter.h-与linux/include/uapi/filter.h:用于运行BPF程序本身的信息。
linux/kernel/bpf/ - 此目录包含大多数与BPF相关的代码。特别是这些文件值得:
syscall.c系统调用允许的不同操作,例如程序加载或地图管理。core.c -BPF解释器。verifier.c -BPF验证者。linux/net/core/filter.c-功能和与网络有关的EBPF帮助者(TC,XDP等);还包含将CBPF字节迁移到EBPF的代码(所有CBPF程序均在最近的内核中转换为EBPF)。
linux/bernel/trace/bpf_trace.c-功能和EBPF帮助者与跟踪和监视有关(Kprobes,TracePoints等)。
JIT编译器位于其各自架构的目录下,例如File Linux/Arch/x86/net/bpf_it_comp.c for x86。对于用于硬件卸载的JIT编译器,坐在驱动程序中,例如Linux/drivers/net/net/ethernet/netronome/nfp/nfp/bpf/jit.c,用于NetRonome NFP。
linux/net/sched/ - ,尤其是在文件中act_bpf.c (action)和cls_bpf.c (filter):与BPF操作和使用TC相关的代码。
Linux/kernel/seccomp.c
linux/net/core/dev.c-包含函数dev_change_xdp_fd() ,该函数通过NetLink命令调用以将XDP程序挂接到设备,然后将IS从用户空间加载到内核之后。依次使用此功能使用相关驱动程序的回调。
感谢Quentin Monnet和Daniel Borkmann在Dive In Toive中的最初工作:阅读材料的清单,这成为了此列表的基础。
欢迎捐款!首先阅读贡献指南。
To the extent possible under law, zoidbergwill has waived all copyright and related or neighboring rights to this work.