ESP32 DNS 隧道:如何拦截/转发流量(混杂 VS httpd VS l2TAP)

ESP32 DNS 隧道:如何拦截/转发流量(混杂 VS httpd VS l2TAP)

语境

我经常出国工作或度假,而且我发现在很多国家/地区,互联网接入受限或无法使用。虽然通常有免费的 WiFi 网络可用,但它们通常要求用户使用短信验证或 Facebook/Google 凭据登录。不幸的是,我并不总是有兼容的 SIM 卡进行短信验证,而且我不太愿意提供个人凭据来访问这些网络。

我想做的事

我的目标是使用 ESP32 实现 DNS 隧道。通常,当连接到免费 WiFi 网络时,用户需要通过登录页面或提供某些凭据。但是,这些网络通常不会阻止 DNS 查询。我的目标是:

  • 将我的手机/笔记本电脑连接到我的 ESP32

  • 让我的 ESP32 既充当接入点(供我的设备连接),又充当站点(用于连接免费 WiFi)

  • 监听传入的请求(TCP/UDP)并通过(伪造/封装的)DNS请求将其转发到我的服务器。

  • 允许服务器从 DNS 请求中提取数据包,将其转发到正确的 IP,并响应 ESP32

  • 回复原始设备(我的手机/笔记本电脑)。

本质上,流程是:

My phone <--WiFi--> ESP32 <--WiFi--> Free WiFi <--DNS--> My server <----> Internet

问题

我已经成功实现了此设置的大部分方面:建立 AP 和 STA 模式、DNS 请求伪造以及处理来自服务器的响应。但是,我在捕获从手机发送到 ESP32 的所有请求方面面临挑战。我已经尝试了几种可能的方法:

  1. 混杂模式(WiFi 数据包): 使用promiscuous_rx_cb监听 WiFi 数据包。但是,这种方法要求我的服务器将请求转发到真实的 WiFi 网络,这似乎不是最佳选择。

  2. HTTPD 服务器(监听端口):启动 HTTPD 服务器(httpd_start) 和代理请求。但是,这种方法仅限于公共端口(23、80、443 等),因为我无法监听所有端口,并且管理多个套接字可能很复杂。

  3. L2TAP(AP 接口数据层):监听 AP 接口数据层,可能使用 L2TAP。我已尝试使用示例 (softap_sta),我不确定如何继续这条路。我也不知道如何在我的服务器上使用这些数据包。

我的问题

考虑到上述选项,我正在寻求有关实现我的目标的最佳(可能更简单)方法的建议。

此外,我想知道我选择的服务器环境(服务器上的 Python 和 ESP32 上的 ESP-IDF)是否会影响该决定。

如果有人在这方面有经验,我将非常感激您对选择最有效方法的见解,以及您为什么认为它最适合我的用例。感谢您的时间和专业知识

相关内容