使用 eBPF/XDP 写入和读取 netfilter 连接架

问题描述 投票:0回答:2

我正在纯 XDP 中开发 NAT 服务器。但为了拥有强大的 nat 功能,我想跟踪连接(存储和获取跟踪数据),并且我正在考虑使用已经存在的 netfilter conntrack 数据结构和函数来帮助 XDP 中的数据包处理,我对 nf_conntrack 有一些了解,但是我觉得我错过了一些东西,我不确定我是否可以接收数据包并使用 netfilter conntrack 检查它是否是新连接。
例如,如果它是一个新连接:

  • 我可以调用一个 netfiler conntrack 函数,它可以决定我可以将哪个端口分配为公共源端口以及元组的其他信息。

  • 当回复回来时,我可以在 nf conntrack 中检查这是一个回复,然后更新数据包信息并传递到内部网络。

我从这个仓库中得到了一些灵感:https://github.com/ti-mo/conntracct。但我看到他们只做统计,所以这里的数据包通过正常的内核堆栈。

我感到有点困惑,但如果我设法解释我在想什么,并且您有提示或技巧来指导我,我将不胜感激。

谢谢。

netfilter bpf ebpf xdp-bpf
2个回答
4
投票

XDP 程序执行是接收到的数据包首先发生的事情之一,因此此时 conntrack 尚未发生。也没有 BPF 助手可以开箱即用地实现 conntrack 行为。

如果您想跟踪 XDP 挂钩处的连接,则必须在 BPF 中实现您自己的 conntrack 逻辑。例如,这就是 Cilium 所做的事情


0
投票

您现在可以使用 kfuncs 来完成此操作。请注意,与 bpf 帮助程序不同,它们不稳定,并且可能会在未来的内核中崩溃。

https://github.com/torvalds/linux/commit/2a1aff6035187d877d7b6f28f81b0a084c00e17a

© www.soinside.com 2019 - 2024. All rights reserved.