在使用XDP捕获数据包并在用户空间中处理数据包后,是否可以重新传输数据包?

时间:2018-04-29 17:47:03

标签: linux linux-kernel packet-capture packet-injection

我需要编写一个位于两个服务器之间的应用程序,并通过向每个数据包添加特定的HTTP标头来修改从一个服务器发送到另一个服务器的HTTP数据包。 显然它必须尽可能快地完成,我发现通过使用eBFP和XDP,我可以捕获具有高性能的数据包,但据我所知,XDP判决是中止,丢弃,传递和TX
使用 tx 判断我可以将捕获的数据包发送到用户空间程序进行修改,但是我无法弄清楚如何在修改标头后发送数据包?这段视频here解释了使用eBPF和XDP可以做些什么,并说它可以完成,但我无法找到方法。
任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

据我所知,for val in s["chris"]: print(len(val)) 让数据包通过用户空间。它将在来自其的同一NIC上返回数据包。另外,您可以修改数据包,但是我看不到扩展数据包的简便方法。因此,要编写其他标题,您将不得不覆盖一些数据。

您似乎有两个选择:

  • 依靠L7 HTTP反向代理(添加标头)
  • 如果要阻止数据包到达主机并将其发回,请使用nfqueue。

答案 1 :(得分:0)

如果您仍然对该主题感兴趣,那么答案是否定的。但是,可以使用XDP套接字从内核空间或用户空间转发/发送新数据包。在github上签出XDP教程,或查看Linux内核samples/bpf中的代码。