【问题标题】:Packet filtering with Netfilter's NFQUEUE vs. Berkeley Packet Filter (BPF)使用 Netfilter 的 NFQUEUE 与 Berkeley Packet Filter (BPF) 进行数据包过滤
【发布时间】:2015-01-08 15:05:14
【问题描述】:

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

第一个是使用 iptablesnetfilter,可能与 NFQUEUElibnetfilter_queue 库一起使用。

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

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

非常感谢!

【问题讨论】:

  • 我可能会选择 netfilter/iptables,因为从架构的角度来看,我认为它比 B/PF 更好。举个例子,我喜欢 netfilter 上带有 {PRE|POST}ROUTING 链的翻译顺序,因为它们不会与防火墙链/规则冲突,而 BFP 的相反,这种顺序很奇怪。
  • 谢谢。顺便说一句,如果我想发布一个“开箱即用”的软件(不需要像设置防火墙规则这样的操作系统配置,而只是一种简单的安装),使用 bpf 不是更好吗?但是,我需要更多关于差异的信息,因为这不是主要考虑因素
  • 也许,它更简单,但这并不总是好的。
  • 顺便说一句,BPF 中的开发也很简单还是只是架构?

标签: linux iptables netfilter bpf


【解决方案1】:

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

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

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

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

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

所以,总结一下:

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

相关:

注意事项:

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

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多