我が家のネットワークはマンション回線のためグローバルIPがなく、ポート開放ができません。IPv6周りも宅内には振っていないので利用することができません。
そのため、HTTP/HTTPSの通信にはCloudflare Tunnelを利用しています。それ以外の通信や宅内のSubnetへのアクセスにはTailscaleを利用しています。
今回は自宅SubnetへのアクセスのためのTailscaleの冗長構成を構築します。
Tailscaleとは
Tailscaleは、WireGuardを基盤としたゼロトラストVPNです。各端末、サーバーにアプリを入れてSSOでログインするだけで、NAT越えも含めP2Pメッシュの安全なプライベートネットワークを自動構築できます。ユーザー数が3人までであれば無料で使えます。さらに1ユーザー100台までの接続が可能です。
基本的にはTailscaleのネットワークに属している端末同士がP2Pで通信を行いますが、Subnet Routerを有効にすればTailscaleのネットワークに属していない端末も接続できます。
Exit Nodeを有効にすれば端末のすべての通信がその端末経由で行えますので海外などからの日本経由のアクセスも可能になります。ソフトウェアの出来が大変よく非常に簡便にVPNネットワークを構築でき非常にオススメのサービスです。
無料プランでもGoogleやGitHubアカウント連携で利用できますし、Windows・macOS・Linux・iOS・Androidなど主要OSに対応しています。
現在の構成
自宅ではGL.iNet MT2500にTailscaleを入れて利用しています。宅内のサーバー用VLANのサブネットもSubnet Router経由でアクセスできるようにしています。(GL.iNetでデフォルト対応しているためGUIで設定可能です)
Tailscaleは動作負荷も低いため、このようなファンレスのルーターやラズパイで快適に利用可能です。しかし、先日利用していたところGL.iNet MT2500が落ちてしまっておりアクセス不可になっていました。
幸い、前述のCloudflare Tunnel経由で必要なリソースにはアクセスできたので問題なかったのですが今後に備えて冗長構成を組むことにしました。
冗長化構成

Set up high availability · Tailscale Docs
TailscaleのSubnet Routerの冗長構成は同じ設定でTailscaleを複数起動することで実現できます。
「Failover can take up to ~15 seconds after a primary connector is taken offline.」と記載がありますのでストリーミングの通信などで即時切り替わりなどは期待できなさそうですが、まぁ大抵の要素では何も困ることなさそうです。
GL.iNetでのTailscale構築

GL.iNet MT2500A (Brume 2) VPNセキュリティゲートウェイ2.5G WANギガビットLANポート インターネットセキュリティVPNカスケード接続OpenVPNとWireGuard対応ホームオフィスリモートワーク日本語設定画面(アルミニウム合金製ケース)
GL.iNetの製品はOpenWrtをベースに構築された小型トラベルルーターが多いです。外出先のホテルなどで接続するとルーター側でVPNを通して端末に通信を提供できることが売りです。
自宅で利用しているのはGL.iNet MT2500A (Brume 2)で、こちらはWi-Fi機能がない代わりに2.5Gbps通信が可能な製品です。1万円程度で購入でき低消費電力のサーバーとして利用可能です。
RAMも1GBあります。
ストレージは8GBで9割以上空いている状態ですので追加のソフトウェアをいくつか追加可能です。
本来はルーターなのですが、自宅ではTailscaleとDNSサーバーとしてのみ使っているためLAN側には端末を接続せずWANのみを利用しています。
TailscaleはGL.iNetではデフォルトでサポートされています。そのため、Web GUI画面でポチポチ有効化するだけで利用可能です。
「リモートアクセスWANを許可する」を有効にすることでWAN側のネットワークのSubnetをTailscaleのネットワークに追加できます。
ただGUI画面からTailscaleのすべての設定を行えるわけではないため、一部設定ではCLIから設定を行う必要があるかもしれません。(今のところSubnet以外の設定を有効にしていないためCLIから設定を行ったことはありません。)
あとは後述のTailscaleのWeb管理画面からSubnetを有効化します。
ProxmoxのLXCでのTailscale構築
インストール

Tailscale in LXC containers · Tailscale Docs
続いて何処のご家庭にもある仮想化基盤上でTailscaleを構築します。今回はProxmox上のLXCで構築します。
OSはUbuntu 24.04、CPU2コア、メモリ256MBで構築しました。ストレージはとりあえず16GBにしましたが、恐らく4GBもあれば十分です。
LXCを起動後、apt update && apt upgrade
を実行して更新を取っておきます。更新後はLXCを終了します。このままだとTailscaleを動かすには権限が足りませんのでconfに設定を追加します。
nano /etc/pve/lxc/{LXCのID}.conf
このconfに下記設定を末尾に追加します。
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
confを保存してLXCを起動します。続いて公式ドキュメントどおりTailscaleをインストールします。

Install Tailscale on Ubuntu 24.04 (noble) · Tailscale Docs
LXCのUbuntuはcurlが入っていないのでインストールしておきます。試したことはないですがLinux用のワンライナーが用意されていますので下記のコマンドでもcurlを入れていればインストールが通るかもしれません。
curl -fsSL https://tailscale.com/install.sh | sh
インストール後はtailscale up
でログインし、tailscale ip -4
でIPアドレスが割り当てられているか確認します。
Subnet Routerの設定

Subnet routers · Tailscale Docs
続いてSubnet Routerの設定を行います。
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
上記のconfを設定後に下記コマンドで共有したいSubnetを追加します。
tailscale set --advertise-routes=192.168.130.0/24
あとは後述のTailscaleのWeb管理画面からSubnetを有効化します。
Apple TVにTailscaleをインストール
ここまでは変な機材ばかりで設定していましたが、一般のご家庭にあるApple TVもTailscaleをインストールすることで利用可能です。

Apple TVでお手軽にVPNサーバーを構築
で解説していますので上記記事をご参照ください。
Webの管理画面でSubnetの有効化
先ほど同じApple TVでのTailscale設定記事でWeb管理画面の設定方法を記載していますので参考に設定してください。
動作確認
上記の設定を行い、実際に冗長構成が機能しているか確認します。まずTailscaleネットワーク経由でHLSの映像をセルラー回線接続のスマホで受信します。
そして通信量を確認して今回構築した中から恐らく繋がってそうなTailscaleを落とします。予想どおり通信が切れました。HLSを受信しているページを更新すると何事もなかったかのように再接続されました。 HLSの受信クライアントの実装の問題もあるかもしれませんが自動で映像受信の復帰はしませんでした。
というわけで無事冗長構成が組めてそうなのでこれで安心です。
Exit Nodeの方は自宅を出口にすることがあまりないのでApple TVの単体構成でいきます。
まとめ
TailscaleのSubnet Routerの冗長構成は同じ設定のTailscaleを複数立てるだけで実装可能で大変お手軽です。先日構築したCloudflare Tunnelも同じように複数立てるだけで冗長構成が組めましたし便利な時代です。