MikroTik hAP acで作るHotspot 2.0環境 (iOS編)

全体的にざっくりしています。筆者の認識誤りが多分に含まれるかもしれません。

■前説Hotspot 2.0

従来の無線LANにおいてはユーザがSSIDを選び認証情報を入力して接続していたが、Hotspot 2.0では802.11uを用いてユーザーが手動でSSIDを選ぶことなく初見のSSIDでも(ユーザが利用可能な認証情報をプロファイル等でデバイスに設定していれば)自動的に認証してセキュアに利用可能な無線LANに接続できる。

ruckusのホワイトペーパー
How Interworking Works: A Detailed Look at 802.11u and Hotspot 2.0 Mechanisms

802.11u以前では、AP発見時にSSIDと暗号化方式(WEP,WPA2など)しか伝えられなかった。
802.11uにおいては、SSID、暗号化方式、network type、課金の有無、インターネット接続の速度・ステータス、ローミング利用可能な事業者、Network Access Identifier (NAI) realm、IPv4IPv6か、EAP type、などどいった情報を、広報プロトコルでクライアントデバイスに伝えることが可能となっている。
これらの情報を元にクライアントデバイスが接続するSSIDを選んだあとの認証は、802.1Xで行われる。
認証の部分は従来の802.1Xと同じなので、キャリアであればSIMの情報を利用したEAP-SIMやEAP-AKAなども利用できるし、eduroamでよく使われているPEAP(EAP-MSCHAP v2)などでもよい。

具体的な接続シーケンスは下記の通りである。

インターネット白書2013-2014, Wi-Fiの最新技術動向 207頁 資料4-3-7 Hotspot2.0のシーケンス

■必要なもの

Hotspot 2.0に対応したアクセスポイント

今回使うのは、MikroTikのhAP ac (RB962UiGS-5HacT2HnT)。
技適取得済のMikroTik hAP ACは(比較的)安価なHotspot 2.0対応のAPかもしれない - pirosapの備忘録

RouterOSはハードウェアが異なっても基本的にできることは同じなので、技適が通っている他のモデルであっても同じことができるはず。

RADIUSサーバ

認証を処理するためのRADIUSサーバ。hAP ac内部のRADIUSサーバでもよいかもしれないが、当方の目的には合わないので検証していない。
今回は、hAP acと同一のLAN上に設置したLinuxサーバ上にFreeRADIUS 3.0.10で構築したものを用いた。

参考:eduroam JP FreeRADIUS 3の導入
eduroam加入機関向けに書かれたドキュメントであるが、RADIUS proxy以外(今回は考慮していない)の部分はほぼ同じ。
mods-available/eap にある、private_key_password, private_key_file, certificate_file, ca_file については、正規のサーバ証明書に書き換える。検証環境では無償で証明書が利用可能な認証局のLet's Encryptで取得したものを用いている。
ストアカウントを直接ファイルに記載して認証をテストしたのち、hAP acのIPアドレスとシークレット文字列をclients.confに設定しておく。

iOSバイス

Androidはメーカやバージョン毎に実装が異なり、検証が難しい(手元ではAndroid 7.1.1のNexus 5Xで動作確認済)ため、iOS(10.2.1〜)で検証を行った。

iOSバイスにインストールするプロファイル

macOSにて、Apple Configurator 2で生成した。
内容はxmlなので、頑張ればエディタでも作れるのかもしれない。
現状では、あまり多くのことはできないかな、という印象(Release1相当?)
生成したプロファイルはiOSクライアントにインストールしておく。

6/9 誤りに気付いたので修正(プロファイルに含めていたサーバ証明書を削除)。
サーバ証明書秘密鍵を添付するとかよく考えたらおかしかった。

hoge.mobileconfig (一部ぼかしてあります)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PayloadContent</key>
        <array>
                <dict>
                        <key>AutoJoin</key>
                        <true/>
                        <key>CaptiveBypass</key>
                        <false/>
                        <key>DisplayedOperatorName</key>
                        <string>NGH testbed by pirosap.tech(ここの文字列がSSIDの下に表示される)</string>
                        <key>DomainName</key>
                        <string>ngh.pirosap.tech(ここがhAP ac側の設定と一致すると自動接続対象に選ばれるのだと思う)</string>
                        <key>EAPClientConfiguration</key>
                        <dict>
                                <key>AcceptEAPTypes</key>
                                <array>
                                        <integer>21</integer>
                                </array>
                                <key>PayloadCertificateAnchorUUID</key>
                                <array>
                                        <string>04FD025F〜ほげほげ</string>
                                </array>
                                <key>TLSTrustedServerNames</key>
                                <array>
                                        <string>ngh.pirosap.tech</string>
                                </array>
                                <key>TTLSInnerAuthentication</key>
                                <string>MSCHAPv2</string>
                                <key>UserName</key>
                                <string>1xID(FreeRADIUSに設定したID)</string>
                                <key>UserPassword</key>
                                <string>1xPASSWORD(FreeRADIUSに設定したパスワード)</string>
                        </dict>
                        <key>EncryptionType</key>
                        <string>WPA2</string>
                        <key>HIDDEN_NETWORK</key>
                        <false/>
                        <key>IsHotspot</key>
                        <true/>
                        <key>PayloadDescription</key>
                        <string>Wi-Fi 設定を構成します</string>
                        <key>PayloadDisplayName</key>
                        <string>Wi-Fi</string>
                        <key>PayloadIdentifier</key>
                        <string>com.apple.wifi.managed.D8D2〜ほげほげ</string>
                        <key>PayloadType</key>
                        <string>com.apple.wifi.managed</string>
                        <key>PayloadUUID</key>
                        <string>4418D5〜ほげほげ</string>
                        <key>PayloadVersion</key>
                        <integer>1</integer>
                        <key>ProxyType</key>
                        <string>None</string>
                </dict>
        </array>
        <key>PayloadDisplayName</key>
        <string>ngh.pirosap.tech</string>
        <key>PayloadIdentifier</key>
        <string>pirosap.local.9B6C2〜ほげほげ</string>
        <key>PayloadRemovalDisallowed</key>
        <false/>
        <key>PayloadType</key>
        <string>Configuration</string>
        <key>PayloadUUID</key>
        <string>A2CC〜ほげほげ</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
