我刚刚阅读了关于在linux中开发数据包过滤器的两个选项的答案。
第一种是使用iptables和netfilter,可能与NFQUEUE
和libnetfilter_queue库一起使用。
第二种是使用BPF(Berkeley Packet Filter),快速阅读后似乎具有类似的过滤功能。
那么,这些替代方案中哪一种是创建数据包过滤器的更好方法呢?有什么区别?我的软件将作为网关代理或"中间人"运行,它应该从一台计算机接收数据包(带有到另一台计算机的目标地址,而不是筛选器的本地地址),并在经过一些筛选后将其发送出去。
非常感谢!
虽然我的理解仅限于理论,但我在调试Kubernetes网络实现时做了一些阅读,因此可以尝试回答这个问题。
一般来说,netfilter
和eBPF
(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