NordBastionのシロクマのマスコットが、薄暗い北欧の石造りの広間に立ち、彫刻の施されたルーン文字の要石オベリスクに片方の前足を置いている。頭上にはシアン色に光るホログラムの鍵の輪が浮かび、ノートPC・スマートフォン・タブレット・サーバータワー・地球儀という5つの光るデバイスのグリフが、明るいシアンのメッシュで頭上に直接つながり合っている。輪から各デバイスへとかすかな点線の鍵のラインが降り注ぎ、背後にはサーバーラックと、オーロラに照らされたアーチ型の窓がある。
ハウツー · プライベートネットワーキング·読了19分 · ハンズオン50分

自分だけのコントロールサーバー。
握っておく価値があるのは、地図そのものだ。

メッシュVPNには鍵を配る誰かが必要だ。Tailscaleではその誰かは一企業であり、素のWireGuardではあなた自身が、手作業で、永遠に担うことになる。Headscaleは3つ目の答えだ——同じオープンソースクライアントが、匿名で借りたサーバー上のコーディネーションサーバーと話す。デバイスの地図もアクセスルールもフォールバックリレーもすべて自分のものであるテイルネットへの、6つのステップ——Caddyの背後に置いたHeadscale、書き出されたACL、自前のリゾルバーを指すMagicDNS、サブネットルーター、エグジットノード、そして組み込みのDERP。サーバーの費用は月額$3.90。Debian 12で検証済み。

6つのステップ
  1. 01

    選ぶ

    WireGuard、Tailscale、Headscale

  2. 02

    プロビジョニング

    起動前に固定する3つの名前

  3. 03

    デプロイ

    Headscale、Caddy、設定ファイル1つ

  4. 04

    登録

    ユーザー、事前認証キー、クライアント

  5. 05

    ルーティング

    サブネット、エグジットノード、ACL

  6. 06

    Keep

    DERP、バックアップ、アップグレード

始める前に · コントロールプレーンとは何か

誰もトラフィックを読むことはできない。それでも、誰かが地図を握っている。

WireGuardは意図的に未完成だ。2つの公開鍵の間を結ぶ、小さく、速く、監査可能なトンネルであり、それらの鍵がどうやって互いに到達するかについては一切の考えを持たない。この欠落こそが、このプロトコルがこれほど優れている理由だ——そして同時に、15台のデバイスからなるWireGuardネットワークがスプレッドシートになる理由でもある。すべてのピアが、他のすべてのピアの公開鍵と現在のアドレスを必要とし、オフィスと電車とホテルの間を移動するノートPCが1台あるだけで、そのスプレッドシートの一部が無効になる。

メッシュVPNはその特定の問題に対する答えであり、その形を正確に言葉にしておく価値がある——何を信頼することになるのかを決めるのはその形だからだ。データプレーンはそれまでとまったく変わらない。各デバイスはローカルで自分の鍵ペアを生成し、秘密鍵の側は手元に残したまま、ピアに対して直接暗号化する。その上に乗るのがコントロールプレーンだ——公開鍵とエンドポイントを集め、各デバイスに話してよいピアの一覧を渡し、意地の悪いルーターの裏にいる2台のデバイスが互いを見つけるのを助ける、小さなサービスである。このサービスが秘密鍵を持つことは決してなく、平文のバイトを目にすることも決してない。

コントロールサーバーが握っているのは地図であり、その地図は、たいていの人が思っているよりもずっと興味深い。すべてのデバイス名、すべてのユーザー名。すべての公開鍵。各デバイスが今まさに接続してきている公開アドレス——これは、あなたのノートPCとスマートフォンが物理的にどこにあるかを示す、生きた記録である。各デバイスが接続し切断する時刻——これはあなたの1日を描き出す。そして誰が何に到達してよいかを決めるポリシー——これはあなたの組織を描き出す。そのどれもが、誰かの悪意を必要とするわけではない。それは単に、コーディネーションサーバーの本来の役割にすぎない。

メタデータよりもさらに重要な性質が、もう一つある。コントロールプレーンは鍵を配布するものであり、だからこそ鍵を追加できるものでもある。侵害されるか強制されたコントロールサーバーは、あなたのデバイスに対して、新しいマシンがネットワークの正当なメンバーだと伝えることができる——そしてあなたのデバイスは、まさに作られた通りのことをして、そのマシンに対して暗号化を行うだろう。Tailscaleはこれを真剣に受け止めており、これに対抗する署名機能を作り込んでいる。セルフホスティングは同じ問題を逆方向から解決する——それを行いうる当事者が、あなた自身になるということだ。4つの構成と、それぞれが実際に何を差し出すことになるかは次のとおりだ。

項目 手動設定のWireGuard Tailscale、ホスト型 自分のVPS上のHeadscale Headscale + 自前のDERP
ペイロードを読めるのは誰かピア以外の誰でもないピア以外の誰でもないピア以外の誰でもないピア以外の誰でもない
デバイスの地図を握るのは誰かあなた自身が、1つのテキストファイルの中に一企業が、その法域の下であなた自身が、自分のVPS上にあなた自身が、自分のVPS上に
デバイスの接続元を見ているのは誰かピア自身だけコーディネーションサーバーを、絶え間なく自分のサーバーを、絶え間なく自分のサーバーを、絶え間なく
直接接続が失敗したとき、誰が中継するか誰も届かない——リンクはただ失敗するだけプロバイダーのリレー網既定のままなら、いまもプロバイダーのリレー自分のリレーを、自分のデータセンターに
20台目のデバイスを追加する19回の設定変更コマンド1つコマンド1つコマンド1つ
選ぶ場面デバイス数は少なく、移動するものは一つもない運用の手間ゼロを望み、地図は明け渡してもよい場合地図が欲しく、小さなサーバーを1台運用できる場合地図だけでなく、フォールバック経路も欲しい場合

1つ目の列は当て馬ではない。固定された少数のサーバーだけが相手なら、手書きのWireGuardは工学的に見て本当に優れた答えであり、パッチを当てるサービスも1つ減る。このガイドが扱うのは、スプレッドシートが笑い事では済まなくなる地点についてだ。

ステップ01 · 選ぶ

コントロールプレーンは必要か。移動するデバイスの数を数えてみる。

