如何使用 Linux eBPF 将数据包注入内核网络堆栈?

如何使用 Linux eBPF 将数据包注入内核网络堆栈?

我正在尝试使用 eBPF 程序和 AF_XDP 套接字以及用户空间过滤器程序来过滤到达服务器的以太网数据包。为此,我需要安排将通过过滤器的数据包重新注入内核网络堆栈。我正在为这些数据包调用 xsk_ring_prod__reserve 和 xsk_ring_prod__submit,但它们没有到达我想要它们去的地方;我怀疑它们被传递到以太网卡进行传输,但我无法直接确认这一点。我希望会有一个例子作为 Facebook Katran 负载平衡器的一部分https://github.com/facebookincubator/katran... 负载平衡有时确实需要接受数据包进入到达节点... 但我看不到我需要什么。我的测试用例在这里https://github.com/tjcw/xdp-tutorial/tree/master/udp-sender;目前我正在尝试丢弃 UDP 数据包并传递其他协议,例如 TCP 和 ICMP;但我发现测试用例在运行时会丢弃所有到达的数据包。

谁能告诉我如何进行数据包注入?

答案1

Magnus Karlsson 撰写了大部分相关的内核代码:

当您使用 AF_XDP 发送数据包时,它们会从网络接口发出,而不是进入内核。如果有用于出口的 XDP(现在只有用于入口的 XDP),您可以使用它将数据包转发到内核。现在您不得不使用诸如 tun/tap 或 veth 设备之类的设备将数据包发送到内核。不幸的是,这些设备的速度不是那么快。可能只有 1 Mpps。

如果您需要高于 1 Mpps 的速度,并且您的过滤器/程序很简单,那么我建议在 XDP 中实现它,因为它在数据包传输到内核或用户空间之前在内核中运行。这比先将其弹到用户空间要快。

希望这有帮助。

相关内容