![无需互联网连接即可触发强制门户助手](https://linux22.com/image/1506744/%E6%97%A0%E9%9C%80%E4%BA%92%E8%81%94%E7%BD%91%E8%BF%9E%E6%8E%A5%E5%8D%B3%E5%8F%AF%E8%A7%A6%E5%8F%91%E5%BC%BA%E5%88%B6%E9%97%A8%E6%88%B7%E5%8A%A9%E6%89%8B.png)
我正在寻找一种解决方案,以便在连接到没有互联网连接的 LAN 时触发 Android 4.0-7 和 iOS 7-10 上的强制门户助手。
我们的应用程序在 LAN 上的网络服务器上运行。我们希望我们的用户(通常是首次使用的用户)能够以尽可能少的步骤访问应用程序。该系统目前的工作方式是连接到 WiFi 网络、打开浏览器并输入 URL。我们希望将其简化为一个步骤(连接到 WiFi 网络),由 Android 和 iOS 内置的强制门户助手自动打开浏览器。
我并不是在寻找标准的强制门户设置。
该系统必须触发 Android 和 iOS 中的强制门户助手,而无需向 Google 或 Apple 运行的正版服务器发送请求。没有互联网连接,现在不行,以后也不行。
该系统基于 Debian,使用 HOSTAPD 和 DNSMASQ 运行 DHCP 和 DNS 解析。Web 服务器是 NGINX 和 PHP7.0。
如果可以使用 Debian 的其他可用软件包(例如 BIND 或任何可以替代我们现在使用的软件包)来实现解决方案。我对更改配置没有任何问题。
我之前从未注册过超级用户,只是潜伏在暗处,悄悄地从出色的成员那里学到了很多东西。正因为如此,我没有提供赏金的名声。如果有其他方式来回报提出可行解决方案的人,请告诉我。
答案1
强制门户检测通常通过尝试通过 HTTP 访问页面并检查返回的页面是否符合预期来工作。
例如,Android 将连接到http://clients1.google.com/generate_204
,它仅返回 HTTP 状态204
。据推测,iOS 客户端的工作方式类似。
为了以您描述的方式打开您的应用程序,您只需重定向所有尚未发送到您的应用服务器的 HTTP 请求。这样,客户端就永远不会收到预期的结果。
如果客户端将 Debian 系统设置为网关,则可以使用 NAT 来实现iptables
。可以使用类似以下规则来实现,其中APPSERVER
是您的应用服务器的 IP 地址:
iptables -t nat -D PREROUTING ! -d APPSERVER -p tcp –-dport 80 -j DNAT –to-destination APPSERVER
但是我不确定使用强制门户助手是否合适,因为它们通常非常有限,如果用户不小心关闭了强制门户助手,他们可能很难返回应用程序。一些较旧的设备也可能无法自动检测强制门户的存在。由于用户永远无法通过您的网络访问互联网,强制门户助手可能会继续定期显示您的应用程序或将网络标记为无法访问互联网并阻止将来的连接。
答案2
我能找到的最好的东西是在 serverfault 上找到答案(事实上,对于这个问题来说,这是一个更好的网站):这里
基本上,您运行一个预先构建的应用程序/容器,它会为您完成所有工作。