使用 LWIP 发送原始 IP 数据包

Using LWIP to send raw IP packets

我正在尝试在 Android 上实施 VPN 服务。我获得了原始 IP 数据包(在第 3 层工作的 TUN 接口)并且不确定我应该如何发送数据包。我知道我可以解析 IP 数据包以提取传输层数据(TCP 或 UDP)然后发送它,但我希望有一种方法可以简单地发送整个 IP 数据包。

最初,我尝试使用原始套接字 (https://man7.org/linux/man-pages/man7/raw.7.html) 并以这种方式发送,但了解到由于权限问题这是不可能的。要打开原始套接字,您需要 root 权限,并且 Android 应用程序不能 运行 作为 root。

我找到了一个名为 LWIP (https://www.nongnu.org/lwip/2_1_x/index.html) 的项目,上面说它是一个 TCP/IP 堆栈实现库,但是在阅读了文档之后,我不知道该怎么做。

LWIP 有他们的原始 API (https://www.nongnu.org/lwip/2_1_x/raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd),看起来很有前途,但我不确定这是否是我需要的。基本上,我只需要一种方法来发送原始 IP 数据包,然后获取响应,并将其写回 TUN 接口——本质上是一个直通代理。

如有任何帮助,我们将不胜感激。谢谢!

您正在尝试重新发明轮子。有几种合适的封装方法,例如 GRE 或 IP-in-IP。

无论如何发送原始IP数据包都需要使用IP协议号,因此您的接收方可以在注册该号码后收到数据包。

对于初学者来说,使用UDP封装可能更容易。