4

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

第一个是使用iptablesnetfilter,可能NFQUEUE还有libnetfilter_queue库。

第二个是使用BPF(伯克利包过滤器),快速阅读它似乎具有类似的过滤功能。

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

非常感谢!

4

1 回答 1

2

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

从广义上讲,netfiltereBPF(BPF 的继承者)都实现了一个虚拟机,在处理数据包时执行一些逻辑。netfilter的实现似乎力求与iptables以前的实现兼容,本质上是iptables.

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

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

虽然它最初用于网络处理,但 eBPF 也被用于内核检测(sysdig、iovisor)。它有一个更大的用例集,但正因为如此,它可能是一个更艰难的学习曲线。

所以,总结一下:

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

相关的:

笔记:

  • eBPF 是 cBPF 的继承者,并在内核中取代了它
  • 我出于习惯在这里明确提到 eBPF
于 2019-03-18T07:43:57.163 回答