日: 2024年12月19日
ラズパイをトラベルルーター化計画(その1)
しばらく旅行の際にホテルで使うトラベルルーターとして MANGO を愛用してきました。色々設定して、自宅までの VPN を自動で張れるし、複数台あるスマホを個々にホテルの WiFi 等に接続設定しなくて良いというのがメリット。だったのですが、最近色々と調子が悪くて、代わりを検討していました。

自由度の高い OpenWRT なトラベルルーターで、もう少しパワフルなのは・・・となると、MANGO と同じ GL.iNet の GL-MT3000 あたりになりそうですが、結構お高い。コレなら Raspberry Pi で構築した方が安上がりかも・・・と思った途端、そういえば買ったはいいけど使ってない Raspberry Pi 4 が家に転がっていることを思い出しました(笑)。
ラズパイに OpenWRT を焼いて設定すれば立派なトラベルルーターになるかな・・・と思ったのですが、OpenWRT だとグアムで経験したような Captive Portal でハマる可能性が解決できなさそう。Captive Portal を解決するなら、ラズパイ内のブラウザで Portal にアクセスして認証突破すれば、ラズパイを踏み台にする子機たちは幸せなんじゃないかと考えました。そう、ラズパイ OS は CLI じゃなくて GUI なデスクトップ版にして、アクセスポイント機能を付与すればイイんじゃないかな⁉

そして、ラズパイでデスクトップが使えれば、HDMI ケーブルでホテルの TV に接続するとかすれば、フルブラウザで色々と作業できそう。そうなればノート PC を持って行かなくて良くなるんじゃないという目論見もたちます。MANGO より少し大きく、重たくなるけど、PC 不要にできるならメリットが大きい気がしてきました。考えれば考えるほど、ラズパイを旅行用端末にするのが良さそうだ。
・・・というわけで、色々と調べてみました。ここからは、ラズパイを旅行用端末(トラベルルーター機能付き)に仕上げるまでの手順や設計思想を、将来の自分が思い出せるようにするために記録しておきます。割と特殊条件もあるので、広く皆さんに知って欲しいということではなく、あくまで自分用の備忘録です。
ラズパイをアクセスポイント化する方法としては、4つくらい方法があるっぽい。
- Raspberry Pi OS じゃなくて OpenWRT を入れる
- Raspberry Pi OS に RaspAP を導入する
- hostapd と dnsmasq を使ってソフトウェアAPを構築する
- NetworkManager 機能を使ってソフトウェアAPを構築する
RaspAP は WEB アクセスでネットワーク設定とかできて便利そうと思ったので、早速設定してみようとしたのですが・・・インストールして再起動するとデスクトップが使えなくなってしまいました。どうやら、RaspAP は CLI 限定だったらしい。というわけで・・・コレも OpenWRT 同様に対象外。
最近の Raspberry Pi OS のデスクトップ版だとデフォルトで NetworkManager が有効化されているので、hostapd と dnsmasq で設定するよりも NetworkManager にお任せした方が色々楽そう。ってなワケで、NetworkManager を活用する方法を採用することにしました。
有線 LAN か WiFi を WAN 側(ホテル側)へのアクセスにしつつ、WiFi にソフトウェアアクセスポイントの機能を持たせる(AP化)には、まずは wlan0 というネットワーク IF を複製する感じで仮想 IF を作れば良い。というわけで、仮想 IF 作成までは RaspAP の利用や hostapd 利用と同等だと思って、ココとかココを参考に「iw dev」コマンドで wlan0 の MAC アドレスを調べて、「iw phy」でインタフェース作って「ip link set」でアドレス割り当てるってな感じで ap0 ってな仮想 IF を作ってみました。
実は NetworkManager の CLI コマンドである nmcli を使っても作成できるらしいとか、NetworkManager の GUI で「Advanced Options」→「Create Wireless Hotspot…」を選べば簡単に作れるというのは、ココとか見て後から知ったのです(笑)。
しかし、ココでハマりました。

こんな感じで、仮想 IF を作成するのは問題なくできたのですが・・・再起動すると作成した ap0 が消えるので、起動時に ap0 を生成すべく udev の設定をして再起動したら、うまく生成できません。

udev 設定後に再起動すると、結局 ap0 が存在しない状態になっていました。今一度この状態で ap0 を作成しようとすると、エラーになって作成できません。何度かロールバックして udev 設定もやり直したのですが、状況変わらず。

dmesg 見てみたら、ieee80211 phy0 がクラッシュしたというエラーが記録されています。どうやらこの辺りに何か問題がありそう。ということで、試行錯誤を実施したら、解決しました。実は、wlan0 を家の WiFi ルーターに接続する設定は、Raspberry Pi OS を MicroSD に書き込む際に Raspberry Pi Imager で事前設定しておいたのですが・・・コレが悪さしているようでした。

この WiFi 設定を一旦消して、別途 NetworkManager の GUI で接続を作成し直した状態(もしくは WiFi アクセスを消した状態)で udev 設定して再起動したら、うまく ap0 も作成できました。いやはや、最近の Raspberry Pi Imager は便利になったねぇ・・・なんて手を抜いて WiFi 設定をしたおかげでハマってしまいました。原因は謎ですが、WiFi 設定は事前設定しないで、起動した後にラズパイ上で設定すればハマらないっぽい。・・・たぶん。

仮想 IF となる ap0 がいつでも利用できる環境が整ったら、後は割と簡単です。NetworkManager の GUI で「Advanced Options」の「Edit Connections」で Device が ap0 で Mode が Hotspot になる Connection を作成すれば OK。

AP にアクセスするためのパスワードを設定して・・・

IP の割り当て設定(アドレス空間とサブネットマスクの設定)をしてやれば・・・

アクセスポイントの完成です。Connection Information を見れば、SSID とパスワードもチェックできるし、設定用の QR コードも表示されます。

これで WiFi で家のルーターに接続しつつ、AP として子機の接続を受け付ける状態ができあがりました。
仮想 IF を手動で作ったりするところも、実は NetworkManager の GUI を使えば簡単だったのかもしれませんが、一応コレでラズパイをホテルに繋げば手持ちのスマホたちはホテルのネットワークに個別に接続しなくても良い環境ができました。
次は、コレに SoftwtherVPN の設定をして、家まで VPN 接続できるようにすれば安心なトラベルルーターの完成ということになりますが・・・続きはまた別途。