[2024/1/27追記] ドメイン名の指定に間違いがあったので修正しました。
2023年3月末からOpenRoaming対応になった新生TOKYO FREE Wi-Fiに、OpenWrt箱を接続してみましょう。OpenRoamingに非対応の機器も接続できるモバイルルータが作れます。といっても、Passpointプロファイルさえ取得できれば、TOKYO FREE Wi-Fiに限りません。国内外のOpenRoaming対応のフリーWi-Fiでも使える技を紹介します。
(おやくそく) プロファイルを仕込んだルータの盗難には十分気を付けましょう。
OpenWrt箱を用意する - Mangoはどう?
結論から述べるとMangoではダメでした_('、3」∠)_
(急ぎたい人は次章へどうぞ)
手元にお役御免になったGL.iNet Mango (GL-MT300N-V2)があったので、最初にこれを試しました。今となってはCPUがだるいほど遅いし、2.4GHz帯専用だし、簡単にメモリ不足になるので、新規に購入することは奨めません。ちょっとどころじゃなく大きくなってしまいますが、これから買うなら、同社のSlate Plus (GL-A1300)より新しいモデルがよいでしょう。
ところで、かわいい筐体で大ヒットしたMangoですが、当初はOpenWrt 19.xベースで長いことアップグレードが止まっていました。一応、GL.iNet版ではなくOpenWrt版の21.x系ファームウェアが出てPasspoint (Hotspot 2.0)も使えるようになったのですが、公式ファームウェアが出ませんでした。ところが2023年になって突然、22.x系の公式ファームウェアが登場しました。執筆時点で Version 4.3.7 が出ているので、まずこれにアップグレードします。
手元のMangoは Version 3.105 といういにしえのファームウェアが入っていましたが、まずこれを 3.203 に上げて……と思ったら、GL.iNet ADMIN PANELのUPGRADEメニューではなぜかアップグレードできません。仕方がないので、MORE SETTINGS> AdvancedからLuCIを起動して、そちらでファームウェアを焼きます。ダウンロードできる最新版が 3.216 だったので、それを焼きました。(いきなり4.x系を焼いてもよいかも)
続いて、同様の手順で 4.3.7 を焼きます。設定内容は移行できないので、初期設定からスタートします。
ほい!
まって、初期状態でもうメモリがぱんぱんです;;
Version 4.3.7の中身は、OpenWrt 22.03.4でした。WPA2 Enterpriseを使うのに必要な wpa-supplicant パッケージをインストールしようにも、メモリ不足で入りません。いきなりの試合終了です。
OpenWrt箱を用意する - Slate Plusにしてみた
[2024/1/28追記] 執筆時点の純正ファームウェア (OpenWrt 21.02ベース) では、PasspointのANQPが正常動作しないことが判明しました。OpenRoamingが採用しているRCOIマッチングの方は動きますが、基地局によっては接続できないことがありそうです (RCOIが4個以上登録された基地局)。この機種を使う場合はご了承ください。
GL.iNet Slate Plusも、Slate AXやBeryl AXと比べるともっさりしたCPUですが、モバイル用途ならまだ我慢できるかなと。たまたま()手元にあったので、今回はこれを使ってみます。
執筆時点のファームウェアはバージョン4.4.6で、OpenWrt 21.02.2ベースでした。
古いモデルと違って、最初からwpad-openssl (フル版wpad)がインストールされているので、-basic から入れ替える手間がありません。
http://192.168.8.1/cgi-bin/luci にアクセスして、LuCIの方から設定していきます。Wirelessメニューの中でWPA2/WPA3 Enterpriseのクライアント設定に進みます。radio0またはradio1のAddボタンをクリックします。
Device Configurationのポップアップが開くので、General Setupタブの中で、適当なESSIDを入力します。Passpointの場合、これはダミーになります。Networkはwwanを選びます。つまり、上流のネットワークにつなぐという意味です。
続いてWireless Securityタブに移動します。
次のようにパラメータを入力します。
- Encryption: WPA2-EAP (strong security)
- Cipher: "Force CCMP (AES)" にする。TKIPは使ってはいけない。
- EAP-Method: EAP-TTLSを使うので "TTLS" を選択する。
- Use system certificate: サーバ認証を有効にするため、必ずチェックを入れる。
- Certificate constraint (Wildcard): eap.wi2.ne.jp
(2024/1/27:上のキャプチャ画像でSubjectの方に値が入っているのは間違いです) - Authentication: EAP-MSCHAPv2
- Anonymous Identity: anonymous@tokyo.wi2.cityroam.jp
- 802.11w Management Frame Protection: Optional
IdentityとPasswordに入力する値は、以下のようにして取得できます。
まず、(新しい方の) TOKYO FREE Wi-Fiのウェブサイトにアクセスして、規約確認の後、ソーシャルアカウントなどで認証を受けます。
プロファイルをダウンロードできるところまで進んだら、左上の「くわしいメニュー」を選び、プロファイルの手動設定の説明に進みます。
ずっと下にスクロールしていくと、「ユーザ名、パスワードを作成する」というボタンがあるので、これをクリックします。
ここで表示されたユーザ名をIdentityに、パスワードをPasswordに入力します。
Wireless Securityタブの一番下にあるSaveボタンをクリックして、Wireless Overviewに戻り、Save&Applyボタンをクリックします。
※ Cityroamの参加機関の基地局が近所にある場合は、ESSIDに "cityroam" を指定することで、Passpointのない802.1X認証による接続確認ができます。
※ TOKYO FREE Wi-Fiではない、他所で発行されるOpenRoamingのプロファイルも、同様に使えます。PasspointプロファイルからID・パスワードを取り出す方法はこちら ↓
OpenWrtをPasspointクライアントとして設定する
[2024/1/29追記] 汎用に使えるように改造した hostapd.sh をGitHubで公開しました。以下の手順よりも簡単に設定できるはずです。
執筆時点のOpenWrt (最新版は23.x)には、まだPasspointのクライアント機能を設定する仕組みがありません。ただし、OpenWrt 21.x以降ではPasspoint対応のwpad (hostapd, wpa-supplicant)が使われているので、一部のスクリプトを書き換えるだけで、Passpointを有効化できます。
大昔に書いた(ウソ)以下の記事を参考にして、Passpointクライアントになるように改造していきます。なお、OpenRoaming (settlement-free model)のRoaming Consortium Oranization Identifier (RCOI)が決め打ちになっているのは、ご容赦ください。
まず、/etc/config/wireless を (お好きな) テキストエディタで開き、上で設定したものに対応する config wifi-iface ブロックを見つけます。optionが沢山並んでいますが、そこに一行だけ付け加えて、保存しておきます。
option iw_enabled '1'
まだOpenWrtに存在しないオプションなので、このままでは何も起きません。
ついでに、このファイルを別名で保存しておきます (伏線)。
# cd /etc/config
# cp wireless wireless.save
次に /lib/netifd に移動して、hostapd.sh を編集します。
# cd /lib/netifd
# cp -p hostapd.sh hostapd.sh.orig
# <お好きなエディタ> hostapd.sh
1309行目あたり (wpa_supplicant_add_network() の中)に次のような行があるので、赤字の一行を追加します。
json_get_vars eap_type identity anonymous_identity ca_cert ca_cert_usesystem
json_get_vars iw_enabled ←これを追加
1495行目あたりから、次のように追記します。
if [ "$key_mgmt" = "WPS" ]; then
echo "wps_cred_processing=1" >> "$_config"
else
if [ "$iw_enabled" = "1" ]; then
cat >> "$_config" <<EOF
interworking=1
hs20=1
auto_interworking=1cred={
username="$identity"
password="$password"
ca_cert="/etc/ssl/certs/ca-certificates.crt"
domain_suffix_match="$domain_suffix_match"
roaming_consortiums="5A03BA0000"
eap=$(echo $eap_type | tr 'a-z' 'A-Z')
phase2="auth=$auth"
}
EOF
ficat >> "$_config" <<EOF
network={
$scan_ssid
ssid="$ssid"
key_mgmt=$key_mgmt
$network_data
}
EOF
fi
return 0
}
ファイルを保存したら、wifiコマンドで設定を反映させます。ついでにバックアップも作っておきます。
# cp hostapd.sh hostapd.sh.save
# wifi
少し待つと…… ヽ(゚∀゚)ノ
WPA2 Enterprise用に設定したSSIDとは異なる "openroaming" というSSIDに接続されていることが分かります。That's Passpoint!
めでたし、めでたし……
コイツ、消えるぞ……
あとは自分の端末をぶら下げるSSIDを吹けばOK、楽勝!と思いきや、ここで衝撃の問題が発覚。
なんと、このSlate Plusたん、リブートするとWi-Fiクライアントの設定を綺麗さっぱり忘れてしまいます。具体的には、/etc/config/wireless の中で "sta" に設定された項目が、すべて消えてしまいます。
これでは、モバイルOpenRoamingルータとして使い物にならないではないですか。
色々と探ってみたのですが、どこでこのワイプが行われているのか、まだ判りません。誰か教えて~
仕方がないので、/etc/rc.local をいじって、頭に次の二行を追加しました。(伏線回収)
cp /etc/config/wireless.save /etc/config/wireless
wifi
今度こそ、めでたし、めでたし! (だといいなぁ)