一、简介
提到这个eBPF,就不得不提到BPF(Berkeley Packet Filter),它是一个用于过滤filter网络报文packet的架构。它是tcpdump 或 wireshark 甚至网络监控基础构件。它始于1992 发行在 USENIX conference 上的一篇论文:The BSD Packet Filter: A New Architecture for User-level Packet Capture。最初 BPF 是实现于 BSD 系统之上的,所以论文中称做“BSD Packet Filter”,但是随着后来由于 BPF 的理念逐渐成熟,B不代表 BSD而是Berkeley即Berkeley Packet Filter。
它主要有两个功能 即:
过滤(Filter):即以输入的规则过滤报文;
复制(Copy):将规则内的报文从内核空间复制到用户空间;
二、分析
BPF 的报文过滤设计是建立在 if-else 的控制流flow graph之上的过滤器【CFG(Computation Flow Graph)】,快就是它最明显的特征,在论文中对CFG 和 CSPF 两种模型进行了初步的分析比较,认为 CFG 模型则运算量更小。同时,引入的伪指令集,也增加了相关设计的复杂性。一定程度上提高了开发和维护的门槛。
为了提高易用性,BPF提供了tcpdump 过滤表达式(依赖 libpcap,都源于 Lawrence Berkeley Lab)并且其设计目标只有过滤字节流形式的报文,其相关的虚拟机及其伪指令集更简约:虚拟机只有两个 32 位寄存器,即运算累加器 A 和通用寄存器 X;指令集20个左右。易用性推动了 BPF 的发展,随后Linux将其 引入了内核。
三、内核的应用
1997 年,在Linux2.1.75中BPF引入了内核。但是内核中的BPF和传统的仍然是有一些不同:
1、接口:传统的 BSD 开启 BPF 的方式主要是靠打开open /dev/bpfX 设备,之后利用 ioctl 来进行控制
2、 linux 则选择了利用套接字选项sockopt SO_ATTACH_FILTER/SO_DETACH_FILTER 来执行系统调用。
在内核中 3.18 前, BPF 的实现基本在 net/core/filter.c 下,主要函数有两个,sk_attach_filter() 和 sk_run_filter():前者将 filter 伪代码在用户空间和内核空间的复制;后者进行报文伪码解析
BPF 直到 3.0 进行了较大的版本更新支持了用于提速的 JIT (Just-In-Time) Compiler。
从Linux 3.15~3.17 在 kernel/bpf 目录下实现了 extended BPF(eBPF),extended 就是扩展,加强的意思;传统的 BPF 被重命名为 classical BPF(cBPF)。它主要有两个改进:
1、它极大改善了内核追踪Kernel Tracing、性能调优/监控、流控Traffic Control等
2、eBPF 在接口设计上也有了更大的进步。
换句话说,到了 eBPF 的出现,利用C等高级语言编写 BPF成为了现实。
四、主要项目
编写相关代码,一般都是通过二次封装的相关项目进行,主要包括
1、bcc
BCC是用于编写eBPF的内核追踪和操作的工具包。
2、bpftrace
bpftrace是Linux eBPF的高级追踪语言。
3、Cilium
Cilium是一个开源项目,提供基于eBPF的联网,安全性和可观察性。
4、Falco
Falco是一种行为活动监视器,即检测应用程序中的异常活动。
5、Katran
Katran是一个C ++库和eBPF程序,用于创建负载平衡转发。
6、Sysdig
Sysdig是一个简单工具,可以监测内核,并支持对容器的原生支持。
其他kubectl-trace ,ply 等,不一一列举。
五、应用
编写实际应用的话,需要了解下面的具体的内容:
1、map(映射) :发现好多都是使用这个东西进行交互啊(安卓的FrameWork)BPF也是,内核上运行的代码和加载了该代码的程序通过其来进行通信。
BPF映射类型有很多,哈希表,数组等。
2、验证器
直接进内核东西,如果不检查的严格一些,结果是什么,不想都知道。它就是用来对所有的相关内容进行检查的,防止导致内核的崩溃。
3、钩子(hook)
事件驱动中一般都要有大量的钩子,旭XDP,trace,Socket等。
4、帮助函数
eBPF程序能调用帮助函数,它最稳定。
了解这些内容后,再辅以上面的封装框架或者说库,按要求操作,就可以写出标准的应用程序了。
六、总结
其实听到eBPF内有钩子就想到了网络和安全,就想到了跟踪和故障处理分析,这些都是可以用钩子来过滤的。而对于一些云应用领域,同样可以通过其进行一些命令工具的优化问题,如解决iptables带来的性能问题,它和WASM一样,都是最近比较火的一种基础技术,不要小看技术的进步,它会带来整个应用体系的革命性的变化。
风起于青萍之末。
努力吧,归来的少年!