Linux社区一直致力于增强GNU/Linux内核。当我们研究网络流量过滤时,我们从ipchains转移到了iptables。最近,我们看到了nftables的引入。接下来是BPFILTER,它是Linux4.18内核开发工作的一部分。什么是BPFILTER?BPFILTER是BPF-basedPacketFilteringFramework的缩写。换句话说,它是一个基于BPF进行包过滤的框架。有趣的是,BPF本身是BerkeleyPacketFilter的缩写。因此很明显,数据包过滤是此功能的重要组成部分。要了解BPFILTER,首先要了解BPF。对该技术的快速介绍是,它允许像tcpdump这样的用户空间工具来过滤内核中的流量。假设您想查看端口80(HTTP)上接收到的流量。我们启动tcpdump工具并为其提供端口号。tcpdumpport80现在,BPF将只返回符合此指定条件的那些数据包。因为它只需要传递有限的数据子集,所以它减少了开销并实现了高性能。BPF是如何工作的BPF不提供直接访问原始网络的用户空间工具,而是使用伪设备。这意味着它就像一个受控的集结区。如果允许,BPF允许像tcpdump这样的工具从这个暂存区检索数据。eBPF:LinuxBPF实现由于BPF源自BSD平台,因此Linux的实现略有不同也就不足为奇了。它使用eBPF,代表扩展BPF。从内核3.18开始,此实现也可用于非网络活动,例如分析。这对于在进程上执行调试很有用。3.19内核(2015)添加了对附加到套接字的支持。Linux4.x系列在网络流量过滤方面增加了有趣的新特性。例如,内核版本4.1(2015)提供了入口和出口过滤器。这使我们能够影响传入和传出的流量。内核4.15(2018)允许Linux安全模块(LSM)的eBPF挂钩。总之,eBPF有很多用途,已经成为Linux开发人员的强大工具包。难怪其他人围绕它构建了用于性能评估和故障排除的优秀工具。一个很好的例子是为Netflix工作的BrendanGregg的作品。Brendan为BCC(BPFCompilerCollection)做出了很多贡献,这是一个可以通过eBPF检索数据的工具箱。它有助于回答许多问题,例如:哪些TCP连接处于活动状态?磁盘请求的延迟是多少?哪些MySQL查询比指定的阈值慢?要检查哪些安全功能?最慢的EXT4调用是什么?进行了哪些NFS调用?还有很多……因此,通过对Linux上的BPF和eBPF的介绍,我们可以看到它在网络流量过滤方面的潜力。让我们继续深入了解BPFILTER。BPFILTER目前的进展该开发目前处于早期阶段。大部分工作由AlexeiStarovoitov、DanielBorkmann和DavidS.Miller完成。他们工作在网络层并维护eBPF。因此,他们密切参与BPFILTER的工作也就不足为奇了。一些最新的代码可以在Alexei的bpfilter分支中找到。现在,BPFILTER是这样工作的:将iptables使用的netfilter规则转换为BPF程序。这几条指令可以附加到内核的各个部分,例如网络堆栈。转换本身就是所谓的动态转换,也称为即时(JIT)编译或运行时编译。这意味着它发生在用户空间并在需要时执行,而不是提前执行。BPFILTER的优点由于JIT编译,大部分转换工作发生在用户空间。这简化了内核所需的工作并简化了代码管理。其他预期的好处包括硬件卸载、更容易从现有的netfilter规则迁移以及更好的性能。注:bpfilter将iptables使用的netfilter规则转换成BPF程序,可以和kube-proxy的iptables模型未来的发展联系起来。个人感觉还是iptable模式,但是底层变成了bpfilter以获得更高的性能,支持大量的规则。
