使用 Netfilter 的 NFQUEUE 与 Berkeley Packet Filter (BPF) 进行数据包过滤



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

第一种是使用iptablesnetfilter,可能与NFQUEUE和libnetfilter_queue库一起使用。

第二种是使用BPF(Berkeley Packet Filter),快速阅读后似乎具有类似的过滤功能。

那么,这些替代方案中哪一种是创建数据包过滤器的更好方法呢?有什么区别?我的软件将作为网关代理或"中间人"运行,它应该从一台计算机接收数据包(带有到另一台计算机的目标地址,而不是筛选器的本地地址),并在经过一些筛选后将其发送出去。

非常感谢!

虽然我的理解仅限于理论,但我在调试Kubernetes网络实现时做了一些阅读,因此可以尝试回答这个问题。

一般来说,netfiltereBPF(BPF的继任者)都实现了一个虚拟机,在处理数据包时执行一些逻辑。netfilter的实现似乎力求与iptables以前的实现兼容,本质上是iptables的性能更高的后续实现。

然而,使用iptables时仍然存在性能问题,尤其是当存在大量iptables规则时。eBPF的结构方式可以缓解其中的一些性能问题;特别是:

  • eBPF可以卸载到"智能nic"
  • eBPF的结构可以更有效地查找规则

尽管eBPF最初用于网络处理,但它也被用于内核检测(sysdig,iovisor)。它有一组更大的用例,但正因为如此,它的学习曲线可能要艰难得多。

总之:

  • 使用你熟悉的东西,除非你遇到性能问题
  • 查看eBPF

相关:

  • https://cilium.io/blog/2018/11/20/fb-bpf-firewall/
  • https://www.youtube.com/watch?v=4-pawkiagEg
  • https://ferrisellis.com/posts/ebpf_past_present_future/
  • https://lwn.net/Articles/747551/

注:

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

最新更新