メインコンテンツへスキップ
見出し画像

[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) の名前解決

    • 家族も使えるが、お互いの端末は見えないようにプライバシー保護

    利用者

    機能要件

    1. 外部から自宅 LAN へのアクセス: 192.168.x.0/24 の全デバイスに到達可能

    2. ユーザー間通信の遮断: プライバシー保護のため、家族の端末同士は通信不可

    3. Split DNS: Tailscale 接続時のみ、特定ドメインだけ自宅 DNS で解決

    4. 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 を使用

    • 自宅の内部ドメインだけ自宅 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. 設定の詳細

    ここからは具体的な設定方法を解説します。

    この記事が参加している募集

     
     
    元IBMのSalesforceITアーキテクト。 ITアーキテクチャの深淵から、日々の何気ない生き様まで、思考の軌跡を「毎日」綴っています。 座右の銘は「人生即是遊戯」。 家族とPerfume、オーディオを愛する私の遊び場が、あなたの日常のちょっとした刺激になれば幸いです。

    あなたへのおすすめ