使用Netfilter的NFQUEUE与伯克利数据包过滤器(BPF)进行数据包过滤

时间:2014-11-11 22:07:39

标签: linux iptables netfilter bpf

我刚刚阅读了in these answers关于在linux中开发数据包过滤器的两个选项。

第一种是使用 iptables netfilter ,可能使用NFQUEUElibnetfilter_queue库。

第二种方法是使用 BPF (伯克利数据包过滤器),它似乎在快速阅读中具有类似的过滤功能。

那么,哪些替代方案是创建数据包过滤器的更好方法?有什么区别?我的软件将作为网关代理运行,或者“中间人”应该从一台计算机接收数据包(目的地地址到另一台计算机,而不是过滤器的本地地址),并在一些计算机之后发送过滤

非常感谢!

1 个答案:

答案 0 :(得分:0)

尽管我的理解仅限于理论上,但我在调试Kubernetes网络实现时已经读了一些书,因此可以一口气回答这个问题。

广泛地,netfiltereBPF(BPF的后继者)都实现了一个虚拟机,该虚拟机在处理数据包时执行一些逻辑。 netfilter的实现似乎是在争取与iptables以前的实现兼容,实质上是iptables的更高性能的继任者。

但是,使用iptables时仍然存在性能问题-尤其是当存在大量iptables规则时。 eBPF的结构方式可以减轻其中一些性能问题;具体来说:

  • eBPF可以卸载到“智能网卡”
  • eBPF可以被构造为更有效地查找规则

尽管eBPF最初用于网络处理,但也用于内核检测(sysdig,iovisor)。它具有更多的用例集,但是正因如此,它可能会变得难度更大。

因此,总而言之:

  • 使用您熟悉的工具,除非您遇到性能问题
  • 看看eBPF

相关:

注意:

  • eBPF是cBPF的后继者,并已在内核中取代了它
  • 出于习惯,我在这里明确提到eBPF