NATトラバーサル
NAT(Network Address Translation)の背後にいるデバイス同士がP2P接続を確立するための技術群。ほとんどのデバイスはNATの背後にいるため、VPNや通話アプリなどP2P通信を必要とするシステムの根幹技術。
NATが引き起こす問題
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を知っていても直接通信できない。
主要技術
STUN(Session Traversal Utilities for NAT)
STUNサーバーに接続することで、自分のNATが外部に公開している(NATによって変換された後の)アドレスとポートを知ることができる。
UDPホールパンチング
NATは「内側から外側への通信」を許可し、その応答を通すルールを自動的に作成する。この特性を利用し、AとBが同時に相手のアドレスへパケットを送ることで、互いのNATに「穴(hole)」を開ける手法。
時刻T: A→B(Bに届かないが、NAT Aに穴が開く)
時刻T: B→A(Aに届かないが、NAT Bに穴が開く)
時刻T+1: 互いのパケットが穴を通って到達!
ICE(Interactive Connectivity Establishment)
複数の接続方法を同時に試し、最も良いものを選ぶアルゴリズム。
優先順位:
- 直接接続(同一LAN内)
- IPv6直接接続
- UDPホールパンチング
- リレーサーバー経由(TURN/DERP)
Symmetric NAT
企業ファイアウォールなどで使われる厳格なNAT方式。接続先ごとに異なるポートを割り当てるため、UDPホールパンチングが機能しない。この場合、リレーサーバー経由にフォールバックする。
フォールバック:リレーサーバー
ホールパンチングが成功しない場合のフォールバックとして、リレーサーバーを使う。Tailscaleの場合はDERP(Designated Encrypted Relay for Packets)サーバー。リレーでも通信内容はE2E暗号化されており、中継サーバーは復号できない。
成功率
Tailscaleの公開データでは:
- UDP接続成功率:82〜95%
- TCP接続成功率:約64%
- 残りはリレー経由