基于hostapd,我正在构建一个强制门户。
- 我的 Linux 机器提供 Wifi 访问。
- iPad 和 Android 客户端平板电脑连接到此 Wifi。
通常,任何客户端操作系统都会检查 URL 是否可访问;如果不是:客户端操作系统声明它是受控的,并显示一个弹出浏览器窗口。弹出窗口用于登录、演示或其他。
我想显示这样一个弹出窗口来展示我的机器的服务,但我不明白。不过我已经避开了网前。所有连接都在计算机本地主机网站中重定向。
为什么我没有看到这样的弹出窗口?如何获得?我应该如何/在哪里在我的本地主机上实现它?
类似的想法:
当弹出窗口发生时,它的内容是如何定义的?例如,餐厅强制门户要求您在便条上提供秘密号码;该页面存储在哪里?操作系统如何知道要在弹出窗口中显示的 URL?
答案1
要显示强制门户,您需要停止所有互联网流量并向302 redirect
客户端的浏览器提供。为此,您需要有一个防火墙(如iptables
)将所有流量重定向到 Web 服务器(如nginx
、等),其中 Web 服务器以登录页面的 URLapache
进行响应。302 redirect
我写了一个我的博客上有一篇很长的文章关于如何使用 Raspberry Pi 执行此操作。它基本上可以归结为iptables 阻止/重定向到网络服务器:
iptables -t nat -A wlan0_Unknown -p tcp --dport 80 -j DNAT --to-destination 192.168.24.1
然后网络服务器 ( nginx
) 重定向到登录页面:
# For iOS
if ($http_user_agent ~* (CaptiveNetworkSupport) ) {
return 302 http://hotspot.localnet/hotspot.html;
}
# For others
location / {
return 302 http://hotspot.localnet/;
}
iOS比较难,需要进行WISP的设置,hotspot.html
内容如下:
<!--
<?xml version="1.0" encoding="UTF-8"?>
<WISPAccessGatewayParam xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.wballiance.net/wispr_2_0.xsd">
<Redirect>
<MessageType>100</MessageType>
<ResponseCode>0</ResponseCode>
<VersionHigh>2.0</VersionHigh>
<VersionLow>1.0</VersionLow>
<AccessProcedure>1.0</AccessProcedure>
<AccessLocation>Andrew Wippler is awesome</AccessLocation>
<LocationName>MyOpenAP</LocationName>
<LoginURL>http://hotspot.localnet/</LoginURL>
</Redirect>
</WISPAccessGatewayParam>
-->
答案2
用于补充@AWippler 消息。我在 FreeBSD 中实现了一个强制门户,并使用 Windows、Mac、iOS 和 Android 设备作为客户端进行了一些测试。
请注意,根据我的测试,较新的 Android 版本安装 Chrome 时,使用端口 443 而不是端口 80 进行强制门户检测测试。如果您仅拦截端口 80 进行身份验证,您将开始摸不着头脑思考为什么较新的 Android 客户端无法工作。
(好吧,刚刚注意到这个被放到了首页,答案是从 2016 年开始的……Android 可能不久之后就开始这样做了)
除了拦截端口 80 之外,您还需要设置 SSL 主机,拦截端口 443 并接受 SSL 证书错误。或者使用在整个 Internet 上有效的实际 DNS 域以及有效证书。
对于还尝试拼凑如何实施强制身份验证的访问者,另请参阅我的问答使用 Apache 的强制门户以及相关问题从 FON 身份验证门户获取 WISPr 标签;对于测试也很有用在 MacOS 中禁用 CNA