「自分のマシン同士を、プライベートに到達させたい」という要望に対する正直な答えは3つあり、このガイドはそのうちの1つでしかない。素のWireGuardが最小の答えだ——カーネルモジュール、ピアごとに1つの設定ファイル、インターフェース以外にデーモンはなく、OS以外に最新に保つべきものもない。デバイスが固定アドレスを持つサーバーで、片手で数えられる台数しかないなら、ここで読むのをやめてWireGuardガイドを読んでほしい。そのほうがソフトウェアは少なく、壊れうるものの一覧も短く済む。

Tailscale は最大手だ。内部は同じWireGuardに、コーディネーションサービス、ほぼどんな環境の裏側からでも機能するNATトラバーサル、複数の大陸にまたがるリレー網、Webコンソール、シングルサインオン、そしてサポート契約が加わる。純粋に優れたソフトウェアであり、無料枠だけで家庭用途は十分にまかなえる。対価は金銭ではない——所有するすべてのデバイスの地図と、それぞれがどこから接続しているかの記録が、一企業のデータベースに置かれるということだ。

Headscale は3つ目の答えであり、どちらよりも狭い範囲を扱う——コーディネーションサーバーをオープンソースで再実装したもので、あなた自身が運用し、同じ公式クライアントが話しかける相手になる。自動化とNATトラバーサルはそのまま手に入るが、その代わりに小さなサービスの運用、部分的な機能セット、そして読み込みが必要なアップグレードを背負うことになる。それを無料だと言い張るべきではない。手に入るのはただ一つ、しかしこのサイトが気にかけているのはまさにそれだ——他の誰も地図を握っていないということ。

デバイス5台という分岐点

手動のWireGuard設定は、保有台数の2乗で膨らんでいく——ピア4台なら6本のリンク、10台なら45本、20台なら190本だ。加わるネットワークのたびにエンドポイントが変わる、移動するノートPCを1台加えれば、保守はもう「たまに」では済まなくなる。実際の分岐点はデバイス5台前後、あるいは毎日移動する最初のデバイスが現れたとき、あるいは「誰もが何にでも到達できる」という形では表現できない最初のアクセスルールが必要になったときだ。

後回しにせず今のうちに決めておくべきことがもう一つある。何をインストールするかが変わってくるからだ——このネットワークは自分専用なのか、それとも他の人も加わるのか。1人用のテイルネットなら、内部を全面的に開けっぱなしにしていても何も悪いことは起きない。同僚や契約社員、家族が加わるテイルネットには、最初の週から書き出されたアクセスルールが必要になる——ステップ05——そして全員が1つのログインを共有するのではなく、ユーザーを分けておく必要がある。それを最初に決めておくコストは段落1つ分だが、あとから作り直すコストは午後まる1日分だ。

ステップ02 · プロビジョニング

初回起動の前に決める、3つの名前。どれもあとから変えるのは難しい。

まずサーバーを注文する。パネルでは注文 → VPS → Sentinelと進み、イメージはDebian 12、地図を置きたい拠点を選ぶ——ヘルシンキ、ストックホルム、オスロ、レイキャビクのいずれか。アカウント開設にメールアドレスは不要で、請求はMonero、Bitcoin、Lightning、その他対応する資産で決済できる。ステップ06のリレーも同じサーバーで動かすつもりなら、デバイスの大多数に最も近い拠点を選ぶこと——リレーまでの遅延は、そこを通るすべての接続の遅延になる。

そのあと、最初の1時間の強化チェックリストを実行する——ポートを変更した上での鍵認証のみのSSH、無人アップグレード、既定拒否のファイアウォール。以下はすべて、まだ他の誰のものでもないサーバーであることを前提としている。そしてこのサーバーは、たいていのものよりも価値が大きい——所有するすべてのデバイス上で、どの鍵を信頼するかを決めるマシンだからだ。

何かが登録される前に、この3つを決めておく

どのデバイスも、参加した瞬間にこの3つすべてを自身の状態に焼き込む。だからあとで1つでも変えるとなれば、保有デバイス全体を手作業で再登録するはめになる。1つ目: コントロールサーバーのURL——すべてのクライアントが接続しにいく、スキームとホスト名を含む正確な公開HTTPSアドレス。2つ目: テイルネットのDNSサフィックス——MagicDNSが内部で応答するドメイン。これは自分が管理するものでなければならず、かつコントロールサーバー自身のホスト名の親や子であってはならない。これが初回起動時に最もよくある失敗だ。3つ目: テイルネットが払い出すアドレスレンジ——慣例ではIPv4にキャリアグレードNATブロックの100.64.0.0/10、IPv6にユニークローカルの/48を使う。すでに使っているネットワークと衝突しない限り、既定値のままにしておく。

実例と、そのまま真似てよい形を示す。コントロールサーバーは vpn.example.com で応答し、テイルネットのサフィックスは ts.example.com、レンジは既定値のままとする。サフィックスがコントロールのホスト名の親ではなく、兄弟にあたる点に注目してほしい——vpn.example.com と ts.example.com は登録可能ドメインを共有しているが、どちらも相手を包含していない。Aレコード——IPv6経由でも到達させたいならAAAAレコードも——をサーバーに向け、始める前に伝播させておくこと。リバースプロキシは初回起動時にその名前の証明書を取得しようとするからだ。

そのあと、まだ何も待ち受けていないうちにファイアウォールルールを書いておく。コントロールサーバーは、必然的に公開されたHTTPSエンドポイントになる——どんなネットワーク上のどんなデバイスからも到達できる必要があるからだ。UDPポートが必要になるのは、ステップ06で自前のリレーを運用するつもりがある場合だけだが、あとになってその不在をデバッグするより、今のうちに開けておくほうが楽だ。

ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved
ufw allow 80/tcp                     # ACME HTTP-01 challenge
ufw allow 443/tcp                    # the control server, and DERP over HTTPS
ufw allow 3478/udp                   # STUN, only if you run your own relay
ufw enable
ufw status numbered

ディストリビューションのパッケージではなく、公式リポジトリからDockerをインストールする。そうすればCompose v2が入り、最新の状態を保てる。次に、バックアップする価値のあるものすべてを収める2つのディレクトリを作る——設定用に1つ、状態用に1つ——そして、それ以外のものをそこに置きたくなる衝動は抑えること。

curl -fsSL https://get.docker.com | sh
docker compose version

install -d -m 0750 /srv/headscale/config
install -d -m 0750 /srv/headscale/data
cd /srv/headscale
ステップ03 · デプロイ

