语境
我经常出国工作或度假,而且我发现在很多国家/地区,互联网接入受限或无法使用。虽然通常有免费的 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 的所有请求方面面临挑战。我已经尝试了几种可能的方法:
混杂模式(WiFi 数据包): 使用
promiscuous_rx_cb
监听 WiFi 数据包。但是,这种方法要求我的服务器将请求转发到真实的 WiFi 网络,这似乎不是最佳选择。HTTPD 服务器(监听端口):启动 HTTPD 服务器(
httpd_start
) 和代理请求。但是,这种方法仅限于公共端口(23、80、443 等),因为我无法监听所有端口,并且管理多个套接字可能很复杂。L2TAP(AP 接口数据层):监听 AP 接口数据层,可能使用 L2TAP。我已尝试使用示例 (
softap_sta
),我不确定如何继续这条路。我也不知道如何在我的服务器上使用这些数据包。
我的问题
考虑到上述选项,我正在寻求有关实现我的目标的最佳(可能更简单)方法的建议。
此外,我想知道我选择的服务器环境(服务器上的 Python 和 ESP32 上的 ESP-IDF)是否会影响该决定。
如果有人在这方面有经验,我将非常感激您对选择最有效方法的见解,以及您为什么认为它最适合我的用例。感谢您的时间和专业知识