我试图使用一个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;但是我发现测试用例在它运行时会丢弃所有到达的数据包。
有人能告诉我如何进行包注入吗?
发布于 2022-09-23 12:03:19
来自Magnus Karlsson,他编写了大部分相关内核代码:
当您用AF_XDP发送数据包时,它们会离开网络接口,而不是发送到内核。如果有XDP作为出口(现在只有XDP用于入口),您可以使用它将数据包转发到内核。现在,您不得不使用诸如tun/tap或veth设备之类的方法将数据包发送到内核中。不幸的是,这些设备并没有那么快。可能是一个Mpps。
如果您需要比1 Mpps更高的速度,并且您的过滤器/程序很简单,那么我建议在XDP中实现它,因为它在将数据包传输到内核或用户空间之前在内核中运行。它将比跳到用户空间的速度更快。
希望这能帮上忙。
https://serverfault.com/questions/1111314
复制相似问题