コンテナ2つと、ファイル1つ。バージョンは、常に固定する。

HeadscaleとCaddy、それ以外は何もない。Headscaleは Docker ネットワーク内部で素のHTTPを待ち受け、CaddyがTLSを終端し、初回起動時に証明書を取得し、頼まれなくても更新する。メトリクスのリスナーはlocalhostにとどめておく——これは内部向けのデバッグ用の口であり、公開すべきものではないからだ。

ファイルの前にルールが1つある。イメージは正確なバージョンに固定すること。Headscaleは1.0未満のソフトウェアであり、マイナーリリースをまたいで設定キーとCLIサブコマンドの名前を一度ならず変えてきた。フローティングタグのままだと、ありふれたコンテナの再起動が、他のすべてに到達するための役目を担うサービスの障害に変わってしまう。

/srv/headscale/docker-compose.yml

services:
  headscale:
    image: docker.io/headscale/headscale:0.26            # pin it; never :latest
    container_name: headscale
    command: serve
    volumes:
      - ./config:/etc/headscale
      - ./data:/var/lib/headscale
    ports:
      - "3478:3478/udp"                                  # STUN, for your own DERP
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    restart: unless-stopped

volumes:
  caddy_data:

/srv/headscale/Caddyfile

vpn.example.com {
    reverse_proxy headscale:8080
}

プロキシの設定はこれで全部だ。Caddyは指示しなくてもHTTP/2を話し、長時間持続する接続をアップグレードする。これが重要なのは、すべてのクライアントがマップの更新を受け取るために接続を1本開いたままにしているからだ。固定したバージョンに同梱されているサンプル設定ファイルを取り、ゼロから書くのではなくそれを編集すること——ファイル自体は長いが、その大半は妥当な既定値であり、重要なキーは次のとおりだ。

/srv/headscale/config/config.yaml — the lines that matter

server_url: https://vpn.example.com          # exactly what clients will dial
listen_addr: 0.0.0.0:8080                    # inside the Docker network only
metrics_listen_addr: 127.0.0.1:9090          # debug surface, keep it local

prefixes:
  v4: 100.64.0.0/10
  v6: fd7a:115c:a1e0::/48

noise:
  private_key_path: /var/lib/headscale/noise_private.key

database:
  type: sqlite                               # postgres for a large fleet
  sqlite:
    path: /var/lib/headscale/db.sqlite

dns:
  magic_dns: true
  base_domain: ts.example.com                # NOT a parent or child of server_url
  nameservers:
    global:
      - 1.1.1.1                              # replaced by your own in step 05

立ち上げたら、推測ではなくログを読むこと。証明書を取得できない初回起動や、サーバーのホスト名と重なるという理由でDNSサフィックスを拒否する初回起動は、そのことをはっきりと告げたうえで停止する。

docker compose up -d
docker compose logs -f headscale

# From your laptop — a control server that is up answers this:
curl -s https://vpn.example.com/health

初回起動時に、秘密鍵データが /srv/headscale/data に生成される。1台のデバイスも登録する前に、今すぐ安全な場所へコピーしておき、最初の登録が終わったあとにもう一度コピーすること。この鍵を失えば、すべてのデバイスが信頼してきたサーバーを拒否するようになり、直す方法は全台を手作業で再登録する以外にない。ステップ06では、このコピーを本物のバックアップへと仕立てる。

ステップ04 · 登録

ユーザー、キー、クライアント。そのあとで、directになったかを確認する。

headscale コマンドはコンテナの中にあるので、管理操作はすべて docker exec を通して行うことになる。まずユーザーを作成すること——ユーザーとはデバイスの所有者であり、アクセスルールが参照する単位でもあるので、マシンの名前ではなく人物や役割の名前を付けること。

hs() { docker exec -it headscale headscale "$@"; }

hs users create alice
hs users list                      # note the numeric id — newer releases want it

# A single-use key that expires in an hour is the right default.
hs preauthkeys create --user 1 --expiration 1h

そのあと、デバイス上で公式クライアントを立ち上げ、既定のサーバーではなく自分のサーバーを指すようにする。これは正式にサポートされたフラグであり、裏技ではない——クライアントはオープンソースで、ログインサーバーは単なるパラメータの一つである。

# On the device (Debian/Ubuntu shown; every platform has an equivalent):
curl -fsSL https://tailscale.com/install.sh | sh

sudo tailscale up \
  --login-server https://vpn.example.com \
  --auth-key <the-key-you-just-created>

tailscale status
tailscale ip -4

事前認証キーがない場合、クライアントは代わりにURLを表示する。そこにアクセスすると、サーバー側で実行する登録コマンドが表示される——これは対話的な経路であり、目の前にあるデバイスには扱いやすい。どちらの方法でも、祝う前に2台目のデバイスをやっておくこと——1台だけのメッシュは何も証明しない。テイルネットのアドレスでpingを打ち、そのうえでstatusの出力を注意深く読むこと。

hs nodes list

# On a client, the word after the peer name is the one that matters:
tailscale status
#   100.64.0.2  laptop  alice  linux  active; direct 203.0.113.9:41641
#                                              ^^^^^^ direct, not relay

tailscale netcheck                 # why it chose what it chose

direct は、2台のデバイスが互いを見つけ、通信がピアツーピアで行われていることを意味する。relay は、DERPサーバー経由になっていることを意味する——問題なく機能はするが、遅延が増え、経路上に3台目のマシンが加わる。しかも既定では、そのマシンはあなたのものではない。ステップ06では、どちらになっているかを直すところを扱う。

スマートフォン、タブレット、そしてAppleだけの回り道

デスクトップではコマンドラインフラグで指定する。Androidではアプリ内、設定画面のバージョン番号の奥にカスタムサーバーの項目がある。Appleのプラットフォームにはアプリ内の入力欄がない——サインインの前に、コントロールサーバーのURLを設定する小さな構成プロファイルをインストールする必要があり、これは最初の一度だけ面倒で、そのあとは永続する。時間を節約する方法が2つある。1つは、推測せずにHeadscaleドキュメントのクライアント別ページを確認すること——Appleの手順は一度ならず変わっている。もう1つは、先にアプリをTailscale自身のサービスからサインアウトさせておくことだ。すでにそこでセッションを持っているアプリは、サインアウト、あるいは再インストールされるまで別のサーバーを拒むことが多い。

