Tailscale:ゼロコンフィグで実現するメッシュVPN

Tailscaleは、元Googleエンジニアが2019年に設立したVPNサービス。従来のVPNとは根本的に異なるアーキテクチャで、「インストールするだけで繋がる」という驚異的な手軽さを実現している。2022年には1億ドルを調達しユニコーン企業となった。

この記事では、Tailscaleの技術的な仕組みと設計思想を深掘りする。

設計思想:なぜTailscaleが生まれたか

従来のVPNには根本的な問題があった。

  1. 設定が複雑:ポート開放、証明書管理、ルーティング設定...専門知識が必要
  2. 中央集権的:すべての通信がVPNサーバーを経由し、ボトルネックになる
  3. 境界防御モデル:「内側は安全」という前提が現代のセキュリティ要件に合わない

Tailscaleはこれらを根本から解決するために、メッシュネットワークゼロトラストという2つの概念を軸に設計された。


アーキテクチャ概要

tailscale-architecture.png

Tailscaleのアーキテクチャは3つの層で構成される。

1. コントロールプレーン(Coordination Server)

Tailscaleの「頭脳」。ただし、実際のトラフィックは一切流れない

役割:

重要な点:

2. DERPリレー層

DERP = Designated Encrypted Relay for Packets

P2P接続が確立できない場合のフォールバック。世界中に配置されたリレーサーバーがトラフィックを中継する。

特徴:

3. データプレーン(WireGuard Mesh)

実際のトラフィックが流れる層。各デバイスがWireGuardトンネルで直接接続する。

特徴:


ハブ&スポーク vs メッシュ

tailscale-hub-vs-mesh.png

従来型:ハブ&スポーク

       [VPNサーバー]  ← 単一障害点 & ボトルネック
        /   |   \
       A    B    C

Tailscale:フルメッシュ

    A ←――――→ B
    ↑ ╲    ╱ ↑
    |   ╲╱   |
    |   ╱╲   |
    ↓ ╱    ╲ ↓
    C ←――――→ D

WireGuard:Tailscaleの基盤技術

TailscaleはWireGuardプロトコルの上に構築されている。WireGuardを選んだ理由を理解するために、他のVPNプロトコルと比較する。

VPNプロトコル比較

特性 WireGuard OpenVPN IPsec
コード行数 ~4,000行 ~100,000行 ~400,000行
暗号化 ChaCha20, Curve25519 AES-256 (選択可) 複数対応
速度 最速 中程度 速い
設定の複雑さ シンプル 複雑 非常に複雑
監査しやすさ 容易 困難 非常に困難
カーネル統合 あり なし あり

WireGuardの設計哲学

  1. シンプルさ:コード量が少ない = バグが少ない = セキュリティが高い
  2. モダンな暗号:ChaCha20-Poly1305、Curve25519など最新のアルゴリズム
  3. カーネルレベル動作:オーバーヘッド最小化
  4. Cryptokey Routing:公開鍵がそのままルーティングテーブルになる

なぜ素のWireGuardではダメなのか

WireGuardは優れたプロトコルだが、以下の課題がある:

Tailscaleはこれらを自動化し、WireGuardの「面倒な部分」を隠蔽している。


NAT越えの魔法

tailscale-nat-traversal.png

Tailscaleの最も革新的な部分。なぜ「ポート開放なし」で接続できるのかを解説する。

NATの問題

ほとんどのデバイスはNAT(Network Address Translation)の背後にいる。NATは外部からの接続を遮断するため、本来はP2P通信ができない。

[デバイスA: 192.168.1.10] → [NAT A: 203.0.113.1:12345] → インターネット
[デバイスB: 192.168.2.20] → [NAT B: 198.51.100.1:54321] → インターネット

AとBは互いのプライベートIP(192.168.x.x)を知っていても直接通信できない。

STUN:自分の公開アドレスを知る

STUN(Session Traversal Utilities for NAT)サーバーに接続すると、自分のNATが外部にどのようなアドレスを公開しているかがわかる。

デバイスA → STUNサーバー: 「私の公開アドレスは?」
STUNサーバー → デバイスA: 「203.0.113.1:12345 だよ」

UDPホールパンチング

NATの特性を利用したテクニック。NATは「内側から外側への通信」を許可し、その応答を通すためにルールを作成する。

手順:

  1. AとBが同時にコーディネーションサーバーから相手の公開アドレスを取得
  2. AがBに、BがAに同時にパケットを送信
  3. 各NATは「自分から送ったパケットの応答」と認識してルールを作成
  4. 以降、直接通信が可能になる
時刻T: A → B (Bに届かないが、NAT Aに穴が開く)
時刻T: B → A (Aに届かないが、NAT Bに穴が開く)
時刻T+1: A → B (NAT Bの穴を通過、Bに到達!)
時刻T+1: B → A (NAT Aの穴を通過、Aに到達!)

