公衆無線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版の記事を参照のこと。
※もともと何か事情があってDNSサーバを固定化していたのなら、公衆無線LAN利用後に本設定を戻すのを忘れずに。
以下は余談。
公衆無線LANでインターネット接続するときのポータル表示の仕組み
初回アクセス時に強制的に公衆無線LANのポータルページを表示させるこの仕組には、「Captive Portal」という名前がついているらしい。実現方法はいくつかあるが、マックのWiFiで採用されてる製品の方式は以下の通りだった。(キャプチャ結果より)
本来の動き
- クライアントはDHCPサーバからIPアドレスとDNSサーバのアドレスを受け取って設定する。
- クライアントが任意のサイトにアクセスする。(例えば http://www.yahoo.co.jp/)
- クライアントはDNSリクエストを投げてwww.yahoo.co.jpに紐づくIPアドレスを受け取る。
- クライアントはwww.yahoo.co.jpに対してGETリクエストを発行する。
- ゲートウェイはこのGETリクエストを横取りして、クライアントにステータスコード302とリダイレクト先(公衆無線LANのポータルページ)のホスト名を返す。
- クライアントは認証ページにアクセスする。
その他の方式として、上記「3.」の時点でどんなDNSリクエストが来ても認証ポータルページへのIPアドレスを返すDNSハイジャックというやり方もある。 他にもある。 Captive portal - Wikipedia
今回の動き
- クライアントはDHCPサーバからIPアドレスとDNSサーバのアドレスを受け取る。IPは受け取った値を採用するが、DNSサーバは固定の8.8.8.8を採用。
- クライアントが任意のサイトにアクセスする。(例えば http://www.yahoo.co.jp/)
- クライアントは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リクエストが通らなくてここで止まる。