今すぐ身につける価値のある習慣が2つある。1つ、人間には使い捨てで短命な事前認証キーを使い、再利用可能キーや一時キーは、それを本当に必要とする自動化のためだけに使うこと——一時キーはオフラインになると自分自身を削除するデバイスを登録するもので、CIランナーには正解だが、ノートPCには完全な誤りだ。2つ、鍵の有効期限に対する自分の方針を今のうちに決めておくこと——登録されたデバイスには有効期限があり、鍵が期限切れになったデバイスは、誰かが再認証するまで到達できなくなる。これはノートPCにとってはセキュリティ機能だが、ヘッドレスサーバーでは午前3時に障害を生み出す装置になる。使っているバージョンが有効期限をどう扱うかを確認し——サブコマンドは移動している——既定値を痛い目を見て発見するのではなく、デバイスごとに意図して設定すること。

ステップ05 · ルーティング

広告することは承認することではない。2つのコマンド、2台のマシン。

すべてのデバイスが他のすべてのデバイスに到達できるテイルネットは、それだけですでに役に立つ。3つの機能を追加することで、それは単なるトンネルの集まりから一つのネットワークになる。そしてこの3つには、人がよくつまずく共通の性質がある——クライアント側が機能を広告し、サーバー側がそれを承認しなければならないということだ。広告されただけで承認されていないルートは、黙って存在しないままになる。症状としては、ルーターにはpingが通るのに、その先には何も届かないという形で現れる。

サブネットルーター——LAN全体をテイルネットに乗せる。 自宅やオフィスのネットワークにある1台のマシンが、そのネットワークのレンジを広告する。すると他のすべてのデバイスは、そこに何もインストールすることなく、その裏にあるプリンター、NAS、管理インターフェースに到達できるようになる。まずカーネルでフォワーディングを有効にしておくこと。さもないと、パケットはエラーメッセージも出さずにルーターで止まってしまう。

# On the machine that sits inside the LAN:
echo 'net.ipv4.ip_forward = 1'          | sudo tee /etc/sysctl.d/99-ts.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-ts.conf
sudo sysctl -p /etc/sysctl.d/99-ts.conf

sudo tailscale up --login-server https://vpn.example.com \
  --advertise-routes=192.168.1.0/24 --accept-routes

# On the control server — approve it, or it does not exist.
# The subcommand moved between releases; check `hs nodes --help` first.
hs nodes list
hs nodes approve-routes --identifier 3 --routes 192.168.1.0/24

エグジットノード——すべてをVPS経由で送り出す。 同じ仕組みを、より広いルートで使う——自分をエグジットノードとして広告するデバイスは、別のデバイスのインターネット接続をまるごと運ぶことを申し出る。信頼できないカフェやホテルのネットワークでは、まさにそれこそが欲しいものであり、このガイドの中で個人用VPNに最も近いものである。

# On the VPS that will do the exiting (forwarding must be on, as above):
sudo tailscale up --login-server https://vpn.example.com --advertise-exit-node

# Approve it on the control server, then on the laptop:
tailscale set --exit-node=100.64.0.1 --exit-node-allow-lan-access
tailscale set --exit-node=                    # turn it off again

エグジットノードは商用VPNではないし、自分自身にそう売り込むべきでもない。そのアドレスはあなただけのものであり安定している——カフェのWi-Fiに対しては優秀だが、複数サイトにまたがる長期的な相関に対しては無力だ。このトレードオフは柱となるガイドで詳しく説明している。なお、エグジットノードは2台目の安いVPSで動かし、コントロールサーバーは転送トラフィックと完全に無縁のままにしておくこともできる。

アクセスルール——2人目が加わる前に書いておく。 既定のポリシーは全許可であり、これは1人用のテイルネットには正しいが、他の誰かが加わった瞬間に誤りになる。ポリシーは小さなHuJSONドキュメントで、ユーザーのグループ、マシンのタグ、そしてどの送信元がどのポートでどの宛先に到達してよいかを示すルールの一覧からなる。設定でそのファイルを指すようにし、ファイルはバージョン管理に置き、編集のたびにリロードすること。

