web-dev-qa-db-ja.com

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

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

  • 私のLinuxマシンはWifiアクセスを提供します。
  • iPadとAndroidクライアントタブレットがこのWifiに接続します。

通常、クライアントOSはURLに到達できるかどうかを確認します。そうでない場合:クライアントOSはキャプティブであることを示し、ポップアップブラウザウィンドウを表示します。ポップアップは、ログイン、プレゼンテーションなどに使用されます。

このようなポップアップを表示して自分のマシンのサービスを表示したいのですが、わかりません。でも、ネットフォワードは避けた。すべての接続は、マシンのlocalhost Webサイトにリダイレクトされます。

このようなポップアップが表示されないのはなぜですか?どうやってそれを手に入れますか?ローカルホストのどこにどのように実装すればよいですか?

同様のアイデア:

ポップアップが発生した場合、そのコンテンツはどのように定義されますか?たとえば、レストランのキャプティブポータルは、メモに秘密の番号を要求します。このページはどこに保存されていますか? OSは、ポップアップに表示するURLをどのようにして知るのですか?

4
ArchiT3K

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

Raspberry Piでこれを行う方法について ブログの長い記事 を書きました。基本的には、iptablesブロック/ webserverにリダイレクトされます。

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は、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>
-->
3
AWippler

@AWipplerメッセージを補完するため。私はFreeBSDにキャプティブポータルを実装し、Windows、Mac、iOSおよびAndroidデバイスをクライアントとして使用していくつかのテストを実行しました。

私のテストによれば、新しいAndroidバージョンChromeインストール済みの場合、キャプティブポータルを実行する)ポート80の代わりにポート443を使用した検出テスト。認証のためにポート80のみをインターセプトする場合、新しいAndroidクライアントが機能していない理由を考えて頭を悩まし始めます。

(わかりました、これがフロントページにぶつかったことに気づきました。答えは2016年からです... Androidはすぐにそれを始めたかもしれません)

ポート80をインターセプトする以外に、SSLホストをセットアップし、ポート443をインターセプトして、SSL証明書エラーが発生する可能性もあります。または、有効な証明書を使用して、インターネット全体で有効な実際のDNSドメインを使用します。

キャプティブ認証の実装方法をまとめようとする訪問者については、私のQ&A Apacheを使用したキャプティブポータル および関連する質問 FON認証ポータルからのWISPrタグの取得 も参照してください。テストにも役立ちます MacOSでCNAを無効にする

1
Rui F Ribeiro