キャプティブポータル検出、ポップアップウィンドウの実装?

キャプティブポータル検出、ポップアップウィンドウの実装?

私はHostapdに基づいてキャプティブポータルを構築しています。

  • 私のLinuxコンピュータはWi-Fiアクセスを提供しています。
  • iPadとAndroidクライアントのタブレットがこのWi-Fiに接続されています。

通常、すべてのクライアントオペレーティングシステムはURLにアクセスできるかどうかを確認します。そうでない場合、クライアントオペレーティングシステムはそのURLが制御されると宣言し、ポップアップブラウザウィンドウを表示します。ログイン、プレゼンテーションなどのためのポップアップウィンドウです。

私のコンピュータのサービスを表示するために、このようなポップアップを表示したいのですが理解できません。しかし、私はネットを避けた。すべての接続は、コンピュータのlocalhost Webサイトにリダイレクトされます。

なぜこのようなポップアップが見えないのですか?得る方法か。私のローカルホストでこれをどのように/どこに実装するのですか?

同様のアイデア:

ポップアップが発生した場合、その内容はどのように定義されますか?たとえば、レストラン依存ポータルでは、そのページがどこに保存されているかをメモにパスワードを提供する必要があります。オペレーティングシステムはポップアップに表示するURLをどのように知っていますか?

答え1

依存ポータルを表示するには、すべてのインターネットトラフィックを停止して302 redirectクライアントブラウザに提供する必要があります。これを行うには、iptablesすべてのトラフィックをWebサーバー(など)にリダイレクトするファイアウォール(ファイアウォールなど)が必要です。nginxWebサーバーはapacheログインページのURLで応答します。302 redirect

私は書いた私のブログに長い記事がありますRaspberry Piを使用してこれを行う方法は次のとおりです。デフォルトでは、次のように要約されます。iptablesブロック/Webサーバーにリダイレクト:

iptables -t nat -A wlan0_Unknown -p tcp --dport 80 -j DNAT --to-destination 192.168.24.1

その後、Webサーバー(nginx)はログインページにリダイレクトされます。

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

# For others
location / {
    return 302 http://hotspot.localnet/;
}

iOSはより難しく、hotspot.html次のようにWISP設定が必要です。

<!--
<?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をインストールするとき、依存ポータル検出テストには、ポート80の代わりにポート443を使用してください。認証のためにポート80万をブロックすると、最新のAndroidクライアントが機能しない理由が疑問に思って頭を傷つけます。

(わかりました。この内容が最初のページに掲載されたことを確認しました。答えは2016年からです... Androidはおそらくすぐにこの作業を始めたでしょう。)

ポート80をブロックすることに加えて、ポート443をブロックし、SSL証明書エラーを許可するSSLホストを設定する必要があります。または、インターネット全体で有効な実際のDNSドメインと有効な証明書を使用してください。

強制認証の実装方法を確認する訪問者については、私のQ&Aをご覧ください。Apacheを使用した依存ポータルそして関連する問題FON認証ポータルからWISPrタグを取得します;テストにも便利MacOSでCNAを無効にする

関連情報