{
  "groups": {
    "group:admin":     ["alice"],
    "group:contractor":["bob"]
  },
  "tagOwners": {
    "tag:server": ["group:admin"],
    "tag:exit":   ["group:admin"]
  },
  "acls": [
    // Admins reach everything.
    { "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },

    // The contractor reaches one machine, on two ports, and nothing else.
    { "action": "accept", "src": ["group:contractor"],
      "dst": ["tag:server:22,443"] }
  ],
  "autoApprovers": {
    "routes":   { "192.168.1.0/24": ["tag:server"] },
    "exitNode": ["tag:exit"]
  }
}

そのファイルについて、注意点が2つある。ポリシー言語はTailscaleのものであり、Headscaleはそのすべてではなく、大きく、なお拡大し続けている部分集合を実装している——変わったルールに頼る前に、使っているバージョンのドキュメントを確認すること。もう1つ、ポリシーの置き場所も変わってきた。古いリリースではトップレベルの設定内にパスを指定していたが、新しいリリースではpolicyセクションの下にまとめられ、ルールをデータベースに保持できるモードも用意されている。どちらもドキュメント化されているが、重要なのは、固定したバージョンが実際に採用しているほうだ。

MagicDNS——短い名前と、どこでも自前のリゾルバー。 MagicDNSを有効にすると、すべてのデバイスがステップ02で選んだサフィックスの中の短い名前に応答するようになり、hostsファイルなしでssh nasがどこからでも動くようになる。面白いのは後半のほうだ——コントロールサーバーはすべてのクライアントにネームサーバーの一覧もプッシュする。つまり、プライベートDNSリゾルバーガイドで構築したリゾルバーが、モバイル回線上のスマートフォンにも——フィルタリングし、キャッシュし、何も記録せずに——サービスを提供できるということだ。しかもそれは、インターネットからはまったく到達できないテイルネットのアドレスで待ち受けたままである。

dns:
  magic_dns: true
  base_domain: ts.example.com
  override_local_dns: true          # beat whatever DHCP handed the device
  nameservers:
    global:
      - 100.64.0.5                  # your resolver, on the tailnet
ステップ06 · 保つ

自前のリレー、自前のバックアップ。そしてアップグレードは、適用する前に読む。

使っていることを忘れていたリレー。 2台のデバイスが直接接続を開けないとき——両端が対称NATだったり、UDPを食ってしまうファイアウォールだったり、何か凝ったことをしているキャリアだったりする場合——通信はDERPリレーにフォールバックする。それでもエンドツーエンドで暗号化されたままなので、リレーが運ぶのは暗号文だ。リレーに見えるのは、誰が誰と、どれくらい、いつ話しているかである。標準のままでは、Headscaleはクライアントに公開リレーマップを渡し、それらのリレーは、離れたはずの企業によって運用されている。Headscaleには組み込みのリレーが同梱されており、それを有効にすれば、そのフォールバックはこれまでと同じ北欧のデータセンターに置かれることになる。

derp:
  server:
    enabled: true
    region_id: 999                  # custom regions live in the 900s
    region_code: "nb-hel"
    region_name: "Helsinki (self-hosted)"
    stun_listen_addr: "0.0.0.0:3478"
  urls:
    - https://controlplane.tailscale.com/derpmap/default   # remove for yours only
  auto_update_enabled: true
  update_frequency: 24h

公開リレーマップを自分のリージョンと並べて残しておくのが、現実的な既定の選択だ。クライアントは最も近いリレーを優先するので、同じ半球のデバイスは自分のリレーを使い、地球の反対側のデバイスも単一の北欧ホップの裏に取り残されずに済む。公開URLを外せば、テイルネットは厳密に自己完結するが、その代償として遠方のデバイスのフォールバックが弱くなる。どちらも十分に理にかなっている——なんとなく選ぶのではなく、承知の上で選ぶこと。

4つのファイルを、オフサイトに、暗号化して。 バックアップは、もし失ったら恥ずかしいくらい小さい——データベース、秘密鍵データ、設定ファイル、ポリシーファイルだ。合わせても、どんなストレージ料金の請求書の上でも誤差程度でしかない。それでいて鍵データがなければ、ネットワーク上のすべてのデバイスがサーバーを拒否するようになる。このサーバーではないどこかへ送ること——理想を言えば別の法域へ、これはまさにバックアップガイドが扱っている主題だ——そして、必要になる前に一度、意図的に、使い捨てのVPSへ復元してみること。

# Stop briefly for a consistent SQLite copy, or use .backup on a live db.
docker compose stop headscale
tar czf /tmp/headscale-$(date +%F).tar.gz -C /srv/headscale config data
docker compose start headscale

restic -r sftp:backup@backup.example.com:/srv/restic backup \
       /tmp/headscale-$(date +%F).tar.gz

アップグレードこそが、本当のリスクである。 これは1.0未満のソフトウェアであり、実際その通りに振る舞う。設定キーの名前は変わり、CLIサブコマンドは移動し、リリースのたびに再起動では済まず、文書化された移行作業が必要になったことも一度や二度ではない。だからといって避ける理由にはならない——むしろ、決まった手順を持っておく理由になる。プルする前にリリースノートを読む。まず上のバックアップを取っておく。設定ファイルを新しいバージョン同梱のサンプルと突き合わせる——名前が変わったキーはそこで正体を現すからだ。マイナーバージョンは3つ飛ばしではなく1つずつ上げる。そして古いイメージタグは書き留めておく——30秒で実行できるロールバックがあってこそ、この全体は低リスクでいられるのだから。

そのうえで、月1回2つのことを確認するリマインダーを設定する。1つは登録済みデバイスの一覧——6か月前に廃止したマシンがメンバーのまま残っていないか。もう1つは有効期限——都合の悪いタイミングで何かがひっそりと脱落することがないように。メッシュVPNは、静かに壊れる数少ないサービスの一つだ。すべてはいつも通り動き続け、静かに期限切れになっていたデバイスが必要になった、まさにその瞬間まで、それに気づくことはない。

正直な部分 · これが行わないこと

地図は取り戻した。だが、見えなくなったわけではない。

コントロールプレーンをセルフホストすることは、具体的で本物の改善であり、目くらましの手品ではない。ここまでのすべてを終えたあとでも変わらず真実である5つのことがある。それを知っているかどうかが、本当の防御と、心地よいだけの物語との違いになる。

コントロールサーバーは、公開された、名前を持つエンドポイントである。 すべてのデバイスがそこに接続しにいく以上、ホスト名を持つことになり、そのホスト名は証明書が発行された瞬間に証明書透明性ログへ公開される。どこにもリンクしていなくても発見可能であり、そのアドレスは所有するすべてのデバイスに共通する唯一の定数になる。それが何であるかを説明するような名前ではなく、すでに公開している名前のサブドメインを使うこと。

Headscaleは再実装であり、そのことを自ら明言している。 Tailscale自身が開発しているわけでもサポートしているわけでもなく、機能の同等性はもとから部分的であり、ホスト型製品が売りにしているものの一部——Webコンソール、公開リレー網、洗練されたシングルサインオンの経路——は、ここには存在しないか、誰も監査していないサードパーティ製プロジェクトでしか手に入らない。ある機能に計画を頼る前に、それが存在するかどうかをプロジェクトのドキュメントで確認すること。そしてアップグレードは、バックグラウンドで勝手に進む処理ではなく、一つのタスクとして扱うこと。

既定のリレーは、いまも他人のものだ。 組み込みのDERPサーバーを有効にするまでは、直接接続できない通信は公開リレー網にフォールバックする。ペイロードはそれでもエンドツーエンドで暗号化されており、誰にも読むことはできない——だが、2台のデバイスが話しているという事実そのものと、その通信量は、あなたが所有していないインフラを通過する。ここが、たいていの人が最初の午後に見落とす、信頼の連鎖の部分だ。

エグジットノードが与えるのは安定したアドレスであり、人混みではない。 自分のVPS経由でトラフィックをルーティングすれば、カフェのネットワークやISPによるプロファイリングは無力化できる。だが相関分析は無力化できない。そのアドレスはあなただけのものであり、変わらないからだ。商用VPNの共有アドレスは、あらゆる点で劣るが、この特定の脅威に関しては唯一そこだけが優れている。

そのマシンは、いまも1棟の建物の中にある。 レンタルサーバーは、扉があり、スタッフのいるデータセンターの、物理的なハードウェア上で動いている。変わるのは、あなたのデバイスを製品レベルで索引化する仕組みがないこと、それぞれの接続元を記録する企業のデータベースがないこと、そして来四半期に改定されうるプライバシーポリシーが存在しないことだ。変わらないのは、ディスクが物理的に存在し、それがあなたの家の中にはないということである。

実際に手に入れたものを正確に言えば——所有するすべてのマシンの一覧、それぞれの接続元の記録、そして新しいマシンを追加する権限は、すべて、特定の名前を名乗らずに借りているサーバーの上に置かれている。これは狭い主張であり、同時に本物の主張でもある。その価値が費用に見合うのは、ステップ06を済ませた場合だけだ——検証済みの復元を伴わないセルフホストのコントロールプレーンは、プライバシーの改善ではなく、見栄えの良い単一障害点にすぎない。

サイジング · 何を注文すべきか

コントロールプレーンは無料だ。お金がかかるのはトラフィックのほうである。

ティア 月額 リソース 無理なく動かせるもの
Sentinel$3.902 vCPU · 4 GB · 120 GB · 1 Gbpsコントロールサーバー、リレー、そして軽い用途のエグジットノード。妥当な出発点だ。
2台目の Sentinel$3.90エグジットノードを、専用の別サーバーに転送トラフィックをコントロールプレーンから遠ざけておく
Ravelin$16.908 vCPU · 16 GB · 480 GB · 2.5 Gbps家庭で毎日使うエグジットノードを、回線速度そのままで
Bulwark$32.9016 vCPU · 32 GB · 960 GB · 5 Gbps企業のエグジットノードと、混み合ったリレーが同居する

この表にあるものは、どれもコーディネーションのためにサイジングされてはいない。コントロールサーバーが抱えるのはデバイスごとに1本のアイドル接続と、キロバイト単位で測れるデータベースだけで、数百台のデバイスでも最小ティアを困らせることはない。サーバーを消費するのは転送トラフィックだ——リレー接続、そしてそれよりはるかに大きいのが、誰かのインターネット接続まるごとを運ぶエグジットノードである。アップリンクと暗号化のスループットに合わせてサイジングすること。そして、帯域幅はどのティアでも無制限であることを忘れないでほしい——問題になるのは、どれだけの速さを望むかだけだ。

フィールドノート · 6つの落とし穴

これがうまくいかなくなる6つの原因。そのうち2つは、DNSの問題に見える。

落とし穴01 · 紛らわしい

テイルネットのサフィックスが、サーバーのホスト名と重なっている

コントロールサーバー自身のホスト名の親、あるいは子にあたるMagicDNSサフィックスを選ぶと、名前解決が壊れ、まるでDNS障害のように見える。両者は兄弟関係に保つこと——サーバーには vpn.example.com、テイルネットには ts.example.com。

落とし穴02 · 静か

広告されたまま、一度も承認されなかったルート

クライアントは192.168.1.0/24を広告していると平然と報告してくるが、ルーターの先からは何の応答もない——サーバー側で承認していないからだ。エラーはどこにも出ない。サーバー側で承認し、そのあとクライアントではなくルートの一覧を確認すること。

落とし穴03 · 遅い

すべてがリレー経由、directは一つもなし

アウトバウンドのUDPを塞ぐネットワークでは、すべての接続がリレー経由に強制される。動作はするが遅くなり、経路上に3台目のマシンが加わる。tailscale status は direct ではなく relay と表示し、netcheck がその理由を教えてくれる。ファイアウォールを直すか、そのホップを承知の上で受け入れるかのどちらかだ。

落とし穴04 · 露出

既定の全許可ポリシーのまま、テイルネットにゲストを迎える

作りたてのテイルネットでは、すべてのデバイスが他のすべてのデバイスに、すべてのポートで到達できる。これは一人で使う分には正しいが、契約社員のノートPCが1台加わった瞬間に誤りになる——本人すら存在を知らなかった管理インターフェースも含めて。招待する前に、ポリシーを書いておくこと。

落とし穴05 · 致命的

一度もバックアップされなかった秘密鍵

サーバーを再構築し、データベースを復元し、鍵データを忘れる——すると、昨日まで信頼されていたサーバーを、すべてのデバイスが拒否するようになる。気の利いた復旧方法などない。あるのはスマートフォンを1台ずつ手作業で再登録する1日だけだ。最初のデバイスが加わる前に、データディレクトリをコピーしておくこと。

落とし穴06 · 避けられる

1.0未満のサービスに付けた、フローティングイメージタグ

設定キーとCLIのサブコマンドは、マイナーリリースをまたいで名前が変わってきた。:latest のままだと、無関係な再起動が新しいバージョンを引っ張ってきてしまい、保有する全デバイスのコントロールプレーンが止まる。タグを固定し、リリースノートを読み、意図してアップグレードすること。

FAQ · セルフホストのメッシュVPN

質問、回答済み。

これを構築する過程で出てくる11の質問——そもそも構築すべきかどうかを左右する2つから始める。

Headscaleは公式のTailscale製品ですか。

違う。そしてその意味を正確に理解しておく価値がある。Headscaleは独立した、オープンソースによるコーディネーションサーバーの再実装だ——公開鍵、エンドポイント、ポリシーを配布する、Tailscaleのその部分である。Tailscale自身が開発、販売、サポートしているわけではなく、商用サポート契約も付かない。何か壊れたら、チケットを開くのではなくissueトラッカーを読むことになる。Headscaleがしているのは、公式のオープンソースTailscaleクライアントがすでに話しているプロトコルを話すことであり、だからこそクライアントは手を加えずにそのまま動く。ここから実務上の帰結が2つ生まれる。1つ、機能の同等性は部分的であり、これからもそうであり続ける——このプロジェクトは、はるかに大きなチームが保守する動く標的を追いかけているからだ。ある機能を前提に設計する前に、プロジェクト自身のドキュメントで存在を確認すること。2つ、アップグレードは平均的なコンテナの更新以上の注意に値する——設定スキーマといくつかのCLIサブコマンドは、マイナーリリースをまたいで名前が変わってきた。これが、動いているインストールを壊す最もよくある原因である。

コーディネーションサーバーは私のトラフィックを読めますか。

読めない——そしてこれは、鵜呑みにするのではなく理解しておく価値のある、アーキテクチャの部分だ。すべてのデバイスは、自分のWireGuard鍵ペアをローカルで生成し、秘密鍵の側は一切外に出さない。デバイスがコントロールサーバーにアップロードするのは公開鍵と、現在のエンドポイント、いくつかのメタデータであり、ダウンロードするものも、到達を許された他のすべてのデバイスについて同じ種類の情報だ。トンネルはそのあとデバイス同士で直接ネゴシエートされ、暗号化はサーバーが一度も保持したことのない2つの鍵の間の、ごく普通のWireGuardである。だからコントロールサーバーは何も復号できない——これはTailscaleのサーバーについても同じく真実だ。コントロールサーバーにできることは、それとは別の、あまり語られないことだ——地図を握っているのである。デバイス名、ユーザー名、公開鍵、各デバイスが今まさに接続してきている公開IP、どのデバイスが午前3時に目を覚ましたか、そして誰が誰に到達してよいかを定めるポリシー。さらにコントロールサーバーは鍵を配布する存在でもあるので、侵害されるか強制されたコントロールサーバーは、あなたのネットワークにデバイスを1台追加することができる。セルフホスティングは数学の問題を解決するわけではない。それを、あなたが所有するサーバー上の管理上の問題へと移すだけだ。

コントロールサーバーが落ちたら、自分のネットワークはどうなりますか。

思っているよりずっと少ない、というのがこの設計の安心できる部分だ。デバイスは最後に渡されたネットワークマップをキャッシュしており、既存のWireGuardトンネルはピアツーピアなので、コントロールサーバーを経由しないし、動き続けるためにそれを必要としない。通常の稼働時間中にVPSを再起動しても、たいていは誰にも気づかれない。止まるのは変化のほうだ——新しいデバイスは登録できず、新しいネットワークに移動したデバイスはピアを再発見するのに時間がかかることがあり、ポリシーの編集は反映されず、サーバーが落ちている間に鍵の期限が切れたノードは更新できなくなる。だからコントロールサーバーは、データの通り道としてではなく、コントロールプレーンとして捉えるのが正しい——障害は不便ではあっても、断絶ではない。とはいえ、本番環境として扱うこと。バックアップを取り(ステップ06)、部署全体がテイルネットに依存しているなら、頻繁に再起動される何かと同居させず、コントロールサーバーは専用の小さなサーバーに置くこと。

Headscaleか、それとも素のWireGuardか——コントロールプレーンが実際に見合うのはいつか

デバイスの台数を数え、そのうち何台が移動するかも数えてほしい。素のWireGuardは、小さく固定された構成に対しては見事な答えになる——3台か4台のピア、固定されたエンドポイント、それぞれ1つの設定ファイル、カーネルモジュール以外に動かすものは何もない。このガイドにある何よりもソフトウェアが少なく、攻撃対象領域が狭く、保守の手間も小さい。その全体はWireGuardガイドで扱っている。代償は、WireGuardが意図的に鍵配布の仕組みを持たないことだ。新しいデバイスを1台加えるたびに、他のすべてのデバイスへの編集が発生する——保有台数の2乗で膨らんでいく作業だ。しかもホテルのWi-Fiやモバイル回線を渡り歩くクライアントには、今どこにいるかを全員に伝え続ける誰かが要る。コントロールプレーンが買ってくれるのはまさにそれだ。実際の分岐点はデバイス5台前後、あるいは毎日ネットワークを変える最初のノートPCが現れたとき、あるいは「契約社員のノートPCはステージングサーバーにだけ到達できる」といったルールが初めて欲しくなったときだ。それより少ないうちはWireGuardを使い、静けさを楽しむとよい。

スマートフォンのTailscaleアプリは、Headscaleと一緒に使えますか。

はい——同じ公式クライアントであり、別のコントロールサーバーを指すようにするのは裏技ではなく正式にサポートされた操作だ。仕組みはプラットフォームごとに異なり、そこで人は一晩を無駄にすることになる。Linux、macOS、Windowsではクライアントのコマンドラインフラグ(--login-server)か、それに相当する設定で指定する。Androidではアプリ自体、設定画面のバージョン番号の奥にオプションが公開されている。iOS、iPadOS、tvOSにはアプリ内の入力欄がない——サインインする前に、コントロールサーバーのURLを設定する小さな構成プロファイルをインストールする必要があり、最初の一度は面倒だが、そのあとは永続する。Headscaleのドキュメントには、まさにこのためのプラットフォーム別ページが用意されており、推測するよりそれを開くほうがいい——特にAppleの手順は一度ならず変わっているからだ。プラットフォームに限らない注意点が1つある。すでにTailscale自身のサービスにサインインしているアプリは、別のサーバーを受け入れる前に、たいていサインアウトが——ときには再インストールも——必要になる。

自分でDERPリレーを運用する必要はありますか。

ネットワークを動かすために必要というわけではない——だが、おおむねプライベートであることと、一貫してプライベートであることの違いを生む部分なので、意図して決めるべきだ。DERPサーバーは、2台のデバイスが直接接続を開けないときに使われるリレーである。両端が対称NATだったり、UDPを食ってしまう企業ファイアウォールだったり、何か凝ったことをしているモバイル回線だったりする場合だ。リレーされたトラフィックもエンドツーエンドで暗号化されたWireGuardのままなので、リレーの運用者が目にするのは暗号文であって中身ではない。見えるのはメタデータ——どの2台が話しているか、どれくらいの量を、いつ、ということだ。標準のままでは、Headscaleはあなたのデバイスに Tailscale の公開DERPマップを渡す。つまりそれらのリレーはTailscaleのものであり、コントロールプレーンはセルフホストしたのに、フォールバックのデータ経路のほうは離れたはずの企業に残したままということになる。Headscaleには組み込みのDERPサーバーが同梱されており、それを有効にすれば、コントロールサーバーと同じ北欧のデータセンターにリレーを持てる。正直に言えばトレードオフはカバレッジだ——Tailscaleは複数の大陸にリレーを運用しているが、あなたが運用するのは1つだけなので、地球の反対側にいるデバイスは向こうのリレーのほうがよく面倒を見てくれる。自分のリレーも地図に加えつつ両方を動かすのは、まったく理にかなった中間案だ。

テイルネット全体に、自分のDNSリゾルバーを使わせることはできますか。

できる。そしてこれは、これを構築するに値する理由の中でも上位に入るものだ。Headscaleは、参加するすべてのデバイスにDNS設定をプッシュできるので、カフェのWi-Fi上のノートPCも、モバイル回線上のスマートフォンも、どちらも自分が運用するリゾルバーを通して名前解決するようになる——フィルタリングを効かせ、キャッシュを効かせ、ローカルネットワークにクエリを見せることもない。テイルネットのグローバルネームサーバーを、自前のUnboundやAdGuard Homeを動かしているサーバーのテイルネットIPに向け、DHCPが何を渡してきてもそれに勝つようオーバーライドを設定すること。正しく行うべきことが2つある。1つ、リゾルバーは公開インターネットではなくテイルネット上で到達可能でなければならない——それがすべての要点であり、これによってようやくポート53を世界に対して閉じられるということでもある。2つ、すべてのデバイスに選んだサフィックス内の短い名前を与えるMagicDNSは、そのサフィックスが自分の管理するものであり、かつコントロールサーバー自身のホスト名の親や子ではないことを必要とする。そこを誤ると、DNSの不具合のように見えて実は設定の不具合という、紛らわしい失敗になる。

VPS はどのくらいの規模が必要ですか?

コントロールプレーンだけを見れば、小さく、それ以上に小さい。Headscaleはデバイス・鍵・ポリシーの小さなデータベースを抱える、単一のGoバイナリだ。コーディネーションのトラフィックはデバイスごとに1本、ロングポール接続がぽつぽつと流れる程度で、ほとんどの時間はほぼ何も運んでいない。Sentinel——2 vCPU、4 GB、120 GB NVMe、月額$3.90——なら、家庭でも、小さな会社でも、数百台のデバイスでも気づかれることなく動かせる。サイジングが面白くなるのは、同じサーバーが2つ目の仕事を引き受けたときだけだ。組み込みのDERPリレーは実際のトラフィックを転送するので、コア数よりアップリンクを求める。エグジットノードはデバイスのトラフィックのすべてを転送するので、アップリンクと、余裕のある帯域枠と、回線速度に見合う暗号化をこなせるCPUを求める。両方を計画しているなら、トラフィックに合わせてサイジングし、コントロールサーバーの分は誤差として扱えばいい——あるいはもっとよいのは、エグジットノードを2台目のサーバーに置き、コントロールプレーンは退屈なままにしておくことだ。

自分のVPS上のエグジットノードは、商用VPNを使うのと同じことですか。

技術的にはよく似ているが、プライバシーの観点ではほぼ正反対なので、はっきり見ておく価値がある。エグジットノードはデバイスのインターネット接続まるごとをあなたのVPS経由でルーティングするので、Webサイトからは自宅やホテルのアドレスではなくVPSのアドレスが見え、ローカルネットワークからはあなたの閲覧内容の代わりに1本の暗号化トンネルが見える。ここまでは商用VPNと同じだ。違うのは人混みである。商用VPNのアドレスは無関係な何千もの顧客と共有されており、それこそがトラフィックをあなたに結びつけにくくしている理由だ。一方、エグジットノードのアドレスはあなたが安定して、永遠に使い続けるものである。詮索してくるカフェのネットワークや、プロファイルを構築しようとするISPに対しては、エグジットノードは優秀だ。だが複数のサイトにまたがる行動を数か月かけて相関分析してくる観察者に対しては、専用アドレスは長持ちする識別子になり、共有アドレスはそうならない。エグジットノードは得意なことのために使うこと——信頼できないローカルネットワーク、自分のサービスへの到達、安定したアドレスを前提とするもの——そして、それがカバーしない脅威モデルの部分については柱となるガイドを読んでほしい。

具体的に、何をバックアップすればいいですか。

4つあり、そのうち明らかなのは1つだけだ。データベース——既定ではSQLite、移行していればPostgreSQL——はユーザー、デバイス、公開鍵、ルート、事前認証キーを保持する。初回起動時に生成される秘密鍵データは、人がよく忘れる部分だ。これを失えば、1年間話しかけてきたサーバーをすべてのデバイスが拒否するようになり、保有デバイス全体を手作業で再登録することになる。設定ファイルが重要なのは、ステップ02で決めた3つの名前を刻み込んでいるからで、それを記憶から再構成しようとすることが、うっかり1つを変えてしまう原因になる。そしてポリシーファイル——アクセスルールをディスク上に置いている場合——は、最も書き直したくないものだ。この4つはすべて2つのディレクトリに収まり、合わせても写真1枚より軽い。暗号化し、このサーバーではない別のマシンへ送ること——理想を言えば別の法域へ、これはまさにバックアップガイドの主題だ——そして一度、意図的に、使い捨てのVPSへ復元してみること。そうして初めて、手元にあるファイルが本当に必要なファイルだとわかる。

VPS上でコントロールサーバーとエグジットノードを運用しても、NordBastionは問題視しませんか。

コントロールサーバーは行儀の良いごく普通のワークロードだ——わずかなHTTPSと、わずかなUDP、トラフィックと呼べるほどのものはほぼない——利用ポリシーの中にこれに触れる項目は存在しない。エグジットノードについては、規約の説教ではなく一文だけ考えておけば足りる。デバイスがそこを通して送るものはすべて、あなたのアカウントの下、あなたのVPSアドレスからインターネットに出ていく。つまりデバイスがすることは、そのままそのアドレスの評判になる。それはそれでよく、まさにこの機能の目的そのものだ。同時に、見知らぬ人たちと共有するエグジットノードが良くない考えである理由でもある——オープンリレーが良くないのと同じ理屈で。帯域幅はどのティアでも無制限で、リレーされたトラフィックも通常のトラフィックの一部なので、DERPサーバーもエグジットノードも従量制ではなく標準で含まれる。それ以外にも、アカウントに名前は要らず、請求は Monero か Bitcoin で決済され、所有するすべてのデバイスの地図を握るマシンは誰にもインデックスされない。

サーバーを取得する

自分自身の名前ではないアカウントで運用する、自分だけのコントロールプレーン。KYC不要、暗号資産決済。

Sentinel——ヘルシンキ、ストックホルム、オスロ、レイキャビクのいずれかで、2 vCPUと4 GBが月額$3.90。Headscale、Caddy、自前のDERPリレーには十分な余裕があり、同じサーバーにエグジットノードも置きたいならその分の余地も残っている。サインアップにメールは不要、身分証明書も不要、そして所有するすべてのデバイスの一覧を握る企業のデータベースも存在しない。

最終レビュー · 2026-10-12 · 出典 · Headscale ドキュメント(設定リファレンス、クライアントの設定、ACL、DERP、リモートCLI)、Tailscale クライアントおよびエグジットノードのドキュメント、WireGuard プロトコル論文、Caddy ドキュメント · 頻度 · 年次

プライベートホスティング、北欧で構築。