自宅にVPNサーバーを構築して、外出先でスマホやPCを利用する際はVPN接続をするようにしています。
最近はSSLが有効なサイトも増えてさほど気にしなくてもいいという話もありますが、なりすましのアクセスポイントの存在を耳にしたり、暗号化されていないDNSの通信などを考えると、やっぱり気持ち悪くてVPNをつなぎたくなります。
iOSでのオンデマンドVPN接続の自動化
iOSでは構成プロファイルを作成してデバイスにインストールすることで、VPNの接続を自動化することができます。構成プロファイルの具体的な作成方法は以前記載しました。
実際には今自宅のVPNサーバーはIKEv2 RSA接続にしているので、上記で紹介したツールで作成したプロファイルなどをベースに、手で修正を加えて利用しています。
ちなみに、自宅サーバーでは、Githubで公開されている以下のスクリプトで、VPN(IKEv2 RSA)サーバーを構築しています。このスクリプトでは、iOSクライアント用に証明書情報なども含む構成プロファイルを作成してくれます。
https://github.com/hwdsl2/setup-ipsec-vpn GitHub - hwdsl2/setup-ipsec-vpn: Scripts to build your own IPsec VPN server, with IPsec/L2TP, Cisco IPsec and IKEv2Scripts to build your own IPsec VPN server, with IPsec/L2TP, Cisco IPsec and IKEv2 - hwdsl2/setup-ipsec-vpn
公衆Wi-FiでのオンデマンドVPN接続の悩み
今回紹介するのはタイトルの通りですが、公衆Wi-Fiに接続した際、公衆Wi-Fi接続時にログインが求められる場合には、ログインしてインターネット接続が可能な状態になった後にVPN接続のタイミングを制御しようという内容です。
公衆Wi-FiでVPN自動接続をさせている方はすぐ共感をいただけると思うのですが、ログインが求められる公衆Wi-Fiサービスでは、ログイン画面(いわゆるキャプティブポータル画面)でログイン完了しないとインターネットに接続できません。
が、iOSの構成プロファイルを利用してWi-Fi接続を契機にオンデマンドVPNを構成していると、公衆Wi-Fiに接続された時点でVPN接続を試行してしまうことが原因で、デバイスから公衆Wi-Fiのログイン画面が接続できなくなってしまうのです。結果として、デバイスがインターネットにつながらない状態になってしまいます。
マクドナルドやスターバックスなどのログインを求められる公衆Wi-Fiで過去に接続したことのあるスポットに入った場合に、QRコード決済のバーコード表示などが正常に行われずあたふたする結果となってしまっていました。
ただ、直近はiOSのアップデートでキャプティブポータルでの認証が求められる場合のVPN自動接続の問題が解消しているかもしれず、もしかするともはや必要ないかもしれませんが…
キャプティブポータルでのログオン完了までVPN接続を抑止する方法
iOSの構成プロファイルのパラメーターに「URLStringProbe」があります。このパラメーターで指定するURLに直接接続できるか(ステータス 200が返ってくるか、リダイレクトは非サポート)どうかが判定条件となります。
OnDemandRulesを以下のように構成することで、キャプティブポータル未ログインでインターネットに接続できない状態の場合のオンデマンドVPN接続を抑止し、キャプティブポータルでのログイン後にオンデマンドVPN接続させることができます。
<key>OnDemandRules</key>
<array>
<!-- VPN自動接続対象外とするSSIDの指定 -->
<dict>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
<!-- 自動接続対象外とするSSID(自宅など) -->
<key>SSIDMatch</key>
<array>
<string>NotConfigured</string>
<string>NotConfigured</string>
<string>NotConfigured</string>
<string>NotConfigured</string>
<string>NotConfigured</string>
</array>
<key>Action</key>
<string>Disconnect</string>
</dict>
<dict>
<!-- Wi-Fi接続時のVPN自動接続対象条件 -->
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
<!-- Wi-Fi接続語Appleのホットスポット検知用URLに接続できた場合にVPN接続 -->
<key>URLStringProbe</key>
<string>http://captive.apple.com/hotspot-detect.html</string>
<key>Action</key>
<string>Connect</string>
</dict>
<!-- Wi-Fi再接続時のVPN自動接続 -->
<dict>
<key>Action</key>
<string>EvaluateConnection</string>
<key>Action</key>
<array>
<dict>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
<key>URLStringProbe</key>
<string>http://captive.apple.com/hotspot-detect.html</string>
</dict>
</array>
</dict>
<dict>
<!-- VPNのデフォルト動作(切断) -->
<key>Action</key>
<string>Disconnect</string>
</dict>
</array>
構成プロファイルのオンデマンド接続ルールを上記のようにすることで、以下の動作となります。
- 通常はVPN切断
- Wi-Fi接続時かつ、以下の条件に該当した場合にVPN接続
- URLStringProbeで指定したURL(上記例ではAppleのホットスポット検出用URL)にアクセスができる
- Wi-Fi再接続時に、上記条件に該当する場合VPNに接続
- 指定した特定のSSIDへの接続の場合はVPNを切断(接続しない)