はじめに
初めて自宅サーバーを立てたとき、学校の先輩に「Tailscale入れてみなよ」と言われて、
正直そのときは なんぞそれ? という感じで、言われた通りインストールして設定も教えてもらい、
よくわからないまま使っていました。
その後サーバーPCを新しくしたタイミングで、自分で一から構築し直すことになり、
「そういえばTailscaleって結局どういう仕組みなんだ?」と思って改めて調べてみました。
概要
基盤技術:WireGuard
- WireGuardとは
-
VPNを作るための仕組み(プロトコル)
暗号化された安全な通信トンネルを作る技術。
OpenVPNやIPsecの“新しくて速い版” -
とにかくシンプルで高速
CPU負荷が少なく、めっちゃ速い -
最新の強力な暗号技術を使用
ChaCha20(暗号化)
Curve25519(鍵交換) -
ノード同士が直接通信(P2P)
仲介サーバーなし。
自分のPCと相手のPCが WireGuardトンネルで直接つながる。 -
公開鍵で認証
ID/パスワード不要。
公開鍵と秘密鍵のペアで相互認証する。 -
UDPで高速通信
TCPより遅延がないから速い。
ゲームや動画転送にも強い。
実際のTailscale側の動作
-
認証
Tailscaleにgoogleアカウントなどでログイン
このアカウントごとに1つのVPNネットワークを作る -
デバイスの登録
各ノードでgoogleアカウントにログインし、talescale up を行うことで
デバイス名、デバイスの公開鍵、現在のIP、デバイスのバージョン・状態を
tailscaleコントロールサーバーがVPNグループに登録する -
他のノード一覧を配布
コントロールサーバーは各ノードに “他のノードの公開鍵+接続情報” を配る
これでノード同士が「誰と通信すればいいか」を理解する。 -
STUN/ICEを使ってP2P通信
- STUN
自分が外からどう見えているか(グローバルIP+ポート)を教えてくれる仕組み。 - ICE
その外側のIP+ポートを使って、相手と直接つながるための“穴あけ”の仕組み。
これを使ってノードが STUN サーバーにUDPを送って、NATの外側のIPとマッピングされたUDPポートを取得する。
STUNで手に入れた候補アドレス同士でUDPホールパンチングを試す。
ICEで確立した 双方向UDPパスの上でWireGuardの暗号化ハンドシェイクを実行。
感想
今までなんとな〜く使ってたけど、仕組みちゃんと調べてみたらめっちゃ画期的じゃん!
ってなる一方で、え? これ普通にNATをだまして突破してない?みたいな裏技感あった。
でもまあ、便利すぎるからこれからも使います。