自宅サーバーの弱点は、家の回線と運命共同体であることだ。光回線が死ねば、サーバーは無事でも外から見れば消滅する。しかもそういうときに限って、復旧作業のための調べ物もできない。

そこで、スマホを 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 の場合)

  1. データ通信対応の USB ケーブルでサーバーに接続する
  2. 設定 → ネットワークとインターネット → アクセスポイントとテザリング → 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行の保険としては、効果が大きすぎるくらいだと思う。