强制门户检测,弹出实现?

Arc*_*T3K 5 linux wifi authentication hostapd

基于hostapd,我正在构建一个强制门户。

  • 我的 Linux 机器提供 Wifi 访问。
  • iPad 和 Android 客户端平板电脑连接到此 Wifi。

通常,任何客户端操作系统都会检查 URL 是否可访问;如果不是:客户端操作系统声明它是俘虏,并显示一个弹出浏览器窗口。弹出窗口用于登录、演示或其他。

我想显示这样一个弹出窗口来展示我机器的服务,但我不明白。不过我已经避开了净前锋。所有连接都在机器 localhost 网站中重定向。

为什么我没有得到这样的弹出窗口?如何获得?我应该如何/在哪里在我的本地主机上实现它?

类似的想法:

当弹窗发生时,它的内容是如何定义的?例如,一家餐厅强制门户要求在您的笔记上提供您的秘密号码;这个页面存储在哪里?操作系统如何知道要在弹出窗口中显示的 URL?

AWi*_*ler 3

要显示强制门户,您需要停止所有互联网流量并向302 redirect客户端的浏览器提供。为此,您需要有一个防火墙(如iptables)将所有流量重定向到网络服务器(如nginxapache等),其中网络服务器以302 redirect登录页面的 url 进行响应。

我在我的博客上写了一篇很长的文章,介绍如何使用 Raspberry Pi 执行此操作。它基本上可以归结为iptables 块/重定向到网络服务器

iptables -t nat -A wlan0_Unknown -p tcp --dport 80 -j DNAT --to-destination 192.168.24.1
Run Code Online (Sandbox Code Playgroud)

然后网络服务器 ( nginx) 重定向到登录页面:

# For iOS
if ($http_user_agent ~* (CaptiveNetworkSupport) ) {
    return 302 http://hotspot.localnet/hotspot.html;
}

# For others
location / {
    return 302 http://hotspot.localnet/;
}
Run Code Online (Sandbox Code Playgroud)

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>
-->
Run Code Online (Sandbox Code Playgroud)