我が家では自宅全体を5GHzでカバーするために802.11sのメッシュを組んだのだが、メッシュ組んだならアクセスポイント間でローミングも動かしたいよね。ということで今更ながら設定。実際にはWi-Fi接続が切れて困るようなサービスは普段使わないし、自宅勤務のときでもテレカン中にアクセスポイントを跨いで移動したりはしないので、はっきり言って実装する必要性はないのだが、いつものとおりやってみたいということで。
ローミングとバンドステアリングとは
似ているような気もするが違うものなので最初に整理すると
- ローミング:複数のAP(アクセスポイント)の間をクライアントが移動するときに効率的な動作を助け接続性を高める仕組み。こっちのAPのほうが品質がいいよと教えたり、AからBに移動するときに予め認証を済ませておいて接続断が起こらないようにしたりなどする。APとクライアントが互いに連携して成立し、双方が規格に対応している必要があるが、挙動の最終的な主導権はクライアント側にある。IEEE 802.11r/k/vの3つの標準規格で構成される
- バンドステアリング:同一SSIDで異なる周波数帯(2.4/5/6GHz)が利用できるときに、クライアントを特定の周波数帯に寄せようとするAP側の実装。例えば意図的に2.4GHzの接続を遅らせたり品質を下げるなどして、クライアントが5GHzや6GHzを選択するように仕向ける。標準規格は規定されておらず、現状では各ベンダーの独自実装となる
OpenWrt上でできること
実はOpenWrtでは前述の「バンドステアリング」に該当する動作は実現できない。標準規格がないので、まあ分かる。
近い案として「2.4GHzと5GHzのAPの間でローミングを設定し、2.4GHzへの接続優先度を下げることで疑似的にバンドステアリングっぽい挙動を実現する」ことは可能である。
今回のゴール
ローミング自体は802.11k/v/rを導入し設定すれば動作するようになる。ただしそれだけだとAP間の移動は完全にクライアント主導になってしまい、意図して特定の周波数帯に寄せたり状態の悪いAPから離脱させたりというバイアスをかけられないので、そのような「AP側からの積極的なローミング制御」のためにDAWNというサービスを併せて導入する。具体的には以下の状態をゴールとする。
- 我が家で稼働中のクライアント接続用OpenWrtルータ3台の上に立っている4つのAP(5GHz×3、2.4GHz×1)の間で、802.11k/v/rによるWi-Fiローミングを成立させる
- さらにDAWNを導入して積極的なローミング制御をさせる。2.4GHzは少数のレガシーデバイス接続用&5GHzトラブル時(そんなトラブルが起きるのかという話はあるが)の予備としての稼働なので、優先度を下げて基本的には普段は接続されないようにする
前提とか制限事項とか
WPA3を使おうとすると色々クセというか制限がある。当面はWPA2にしておいたほうが無難っぽい。
- ローミングにあたって各ノード(今回はOpenWrt上のアクセスポイント)でPMK(マスターキー)というものが必要になる。これはOpenWrtにローカルで自動生成させることが可能で、この方法が手っ取り早く手軽でいいのだが、WPA2でしか自動生成させられないという制限がある。WPA3を使いたいなら手動で文字列を用意して設定に突っ込む必要があり、設定がちょっと面倒くさくなる
- またWPA3では規格上802.11w(Protected Management Frames)の利用が必須であり、OpenWrtでアクセスポイントの認証方式にWPA3を選択するとその時点で802.11wがRequired(必須)に設定されるが、この802.11w必須状態だと何故かローミングが発動しない。一旦Requiredになったものを手動でOptional(任意)に設定しなおすことは可能で、そうするとローミングは稼働し始めるのだが、しかし動作仕様に違反した状態となり、例えばWindows11でWPA3接続ができなくなるなどのデメリットが生じる
つまるところ現状(2024年10月時点)では、OpenWrtでWPA3+ローミング(802.11k/v/rのフル装備)という組み合わせは綺麗に動かない可能性が高い。WPA2+WPA3のMix modeでもダメ。なので、今回はWPA2で行くことにする。Krackに対してはOpenWrtでも対抗オプションが用意されているし、ちゃんと設定された個人宅のWPA2をわざわざ狙いにくるヒマな犯罪者もいないだろうし。
※2024/12追記:24.10.0-rc2ではWPA3-SAEでFTが動くようになっている。802.11wはOptionalでもRequiredでも大丈夫。何かが修正されたようである。WPA2-PSK/WPA3-SAEのMixed modeではFTは有効にならなかった。ひとまずLinksys WHW03 V2で確認。
設定手順
- OpenWrtのwpadをフル版に入れ替える。23.05.xだとおそらくデフォルトではwpad-basic-mbedtlsが入っているので、wpad-mbedtls(ないしはwpad-wolfsslかwpad-openssl)に差し替える。wpad-mesh-mbedtlsは機能が足りないのでNG
# opkg update
# opkg remove wpad-basic-mbedtls
# opkg install wpad-mbedtls
# reboot - ローミングに参加させたいアクセスポイントのWireless securityをこんな感じに設定する

- 同じくWLAN Roamingをこんな感じに。NAS IDは12桁の適当な文字列。他のアクセスポイントと重複していないこと。BSSIDからコロンを抜いて使うと話が早い。Mobility Domainは4桁の16進数で適当に。ローミングに参加する全てのアクセスポイントに同じ4桁の値を設定すること。Reassociation Deadlineはどこかのページに20000が良いって書いてあったのでそのまま反映させた。あとTime advertisementはどう効果があるのか確認しようがないが、おまじないで設定。


