Linux社区一直在不断努力以增强GNU / Linux内核。当我们查看网络流量过滤时,我们从ipchains移到了iptables。最近,我们看到了nftable的引入。接下来的是BPFILTER,它是Linux 4.18内核开发工作的一部分。

BPFILTER是什么?

BPFILTER是基于BPF的数据包过滤框架的缩写。换句话说,它是一个基于BPF进行数据包筛选的框架。有趣的是,BPF本身是Berkeley Packet Filter的首字母缩写。因此很明显,包过滤是此功能的重要组成部分。

要了解BPFILTER,我们需要首先了解BPF。该技术的快速介绍是它允许tcpdump之类的用户空间工具过滤内核中的流量。假设您想查看在端口80(HTTP)上收到了什么流量。我们启动tcpdump工具并为其提供端口号。

tcpdump port 80

现在,BPF仅将返回与此指定标准匹配的那些数据包。因为它只需要传递有限的数据子集,所以可以减少开销并获得高性能。

BPF工作原理

BPF并没有为用户空间工具提供直接访问原始网络的权限,而是使用了伪设备。这意味着它就像一个受控的暂存区。如果允许,BPF允许tcpdump之类的工具检索来自此暂存区域的数据。

eBPF: Linux BPF 实现

由于BPF源自BSD平台,因此Linux具有稍微不同的实现可能并不奇怪。它使用eBPF,代表扩展的BPF。从内核3.18开始,此实现也可以用于非网络活动,例如分析。这对于在进程上执行调试非常有用。 3.19内核(2015年)增加了对附加到套接字的支持。

Linux 4.x系列在网络流量过滤方面添加了有趣的新功能。例如,内核版本4.1(2015)提供了入口和出口过滤器。这使我们能够影响传入和传出的流量。内核4.15(2018)允许Linux安全模块(LSM)的eBPF挂钩。

简而言之,eBPF具有多种用途,已成为Linux开发人员使用的功能强大的工具包。难怪其他人围绕它构建了出色的工具,以进行性能评估和故障排除。一个很好的例子是为Netflix工作的Brendan Gregg的作品。 Brendan为BCC(BPF编译器集合)做出了很大贡献,BCC是可以通过eBPF检索数据的工具箱。它有助于回答许多问题,例如:

  • 哪些TCP连接处于活动状态?
  • 磁盘请求的延迟是多少?
  • 哪些MySQL查询的速度低于指定的阈值?
  • 检查哪些安全功能?
  • 什么是最慢的EXT4通话?
  • 进行了哪些NFS调用?
  • 还有很多…

因此,通过对Linux上的BPF和eBPF的介绍,我们可以看到它对网络流量过滤的潜力。让我们继续前进,深入了解BPFILTER。

BPFILTER当前的进展

该开发目前处于早期阶段。大部分工作由Alexei Starovoitov,Daniel Borkmann和David S. Miller完成。他们在网络层上工作并维护eBPF。因此,毫不奇怪,他们密切参与了BPFILTER的工作。可以在Alexei的bpfilter分支中找到一些最新代码。

ebpf.jpg

现在,BPFILTER的工作方式如下:将iptables使用的netfilter规则转换为BPF程序。这些很少的指令可以附加到内核的各个部分,例如网络堆栈。转换本身就是所谓的动态转换,也称为即时(JIT)编译或运行时编译。这意味着它发生在用户空间中,并在需要时执行,而不是提前执行。

BPFILTER的优势

由于JIT编译,大多数转换工作发生在用户空间中。这简化了内核所需的工作,并简化了代码管理。预期的其他好处包括硬件卸载,从现有netfilter规则的更轻松迁移以及更好的性能。

随想

注意:bpfilter将iptables使用的netfilter规则转换为BPF程序,可以联想到kube-proxy的iptables模式未来的发展。个人感觉,依旧是iptable模式,只不过底层变成了bpfilter,来获取更高的性能,支持大量的规则。


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。