使用 LWIP 发送原始 IP 数据包

Posted

技术标签:

【中文标题】使用 LWIP 发送原始 IP 数据包【英文标题】:Using LWIP to send raw IP packets 【发布时间】:2021-06-05 11:22:58 【问题描述】:

我正在尝试在 android 上实现 *** 服务。我提供了原始 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 接口——本质上是一个直通代理。

任何帮助将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

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

在任何情况下,发送原始 IP 数据包都需要使用 IP 协议编号,因此您的接收方可以在注册该编号后获取数据包。

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

【讨论】:

感谢您的建议。我不确定封装是否对我有用,因为我与 Android 允许我做的事情有关。这是他们关于 *** 服务的文档 (developer.android.com/guide/topics/connectivity/***#service)。基本上我得到的只是一个文件描述符(附加到 TUN 接口),当我从它读取时,我得到原始 IP 数据包,我应该按原样发送它,处理响应,然后将响应写回文件描述符作为原始 IP 数据包。 ***无论如何都需要封装。您是在尝试创建 *** 解决方案(客户端/服务器)还是只是设置客户端?在后一种情况下,只需建立隧道并将 TUN 用作本地接口。 lwip 不仅仅是一个 API,而是一个完整的 TCP/IP 堆栈,适用于嵌入式设备。

以上是关于使用 LWIP 发送原始 IP 数据包的主要内容,如果未能解决你的问题,请参考以下文章

三LWIP学习笔记之ARP协议

一LWIP学习笔记之数据包管理

FreeRTOS + LWIP -UDP数据传输

Python原始套接字编程

如何在内核模式驱动程序中使用 Winsock Kernel (WSK) 发送原始套接字数据包?

c_cpp 使用原始套接字发送和接收带有ICMP协议的OUTPUT的数据包的小程序是六进制格式的数据包。可以打印为%c来查看数据。 IP heade