ICE:最適な経路を選択

ICE(Interactive Connectivity Establishment)は、複数の接続方法を同時に試し、最も良いものを選ぶアルゴリズム。

優先順位:

  1. 直接接続(同一LAN内)
  2. IPv6直接接続
  3. UDPホールパンチング
  4. DERPリレー(最後の手段)

難敵:Symmetric NAT

一部のNAT(特に企業のファイアウォール)は「Symmetric NAT」と呼ばれる厳格な方式を使う。これは接続先ごとに異なるポートを割り当てるため、ホールパンチングが不可能。

このような場合、TailscaleはDERPリレーを使用する。遅くはなるが、接続は確実に確立される

成功率

Tailscaleの公開データによると:


ゼロトラスト:「信頼しない」セキュリティモデル

tailscale-zero-trust.png

従来モデル:城壁と堀

        [インターネット] ← 危険!
              ↓
        [ファイアウォール] ← ここで防御
              ↓
        [社内ネットワーク] ← 安全...のはず

問題点:

ゼロトラストモデル:Never Trust, Always Verify

[デバイスA] ←認証→ [デバイスB]
     ↑                ↑
     認証              認証
     ↓                ↓
[デバイスC] ←認証→ [デバイスD]

原則:

TailscaleのACL(Access Control List)

Tailscaleはデフォルトですべての接続を拒否し、明示的に許可されたものだけを通す。

{
  "acls": [
    // 開発者は開発サーバーにアクセス可能
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:dev-server:*"]
    },
    // 本番サーバーは管理者のみ
    {
      "action": "accept",
      "src": ["group:admins"],
      "dst": ["tag:prod-server:*"]
    }
  ]
}

ACLの特徴:

Grants:より高度なアクセス制御

Tailscaleの新しいアクセス制御システム。ACLより細かい制御が可能。


MagicDNS:IPアドレスからの解放

仕組み

MagicDNSは各デバイス上でローカルに動作するDNSサーバー。

[あなたのデバイス]
      ↓ DNSクエリ
[100.100.100.100] ← Tailscaleのローカルリゾルバ
      ↓
  ┌───┴───┐
  ↓       ↓
tailnet内  外部ドメイン
(ローカル解決) (上流DNSへ転送)

特徴:

使用例

# IPアドレスを覚える必要なし
ssh my-server

# こんなことも可能
ping raspberry-pi
curl http://nas:8080

Tailscaleの独自機能

Tailscale SSH

SSH鍵の管理が不要になる革命的機能。

従来:

  1. SSH鍵ペア生成
  2. 公開鍵をサーバーにコピー
  3. 鍵のローテーション管理
  4. 複数デバイス間での鍵同期

Tailscale SSH:

  1. tailscale up --ssh を実行
  2. 終わり

Tailscaleの認証でSSH接続を制御するため、鍵管理が不要になる。

Taildrop

デバイス間のファイル送信機能。

# CLIから
tailscale file cp ./document.pdf my-phone:

# または右クリック → "Send with Tailscale"

E2E暗号化されたP2P転送なので高速かつ安全。

Exit Node

特定のデバイス経由でインターネットに出る機能。

ユースケース:

# Exit Nodeを有効化(サーバー側)
tailscale up --advertise-exit-node

# Exit Nodeを使用(クライアント側)
tailscale up --exit-node=my-home-server

Subnet Router

Tailscaleをインストールできないデバイス(IoT機器、レガシーシステム)へのアクセスを可能にする。

# 192.168.1.0/24 のサブネットを公開
tailscale up --advertise-routes=192.168.1.0/24

料金プラン

プラン 料金 ユーザー デバイス 用途
Personal 無料 3 100 個人利用
Personal Plus $5/月 6 100 家族・小規模
Starter $6/ユーザー/月 - 100 小規模チーム
Premium $18/ユーザー/月 - 100 企業向け
Enterprise 要問合せ - - 大規模組織

個人利用なら無料プランで十分すぎる。 100デバイスまで対応。


制限と代替手段

Tailscaleの制限

Headscale:オープンソース代替

Tailscaleのコーディネーションサーバーをセルフホストしたい場合、HeadscaleというOSS実装がある。


まとめ

Tailscaleは「VPNの民主化」を実現した。

技術的革新:

設計思想:

専門知識なしで、エンタープライズレベルのセキュアなネットワークが構築できる。個人の自宅サーバー接続から、企業のインフラ管理まで、幅広いユースケースに対応する。


抽出された概念

この記事から以下の一般概念をnotesに抽出した。

既存ノート(最小権限の原則ポータビリティ)も参照。


参考