hgot07 Hotspot Blog

主に無線LANや認証連携などの技術についてまとめるブログです。ネコは見る専。

OpenWrtをTOKYO FREE Wi-Fiにつなげてみよう! (他のOpenRoamingでもOK)

[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にアップグレード

Version 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ですが、モバイル用途ならまだ我慢できるかなと。たまたま()手元にあったので、今回はこれを使ってみます。

Slate Plus (左)とMango (右)

Slate Plus (左)とMango (右)

執筆時点のファームウェアはバージョン4.4.6で、OpenWrt 21.02.2ベースでした。

GL-A1300 overview

GL-A1300 overview

古いモデルと違って、最初からwpad-openssl (フル版wpad)がインストールされているので、-basic から入れ替える手間がありません。

http://192.168.8.1/cgi-bin/luci にアクセスして、LuCIの方から設定していきます。Wirelessメニューの中でWPA2/WPA3 Enterpriseのクライアント設定に進みます。radio0またはradio1のAddボタンをクリックします。

Wireless Overview

Wireless Overview

Device Configuration

Device Configuration

Device Configurationのポップアップが開くので、General Setupタブの中で、適当なESSIDを入力します。Passpointの場合、これはダミーになります。Networkはwwanを選びます。つまり、上流のネットワークにつなぐという意味です。
続いてWireless Securityタブに移動します。

Wireless Security

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のウェブサイトにアクセスして、規約確認の後、ソーシャルアカウントなどで認証を受けます。

TOKYO FREE Wi-Fi (OpenRoaming対応)

TOKYO FREE Wi-Fi (OpenRoaming対応)

プロファイルをダウンロードできるところまで進んだら、左上の「くわしいメニュー」を選び、プロファイルの手動設定の説明に進みます。

「プロファイルの設定」画面

「プロファイルの設定」画面

ずっと下にスクロールしていくと、「ユーザ名、パスワードを作成する」というボタンがあるので、これをクリックします。

「ユーザ名、パスワードを作成する」ボタン

「ユーザ名、パスワードを作成する」ボタン

ここで表示されたユーザ名をIdentityに、パスワードをPasswordに入力します。

Wireless Securityタブの一番下にあるSaveボタンをクリックして、Wireless Overviewに戻り、Save&Applyボタンをクリックします。

Cityroamの参加機関の基地局が近所にある場合は、ESSIDに "cityroam" を指定することで、Passpointのない802.1X認証による接続確認ができます。

※ TOKYO FREE Wi-Fiではない、他所で発行されるOpenRoamingのプロファイルも、同様に使えます。PasspointプロファイルからID・パスワードを取り出す方法はこちら ↓

hgot07.hatenablog.com

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)が決め打ちになっているのは、ご容赦ください。

hgot07.hatenablog.com

まず、/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=1

cred={
        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
fi

                cat >> "$_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

少し待つと…… ヽ(゚∀゚)ノ

OpenRoamingに接続された状態

OpenRoamingに接続された状態

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

 

今度こそ、めでたし、めでたし! (だといいなぁ)