- DAWN本体とluciのアドオンを入れる
# opkg update
# opkg install dawn luci-app-dawn - luciにDAWNのページが追加されていることを確認する。おそらく稼働中のアクセスポイントの情報が表示されているはず。DAWNの設定は/etc/config/dawnでカスタマイズでき、その気になればかなりカリカリに追い込めるようだが、理解してやらないと逆効果だったりするので一旦保留。ツルシでも一応動く。

- スマホやPCを使ってローミングが動作することを確認する。方法は色々あるがお手軽なのは
- スマホアプリのWifi Analyzerを使ってアクセスポイントに「FT」の表示が立っているかどうかを見る。FTが出ていない場合は何か設定が間違っているので再チェック
- 同じくスマホアプリのWifimanをインストールして、アプリを開いて家の中をうろうろしてローミングを発生させる。成立しているとこんな感じで画面上にAP Roamingと出て教えてくれる。ローミングできない場合はDisconnected(切断)が挟まってから再接続になる

- OpenWrt上でFTが確実に動作していることを確認する手段は見つけられなかった。しばらく前に試したときは、ローミング発生時にOpenWrtのsyslogにFTなんたらと出て判断できたような記憶があるのだが、今は全く見当たらないので一旦諦めた
以上。とりあえず動かすだけなら結構シンプルだと思う。
2.4GHzアクセスポイントとの(疑似)バンドステアリング
- 2.4GHzのアクセスポイントをローミングの範囲内に含める場合も、設定手順は同じ。アクセスポイントごとに前述のとおりWLAN roamingを設定するだけである
- 5GHzと2.4GHzでは、DAWNのInitial scoreの初期値が異なる。5GHzは100、2.4GHzは80となっていて、5GHzのほうに接続が寄りやすくなっている。ご家庭の環境と好みに応じてスコアを変更して運用するべし。我が家では2.4GHzは予備的に動かしているが積極的につないでほしくないので、スコアを70に落として運用したところ、期待通りに過疎っている
補足情報など
- DAWNの設定パラメータの説明はこちらに
DAWN/CONFIGURE.md at master · berlin-open-wireless-lab/DAWN · GitHub
- デフォルトだとsyslogに大量の情報が吐かれ始める。おそらくhostapdとDAWN関連でログが埋め尽くされるはず
- 一応DAWNは/etc/config/dawn.confのloglevelを5(本当に重大なイベントだけ出力)にしたらそこそこ減ったような気がする
- hostapdのログスパムは以下のコマンドで止まった。予めhostapd_utilパッケージを入れる必要あり。インターフェース名は環境に合わせて変えること
# hostapd_cli -i (インターフェイス名) log_level Warning
wpadが再起動すると消えるので、自動適用させたい場合はスクリプト化して/etc/hotplug.d/iface/の下に置いておくといいらしい
FS#3218 - hostapd log_level ingored · Issue #8061 · openwrt/openwrt · GitHub
- OpenWrtではDAWNと同じようにステアリング制御を行う"usteer"というパッケージも利用できるのだが、当方で試した限りでは全然ローミングしてくれず役に立たない。何故なのか。DAWNがほぼデフォで普通に動いてるので追いかける気力が湧かず一旦保留
- 24.10以降ではDAWNの設定もluci上でできるようになった。さらにluci上で設定を変更した場合、同一ドメイン内で全てのAPに共通設定するべきパラメータは自動的に他のAPにも反映される挙動となっている。Global MetricやBand Metricの大半の項目は自動共有されるようである。なので例えばAPごとに別々のInitial Scoreを設定するということはできない、というか考えてみれば確かにそうしないと挙動がおかしなことになるのでナルホドという感じ
24.10でDAWNが連携しなくなる現象
OpenWrtのバージョンを最新の24.10に上げたところ、DAWNがAP間でシンクアップしなくなり、お互いを見つけられなくなった。フォーラムを漁ったところumdnsのバグに起因しているらしい。
一時的な回避策は、ルーター起動後にumdnsサービスを再起動すること。当方ではlocal.rcに以下のように書いて対処。
sleep 20
/etc/init.d/umdns restart
luci上でもSystem→Startup→Local Startupから設定できる。
メモリリークとおぼしき挙動
このページの方法でバンドステアリングを稼働させると、ゆっくりとだが各APでメモリ使用量が増えていく。Collectdのグラフで見ると上昇傾向が明らか。

放っておくとハングアップするか勝手にOSごと再起動することになる。根本的なトリガがどこにあるのかは分からないが、メモリを喰うのはwpadなので、早朝にwpadを再起動することで対処することにした。
50 3 * * 0 /etc/init.d/wpad restart
52 3 * * * hostapd_cli -i (インターフェース名) log_level Warning
54 3 * * * /etc/init.d/umdns restart
二行目はwpadを再起動するとログレベルが元に戻ってしまうことへの対処。三行目は不要っぽいがおまじないとして。また、もちろんOpenWrt自体を定期的に再起動する方法でも対処可能。お好みで。定期的にwpadを再起動させておきさえすれば、当家では長期間稼働させても一応安定している。
では皆さん良いローミングライフを。