</dict>
</plist>
hAP acの構成

※2017/4/27現在公開されているバージョン RouterOS 6.37.5(Bugfix only), 6.38.5(Current), 6.39rc80(Release candidate)にはバグがある模様です。設定は可能ですが、1時間弱でCPU利用率が100%となります。開発元では事象を確認しており、当方の環境ではdebug versionで事象が解消されたことを確認しております(近くRC版に修正が取り込まれる見込みです)。
4/29追記 修正が取り込まれた6.40rc2 (Release candidate)が公開されました。("fixed 802.11u wireless request processing")

ether1の上位にDHCPサーバがあり、ether1はDHCPでアドレスを取得する。
firewallは適切に設定してください。

以下、初期設定から異なるところのみ。
(ether2に有線LANで接続したPCより、SSHにて設定。パスワード、NTP Clientなど設定しておく)
検証環境では、5Ghz帯でのみ行ったため、2.4Ghz帯のwlan1を停止させている。

802.1xのAPとして設定

[admin@MikroTik] > /interface wireless set 0 country=japan frequency-mode=regulatory-domain
[admin@MikroTik] > /interface wireless set 0 disabled=yes
[admin@MikroTik] > /interface wireless set 1 country=japan frequency-mode=regulatory-domain
[admin@MikroTik] > /interface wireless security-profiles add name=1X
[admin@MikroTik] > /interface wireless security-profiles set 1 mode=dynamic-keys authentication-types=wpa2-eap eap-methods=passthrough
[admin@MikroTik] > /interface wireless security-profiles print
Flags: * - default
0 * name="default" (略)
1   name="1X" mode=dynamic-keys authentication-types=wpa2-eap unicast-ciphers=aes-ccm group-ciphers=aes-ccm wpa-pre-shared-key=""
    wpa2-pre-shared-key="" supplicant-identity="MikroTik" eap-methods=passthrough tls-mode=no-certificates tls-certificate=none
    mschapv2-username="" mschapv2-password="" static-algo-0=none static-key-0="" static-algo-1=none static-key-1=""
    static-algo-2=none static-key-2="" static-algo-3=none static-key-3="" static-transmit-key=key-0 static-sta-private-algo=none
    static-sta-private-key="" radius-mac-authentication=no radius-mac-accounting=no radius-eap-accounting=no interim-update=0s
    radius-mac-format=XX:XX:XX:XX:XX:XX radius-mac-mode=as-username radius-mac-caching=disabled group-key-update=5m
    management-protection=disabled management-protection-key=""
[admin@MikroTik] > /radius set 0 service=wireless address=172.31.0.7 secret=xxxxxx
[admin@MikroTik] > /radius print
Flags: X - disabled
#   SERVICE              CALLED-ID            DOMAIN            ADDRESS           SECRET
0   wireless                                                    172.31.0.x        xxxxxxxx
[admin@MikroTik] > /interface wireless set 1 security-profile=1X

この時点で、適当なクライアントデバイスSSIDを選択して、PEAPで認証・接続できることを確認しておく。

Hotspot 2.0のAPとして設定を追加

[admin@MikroTik] > /interface wireless interworking-profiles add name=pirosap
[admin@MikroTik] > /interface wireless interworking-profiles set 0 domain-names=ngh.pirosap.tech operator-names="NGH testbed by pirosap.tech"
[admin@MikroTik] > /interface wireless interworking-profiles print
0 name="pirosap" network-type=wildcard internet=yes asra=no esr=no uesa=no venue=unspecified hessid=00:00:00:00:00:00 hotspot20=yes
  hotspot20-dgaf=yes roaming-ois="" venue-names="" authentication-types="" ipv4-availability=not-available
  ipv6-availability=not-available realms="" 3gpp="" domain-names=ngh.pirosap.tech operator-names=NGH testbed by pirosap.tech
  wan-status=reserved wan-symmetric=no wan-at-capacity=no wan-downlink=0 wan-uplink=0 wan-downlink-load=0 wan-uplink-load=0
  wan-measurement-duration=0 connection-capabilities="" operational-classes=""
[admin@MikroTik] > /interface wireless set 1 interworking-profile=pirosap
[admin@MikroTik] > /interface wireless print
Flags: X - disabled, R - running
0 X  (略)
1    name="wlan2" mtu=1500 l2mtu=1600 mac-address=6C:3B:6B:xx:xx:xx arp=enabled interface-type=Atheros AR9888 mode=ap-bridge
     ssid="MikroTik-HS20" frequency=auto band=5ghz-a/n/ac channel-width=20/40/80mhz-Ceee scan-list=default
     wireless-protocol=802.11 vlan-mode=no-tag vlan-id=1 wds-mode=disabled wds-default-bridge=none wds-ignore-ssid=no
     bridge-mode=enabled default-authentication=yes default-forwarding=yes default-ap-tx-limit=0 default-client-tx-limit=0
     hide-ssid=no security-profile=1X compression=no

※Acronyms
asra(Additional Steps Required for Access)
esr(Emergency Services Reachable)
uesr(Unauthenticated Emergency Service Accessible)
dgaf(Downstream Group Addressed Forwarding)

プロファイルをインストールしたクライアントデバイスからの接続を確認

デモ動画