はじめに
VPN の導入や見直しをご検討中の方、Tailscale という選択肢をご存知ですか?
「VPNって設定が面倒」「速度が遅い」「自宅PCと繋ぎたいけどポート開けたくない」
そんな悩みを全部まとめて解決してくれるのが、Tailscaleです。
本記事は、Tailscale の偉大さを私の推しポイントから端的に称える記事です。
そのために、内部で使用している WireGuard、UDPホールパンチングの技術について触れますが、概要止まりとして詳細は踏み込みません。
WireGuardとは
Wikipedia より一部抜粋
WireGuardは、フリーかつオープンソースのルーティング又はブリッジで安全なポイント・ツー・ポイント接続を作成するための技術であるVirtual Private Network (VPN) の実装であり、アプリケーション及び通信プロトコルである。Linuxカーネル内のモジュールとして実行され、IPsecやOpenVPNよりも優れた性能を目指している
ひとことで: 軽量高速で設計されたモダンなVPNプロトコル。軽量・高速。カーネルモジュールで動作。暗号化は ChaCha20 という高速かつ信頼性の高いストリーム暗号使用。
ちなみに Linux で OpenVPN を使おうとすると、体感で遅くてイライラします(私の最適化の問題だけかもしれない)。
WireGuardにサーバーという概念はありません
VPN の代表格ともいえる OpenVPN が中央サーバーとして機能するのに対し、
WireGuard は二者間のピア接続を基本とし、全ピアが平等という仕組みで動くためサーバーは不要です。
ただし、自前構築だと片方は結局サーバーっぽいものになりがち
たとえば AWS EC2 とお家 PC 間で WireGuard で通信するとします。
EC2 は待ち受ける側の "サーバー" のような存在になります。
なぜか。
WireGuard は UDP で通信しますが、自分から UDP を送信することで NAT に穴が開き、その宛先からの応答が通るようになります。
このとき、受信する側は待ち受け用にポートを開放しておく必要があります。
つまり、概念上のサーバーはなくとも、NAT 突破のためには EC2 のように常時ポートを開けて待っていてくれる存在が必要となります。
一度トンネルが開通し、通信が始まった後はまったく平等です。
そのため、お家PC であっても、待ち受けポートを開いておけば完全に平等。EC2 発信で、お家PC と通信することも可能です。
※とはいっても、皆さんご存知のように、家庭のポート開放は技術的にもセキュリティ的にも推奨されません。
PersistentKeepalive
を使えば、NAT のセッションを維持するために定期的にパケットを送り続けることができ、逆方向からの通信も可能になります。
ただそれでも、最初の穴あけは「自発的な UDP 送信」が必要なため、初期接続時に受信側が開いていないと通信が始まらないという点は変わりません。
現実的には中央サーバー的な使い方しかできない?
結局、お家PC 同士で同僚とピアは無理か…
だってお家のポート解放なんてしたくない。
いいえ。Tailscale は実現しました。
Tailscale が内部で使用している「ポート開放せず NAT 超えする技術」の1つが、UDPホールパンチングです。
※ NAT は動作仕様が標準化されていないため、機能しない NAT もあります
UDPホールパンチング とは
NAT デバイスの多くは、「ステートフル」な Firewall を搭載しています。
つまり、一度「自分から送信した通信の宛先」から戻ってきたパケットは、"正当な返答"とみなして通してくれます。
これを利用すると、こんなことができます:
- Aさん → Bさんに向けて UDP を送信
- Bさん → Aさんに向けて UDP を送信
→ 双方向の通信が同時に始まると、お互いの NAT 越えが成立!
これが UDPホールパンチングです。
もう1つの課題:宛先が分からない
ではさっそく、AさんはBさんに、BさんはAさんに向かって同時にリクエストを投げましょう。
さて、ここで二人とも困ります 「IPアドレスもポートも分からない」
なぜなら:
- グローバルIP を固定している人は少ない(自分の IP アドレスが分からない)
- 通信に使うポートはその時々で変わる
解決策:教えてくれる第三者を置こう
Tailscale では、この役割を DERPサーバー が担っており、お互いの IP/ポートを調整しつつ、必要なら中継までしてくれます。
DERPサーバーの役割
DERPサーバーの役割は大きく 2 つあります。
1 つは、Aさん Bさんにそれぞれ、相手の「IPアドレスとポートは今これ」を教えることです。
もう 1 つは、「機能しない NAT もある」と上で述べましたが、どう頑張ってもピア接続できない場合に限り、リレーサーバーとしてパケットの中継もしてくれます。
詳しくは本家の説明をご参照ください:DERP servers
中継してくれるというと、OpenVPN の client-to-client の機能のような感じ?
「パケットを中継してくれる」という点では確かに似ています。
ただし、DERP サーバーは復号しません。
OpenVPN では、中央サーバーが絶対的な権限を持ち、一度サーバーでパケットを開き復号したうえで、再度包み直して送信しています。
一方、Tailscale で使用している DERP サーバーは、パケットの中身を見ない(= DERPサーバーを信用しなくて良い)仕組みとなっています。
ゼロトラスト的な発想ですね✨
でも Tailscale ってお高いんでしょ?
3 users までなら無料です!!(執筆時点:2025/9/19 現在)
※ 料金表も置いておきます:https://tailscale.com/pricing
また、企業での有料プランでの導入を考えても、VPN 周りの設定の煩雑さ、OpenVPN の遅さへのイライラを考えれば十分にペイできるのでは、と個人的には思います。
だって、
双方に Tailscale インストールして tailscale up
これだけで高速 VPN 通信が手に入るんですよ?
もし WireGuard 自力でやろうと思ったら...
WireGuard 入れて、仮想NIC作って、ルーティングして、pingしてみて(シーーーン...?)
🤔 鍵あってる、ポート開いてる、AllowedIPs もあってる。うわ、EC2 なぜか変なルーティング持ってた。
という死闘のあとに、PersistentKeepalive
設定忘れにより再び穴は塞がり。EC2からの通信は無視され続ける。
こんな戦いとは無縁の世界。それが Tailscale。
追加の推し機能:ユーザー管理機能が神
OpenVPN はユーザー管理も証明書発行も面倒です。
証明書の生成・配布・失効対応など、管理コストが地味に高い。。。
一方、Tailscale は Googleアカウントや GitHub などの SSO 連携がデフォルトで利用でき、証明書の管理は一切不要です。
→ 誰がログインしてるか、いつ接続したかが GUI で見える上に、ユーザーの追加・削除も SSO 連携の範囲内で管理可能です。
デバイスを追加したいときも、インストールと認証だけで即使える!
おわりに
WireGuard やったことのある方は、Tailscale は 魔法か?って思うと思います。
ここに書いたことは Tailscale の魅力(機能)のほんの一部でしかありません。
Tailscale 使っていきましょう!
ちなみに、NAT 越えの仕組みに興味ある人は、ぜひ Tailscale 本家のこのブログを。
How NAT traversal works
https://tailscale.com/blog/how-nat-traversal-works/
神記事です。
UDP ホールパンチングの説明から、STUN・TURN・DERP の実装戦略、NAT の種類ごとの挙動、ICE の登場までとても丁寧。全部のってます。そして、笑わされます。
補足:WireGuardベースの類似サービス
なお、本記事では Tailscale を中心にご紹介しましたが、同じく WireGuard をベースにした類似サービスとして、Headscale、NetBird、Netmaker なども存在します。
いずれも OSS として公開されており、自前でコントロールプレーンを構築したいケースでは選択肢となるかもしれません。