本文主要参考eBPF的简史
BPF是什么
BPF是一个用于过滤(filter)网络报文(packet)的架构,BPF是tcpdump 抑或 wireshark 乃至网络监控(Network Monitoring)领域的基石。
BPF 的两大核心功能
-
过滤(Filter): 根据外界输入的规则过滤报文
-
复制(Copy):将符合条件的报文由内核空间复制到用户空间
-
Tcpdump 工作流程
可见tcpdump使用的libpcap是基于BPF的,在使用tcpdump或者libpcap时传入的“host 192.168.1.1”、“tcp and port 80”等是过滤表达式。
位于内核之中的 BPF 一方面接受 tcpdump 经由 libpcap 转码而来的滤包条件(Pseudo Machine Language) ,另一方面也将符合条件的报文复制到用户空间最终经由 libpcap 发送给 tcpdump。过滤表达式会被编译成BPF指令,在tcpdump命令后面加上-d参数可以看到,这些BPF指令是在内核中被BPF解释执行的。
BPF的缺点
BPF 采用的报文过滤设计的全称是 CFG(Computation Flow Graph),顾名思义是将过滤器构筑于一套基于 if-else 的控制流(flow graph)之上,基于伪代码的设计却也增加了系统的复杂性:一方面伪指令集已经足够让人眼花缭乱的了;另一方面为了执行伪代码,内核中还需要专门实现一个虚拟机(pseudo-machine),这也在一定程度上提高了开发和维护的门槛。
BPF的优点
BPF的设计者在tcpdump中设计了现在常见的过滤表达式,提升了易用性。另一方面,由于设计目标只是过滤字节流形式的报文,虚拟机及其伪指令集的设计相对会简单不少:整个虚拟机只实现了两个 32 位的寄存器,分别是用于运算的累加器 A 和通用寄存器 X;且指令集也只有 20 来个
eBPF是什么
- eBPF全称:extended Berkeley Packet Filter,是BPF 的进化。
- eBPF是kernel 3.15中引入的全新设计,将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机”
- BPF 提供了强大的网络包过滤规则,可以确定应该检查哪些流量、忽略哪些流量等,而内核近几年发展的 Extended BPF, eBPF 实际上将应用范围,处理效率进行了更新。
eBPF的革新
- 原先的BPF依然支持,用cBPF指代。eBPF全新设计了更丰富的指令集、增加了寄存器,性能大幅提高
- 用 C 写成的 BPF 代码;
- 基于 map 的内核与用户空间的交互方式;
- 全新的开发接口;
除此之外,还有一些不那么明显的改进隐藏在内核之中: - 全新的伪指令集设计;
- In-kernel verifier;
eBPF的功能
- 通过一个内核内置的字节码虚拟机,完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能。
eBPF的优点
- 告别了纯汇编开发的方式,利用C一类高级语言书写
- eBPF适合编写网络程序,将该网络程序附加到网络socket,进行流量过滤,流量分类以及执行网络分类器的动作。eBPF程序甚至可以修改一个已建链的网络socket的配置。XDP工程会在网络栈的底层运行eBPF程序,高性能地进行处理接收到的报文。
- 在加载eBPF程序前会进行大量的校验,以避免一些安全性和稳定性的风险。例如,程序不允许包含控制循环;程序不会尝试执行超过内核允许的最大指令数的指令;程序不包含任何无法访问的指令,如从未执行过的条件或功能,以防止在VM中加载无效代码;程序也不会尝试越界
基于eBPF的项目
-
bcc
BCC是用于创建基于eBPF的高效内核跟踪和操作程序的工具包,其中包括一些有用的命令行工具和示例。 BCC简化了用C进行内核检测的eBPF程序的编写,包括LLVM的包装器以及Python和Lua的前端。它还提供了用于直接集成到应用程序中的高级库。 -
bpftrace
bpftrace是Linux eBPF的高级跟踪语言。它的语言受awk和C以及DTrace和SystemTap等以前的跟踪程序的启发。 bpftrace使用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有Linux跟踪功能和连接点进行交互的库。
- Cilium
Cilium是一个开源项目,提供基于eBPF的联网,安全性和可观察性。它是从头开始专门设计的,旨在将eBPF的优势带入Kubernetes的世界,并满足容器工作负载的新可伸缩性,安全性和可见性要求。
- Falco
Falco是一种行为活动监视器,旨在检测应用程序中的异常活动。 Falco在eBPF的帮助下审核Linux内核层的系统。它使用其他输入流(例如容器运行时度量标准和Kubernetes度量标准)丰富了收集的数据,并允许连续监视和检测容器,应用程序,主机和网络活动。
- Katran
Katran是一个C ++库和eBPF程序,用于构建高性能的第4层负载平衡转发平面。 Katran利用Linux内核中的XDP基础结构来提供用于快速数据包处理的内核功能。它的性能与NIC接收队列的数量成线性比例,并且使用RSS友好的封装转发到L7负载平衡器。
还有很多内容在参考文献中不一一摘抄了,具体操作还未实践,已查找到相关资料ebpf 学习梳理和测试使用