公衆無線LAN(フリーWi-Fi)に接続できない。認証ページが表示されない件。(Mac)

 最近、マックやコメダなど、飲食店で提供しているフリーWi-Fiに接続できないことに気付いた。 接続できないってのはWiFiにはつながるんだけど、最初の認証ページが表示されないって状態。

同じ境遇の人のために、原因と対策を書いた。

現象

公衆無線LAN(フリーWi-Fi)に接続できない。 認証ページが表示されない。

確認したこと

1.アクセスポイント(=無線LANルータ)には接続できている
2.IPアドレスは取得できている
3.インターネットにアクセスできない
→ブラウザを開いてテキトーなページにアクセスすると、待たされた挙句、エラーページが表示される。すなわち、インターネットアクセス時に最初に表示されるはずのページ(規約が書いてあったり、認証を求められたりする例のページ)にリダイレクトされない。

以上に当てはまれば、DNS設定に関する問題である可能性が高いので以下の「対処方法」の項を参照されたい。

原因

 結論としては、DNS設定で「8.8.8.8(固定)」を指定していたことが原因だった。 この状態で任意のwebサイトにアクセスすると、そのサイトの名前解決を行うために、8.8.8.8へDNSリクエストを送ろうとする。ところがこの通信は(少なくともフリーWi-Fiのインターネットアクセス認証前には)許可されていないため、ゲートウェイで落とされる。

対処方法

固定で指定しているDNSサーバの設定を削除し、DHCPで自動的に割り当てられるDNSサーバを採用すればよい。
以下はMacの場合の手順。Windowsをご利用の方はWindows10版の記事を参照のこと。

  1. 画面右上メニューの扇形をしたWi-Fiアイコンをクリック
    f:id:cateching:20170103160216p:plain

  2. 「ネットワーク環境設定を開く…」をクリック
    f:id:cateching:20170103160223p:plain

  3. Wi-Fi」を選択して「詳細」をクリック f:id:cateching:20170103160237p:plain

  4. DNS」タブをクリック f:id:cateching:20170103160515p:plain

  5. DNSサーバのIPアドレス(以下の例では8.8.8.8)を選択して、「−」ボタンをクリック。(削除) f:id:cateching:20170103160753p:plain

  6. DHCPで配布されたDNSサーバのIPアドレスが設定されていることを確認して、「OK」ボタンをクリック f:id:cateching:20170103160653p:plain

※もともと何か事情があってDNSサーバを固定化していたのなら、公衆無線LAN利用後に本設定を戻すのを忘れずに。

以下は余談。

公衆無線LANでインターネット接続するときのポータル表示の仕組み

 初回アクセス時に強制的に公衆無線LANのポータルページを表示させるこの仕組には、「Captive Portal」という名前がついているらしい。実現方法はいくつかあるが、マックのWiFiで採用されてる製品の方式は以下の通りだった。(キャプチャ結果より)

本来の動き

  1. クライアントはDHCPサーバからIPアドレスDNSサーバのアドレスを受け取って設定する。
  2. クライアントが任意のサイトにアクセスする。(例えば http://www.yahoo.co.jp/
  3. クライアントはDNSリクエストを投げてwww.yahoo.co.jpに紐づくIPアドレスを受け取る。
  4. クライアントはwww.yahoo.co.jpに対してGETリクエストを発行する。
  5. ゲートウェイはこのGETリクエストを横取りして、クライアントにステータスコード302とリダイレクト先(公衆無線LANのポータルページ)のホスト名を返す。
  6. クライアントは認証ページにアクセスする。

その他の方式として、上記「3.」の時点でどんなDNSリクエストが来ても認証ポータルページへのIPアドレスを返すDNSハイジャックというやり方もある。 他にもある。 Captive portal - Wikipedia

今回の動き

  1. クライアントはDHCPサーバからIPアドレスDNSサーバのアドレスを受け取る。IPは受け取った値を採用するが、DNSサーバは固定の8.8.8.8を採用。
  2. クライアントが任意のサイトにアクセスする。(例えば http://www.yahoo.co.jp/
  3. クライアントは8.8.8.8に対してDNSリクエス
    →応答なし、終わり
    →URLを入力するとまずDNSリクエストを投げちゃうので、そもそも初期ページにリダイレクトされない。

DNSリクエストが通らないのであれば…ということでテキトーなIPアドレス(XXX.XXX.XXX.XXX)をブラウザのアドレスバーに打ち込みアクセスしてみた。
この場合、DNSリクエストを投げる必要が無いので、想定通りHTTPリクエストが発行される。

GET /
Host: XXX.XXX.XXX.XXX
302 Found
Location: http://10.4.0.1/index.php?http://XXX.XXX.XXX.XXX/  

→リダイレクト

GET /index.php?http://XXX.XXX.XXX.XXX/ 
Host: 10.4.0.1
302 Found
Location: http://mdj-service-select.internal/ServiceSelect.html?mac=NN:NN:NN:NN:NN:NN&griffasid=XXXX-XX-XXNN  

→mdi-service-select.internalをDNSリクエス
 →結局DNSリクエストが通らなくてここで止まる。