自宅サーバーの弱点は、家の回線と運命共同体であることだ。光回線が死ねば、サーバーは無事でも外から見れば消滅する。しかもそういうときに限って、復旧作業のための調べ物もできない。
そこで、スマホを USB で挿してテザリングを ON にするだけで、サーバーがモバイル回線に切り替わる仕掛けを仕込んでおいた。サーバー側の操作は一切なし。ケーブルを抜けば勝手に元の回線に戻る。設定は netplan のファイル1枚、実質11行だ。
先日、自宅のルーターを入れ替える作業をしたとき、「WAN 設定の変更に失敗したら、復旧作業に使っている AI ごとネットから切り離される」という状況があった。そのときに保険として考えた仕組みを、そのまま常設にした形になる。
前提となる環境は、MacBook をシンクライアントにして開発を移した Ubuntu Server の自宅マシン。モニタもキーボードも繋いでいないヘッドレス運用なので、「障害時にコマンドを打たなくても切り替わる」ことを設計の要件にした。
仕組み: ルートメトリックに全部やらせる
Ubuntu Server(netplan + systemd-networkd)では、スマホの USB テザリングで生えるネットワークインターフェースは、定義がなければ IP を取りに行かない。挿しても何も起きないのはこのせいで、逆に言えば、定義さえ置いておけば全部自動になる。
/etc/netplan/90-usb-tether.yaml として以下を置く。
# スマホのUSBテザリングを挿すだけで使えるようにする緊急用設定
network:
version: 2
ethernets:
usb-tether:
match:
name: "usb*"
dhcp4: true
optional: true
dhcp4-overrides:
route-metric: 50
usb-tether-enx:
match:
name: "enx*"
dhcp4: true
optional: true
dhcp4-overrides:
route-metric: 50
置いたら sudo chmod 600 /etc/netplan/90-usb-tether.yaml して sudo netplan apply。
ポイントは3つある。
1. インターフェース名はワイルドカードで待ち受ける
テザリングのインターフェース名は環境によって usb0 だったり、MAC アドレス由来の enx… だったりする(うちの Pixel は enxa2f693904881 だった)。usb* と enx* の両方をマッチさせておけば、どちらで生えても拾える。
2. 切替は route-metric の大小だけで起きる
有線 LAN(DHCP)のデフォルトルートはメトリック 100 で入る。テザリング側を 50 にしておくと、テザリング接続中はカーネルがスマホ側のルートを優先する。つまり「切り替え」という処理はどこにも存在せず、ルートが2本並んだときに数字の小さい方が勝つだけだ。抜けばルートごと消えて、有線の1本に戻る。切替も復帰も、誰も何も操作しない。
3. optional: true を忘れない
これがないと、起動時に「テザリングが繋がっていない」状態を異常とみなして、ブートがネットワーク待ちでもたつくことがある。普段は存在しないインターフェースなので、必ず optional にする。
スマホ側の手順(Pixel の場合)
- データ通信対応の USB ケーブルでサーバーに接続する
- 設定 → ネットワークとインターネット → アクセスポイントとテザリング → USB テザリング を ON
トグルはケーブルを挿すまでグレーアウトしている。挿しているのにグレーのままなら、ケーブルが充電専用の可能性が高い(データ線が入っていない安価なケーブルは意外と多い)。挿した後に出る「USB で充電中」の通知をタップして、用途に「USB テザリング」を選んでも同じだ。
iPhone の場合は「インターネット共有」で同じことができるが、Linux 側に usbmuxd パッケージが必要になる。事前に入れておくこと。
検証: 本当に切り替わって、本当に戻るのか
Pixel 10 Pro で実際に試した。テザリングを ON にすると、数秒でこうなる。
$ ip route
default via 10.243.77.54 dev enxa2f693904881 proto dhcp metric 50
default via 192.168.1.1 dev enp9s0 proto dhcp metric 100
10.243.77.0/24 dev enxa2f693904881 proto kernel scope link metric 50
192.168.1.0/24 dev enp9s0 proto kernel scope link metric 100
デフォルトルートが2本並び、メトリック 50 のテザリング側が勝っている。出口の IP を確認すると、光回線のものからモバイル回線(IIJmio)のものに変わっていた。
ここで大事なのは4行目で、LAN への経路は有線側にそのまま残っている。つまり「インターネットはスマホ経由、家の中の機器へは有線」という状態が同時に成立する。回線障害の原因がルーターにある場合、スマホ回線で調べ物や AI との作業をしながら、LAN 経由でルーターの復旧操作をすることができる。回線が死ぬと復旧手段も一緒に死ぬ、という自宅サーバーの一番嫌な構造がここで切れる。
テザリングを OFF にすると、スマホ側のルートが消えて元の1本に戻る。出口 IP も光回線のものに復帰。ここまで含めて何も操作していない。
副次効果: 外からのアクセスも復活する
このサーバーへは普段 Tailscale 経由で SSH している。サーバーがスマホ回線で外に出られるようになると、tailscaled も勝手に再接続するので、外出先の端末からの SSH も復活する。「家の回線が死んだので、家族にスマホを挿してもらって、外から復旧作業をする」というシナリオまで成立することになる。
さらに言えば、挿しているスマホ自身から SSH ターミナルアプリで繋げば、1台のスマホが回線と操作端末を兼ねる。停電明けにルーターだけ死んでいた、というような場面では、これが最短の復旧経路になると思う。
注意点
- モバイルデータを食う。切り替わっている間、サーバーの通信は全部スマホ経由になる。自動バックアップや OS アップデートが走ると数GB単位で消費し得るので、緊急用と割り切って、復旧したら抜くこと
enx*は USB イーサネットアダプタ全般にマッチする。USB の有線 NIC を常用しているマシンでは、この match をテザリング端末の MAC 決め打ちにするなど調整が要る- サーバーに物理的に触れる必要はある。完全リモートの障害対応には使えない(それは回線の二重化の話になる)
まとめ
- netplan に
usb*/enx*を route-metric 50 で定義しておくだけで、USB テザリングが「挿すだけの予備回線」になる - 切替も復帰もルートメトリックの大小で自動的に起きる。障害時にサーバーを操作する必要がない
- LAN への経路は残るので、スマホ回線で作業しながらルーターの復旧操作ができる
- Tailscale も再接続されるので、外からのアクセスも復活する
- ケーブルはデータ線入りのものを。テザリングのトグルは挿すまでグレーアウトが正常
設定11行の保険としては、効果が大きすぎるくらいだと思う。