![如何使用 Linux eBPF 将数据包注入内核网络堆栈?](https://linux22.com/image/780531/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Linux%20eBPF%20%E5%B0%86%E6%95%B0%E6%8D%AE%E5%8C%85%E6%B3%A8%E5%85%A5%E5%86%85%E6%A0%B8%E7%BD%91%E7%BB%9C%E5%A0%86%E6%A0%88%EF%BC%9F.png)
我正在尝试使用 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 中实现它,因为它在数据包传输到内核或用户空间之前在内核中运行。这比先将其弹到用户空间要快。
希望这有帮助。