
[Tailscale] Subnet Router で自宅 LAN に VPN 接続する完全ガイド
外出先から自宅の NAS やサーバーにアクセスしたい。でも VPN の設定は難しい...。VPN ルータもない…。そんな悩みを解決するのが Tailscale です。
本記事では、Tailscale の Subnet Router 機能を使って、外部から自宅 LAN 全体にアクセスできる環境を Docker で構築する方法を解説します。
1. 要件の概要
実現したいこと
外出先のスマホ・PC から自宅 LAN (192.168.x.x) に VPN 接続
自宅の DNS サーバーを使った内部ドメイン (*.example.local) の名前解決
家族も使えるが、お互いの端末は見えないようにプライバシー保護
利用者
機能要件
外部から自宅 LAN へのアクセス: 192.168.x.0/24 の全デバイスに到達可能
ユーザー間通信の遮断: プライバシー保護のため、家族の端末同士は通信不可
Split DNS: Tailscale 接続時のみ、特定ドメインだけ自宅 DNS で解決
Subnet Router のみ: Exit Node(全トラフィック転送)は不要
技術的決定事項
2. アーキテクチャの概要
全体構成図

通信フロー

コンポーネントの役割
SNAT(送信元アドレス変換)の重要性
Tailscale はデフォルトで SNAT を有効化 (--snat-subnet-routes=true) しています。これは Linux の iptables における MASQUERADE(IP マスカレード / NAPT)と同等の動作です。
SNAT 有効を推奨します。LAN 側の機器に追加設定が不要になります。
3. 設計の注意ポイント
3.1 Split DNS の理解
Split DNS とは、特定のドメインだけを特定の DNS サーバーで解決する仕組みです。

メリット:
通常のインターネットアクセスは高速なローカル DNS を使用
自宅の内部ドメインだけ自宅 DNS で解決
VPN 接続時もインターネット速度に影響なし
3.2 UFW と iptables の複雑な関係
これが最大の落とし穴です。 Docker を使う環境では、以下の複数のファイアウォール層が存在します:

注意が必要な設定
3.3 DNS サーバーの ACL 設定
Unbound などの DNS サーバーを使っている場合、Tailscale CGNAT (100.64.0.0/10) からのクエリを許可する必要があります。
Split DNS では、Tailscale クライアントが 直接 DNS サーバーにクエリを送信します。このとき、送信元 IP は CGNAT アドレス (100.x.x.x) になります。
3.4 Auth Key の管理
重要: Docker の Named Volume で状態を永続化すれば、コンテナ再起動時に再認証は不要です。Auth Key が必要になるのは以下の場合のみ:
初回デプロイ時
Named Volume を削除した場合
Tailscale Admin Console からデバイスを削除した場合
4. 設定の詳細
ここからは具体的な設定方法を解説します。