Tailscaleロゴ

DERPダープサーバ

最終検証日:
翻訳: 竹洞 陽一郎

DERP(Designated Encrypted Relay for Packets)サーバは、デバイスの接続とNATトラバーサルを管理します。
DERPダープサーバには主に2つの役割があります。

  1. tailnetデバイス間の接続(直接接続またはリレー接続)の確立と調整
  2. 直接接続が不可能な場合で、かつピアリレーサーバも利用できない場合のフォールバック

tailnetデバイス間の接続のほとんどは、DERPサーバを経由して別のtailnetデバイスへの直接接続を確立するためだけに使用されます。
ただし最終手段として、ハードNAT・ファイアウォール・その他の理由で他の接続方式が利用できない場合には、DERPサーバをリレーとしてデバイス間通信を行うことができます。
DERPサーバはデュアルスタック対応であり、IPv4とIPv6の両方をサポートしています。
そのため、IPv4のみのデバイスとIPv6のみのデバイスの間の接続も仲介できます。

DERPサーバを使用したリレー接続

DERPリレー接続は、Tailscaleにおける2種類のリレー接続のうちの1つです。
もう1つはピアリレー接続です。
ピアリレー接続は、DERPサーバの代わりにTailscaleネットワーク(tailnet)内の他のデバイスを使ってトラフィックをリレーします。

直接接続が不可能な場合、Tailscaleはまずtailnet内で利用可能なピアリレーの使用を試みます。
ピアリレーが利用できない場合は、DERPサーバにフォールバックします。
ピアリレーを使用するには事前の設定が必要です。
詳細はTailscaleピアリレーをご参照ください。

TailscaleはDERPリレー接続を使用するデバイス間で送受信されるすべてのデータをWireGuardで暗号化します。
Tailscaleの秘密鍵はそれを生成したローカルデバイスから外部に出ることはないため、DERPサーバがトラフィックを復号することは不可能です。
DERPサーバは、すでに暗号化されたトラフィックをデバイス間でそのまま転送するだけです。

DERPサーバのロケーション

Tailscaleは高可用性と低レイテンシを実現するため、複数の地理的リージョンにDERPサーバを配置しています。
ほとんどのリージョンには少なくとも3台のDERPサーバがあります。

各Tailscaleクライアントは、TailscaleのコーディネーションサーバからDERPマップを受信します。
このマップには、クライアントが利用可能なすべてのDERPサーバの情報が含まれています。
クライアントはレイテンシ情報に基づいてホームDERPサーバを選択し、その選択をコーディネーションサーバに報告します。
コーディネーションサーバは各クライアントの選択を、tailnet全体の他のクライアントに共有します。

Tailscaleは以下のロケーションにDERPサーバを運用しています。

Tailscaleクライアントは低レイテンシを実現するために最寄りのリレーを自動的に選択します。
Tailscaleは低レイテンシ接続を提供するため、必要に応じてDERPサーバを継続的に拡充・追加しています。

Tailscale CLIに対応したクライアントでは、tailscale netcheckコマンドを使用して、使用しているTailscaleデバイスに適用されるDERPサーバの一覧を確認できます。

カスタムDERPサーバ

ほとんどの場合、カスタムDERPサーバを運用する必要はありません。
DERPサーバはtailnet内のデバイス間の接続をつなぐ役割のみを担っており、デバイス間でやり取りされるデータの内容を見ることはできません。

DERPリレー接続が頻繁に発生し、パフォーマンス要件を満たせない場合は、カスタムDERPサーバの代わりにピアリレーの設定を検討することをお勧めします。
ピアリレーには以下のメリットがあります。

それでも、カスタムDERPサーバの運用が理にかなうケースは稀ながら存在します。
カスタムDERPサーバを構築・デプロイ・更新するには、cmd/derperバイナリをビルドする必要があります。
詳細はカスタムDERPサーバのドキュメントをご参照ください。

自前でDERPサーバを運用することは高度な作業であり、セットアップと保守に多大なリソースを要します。
また、カスタムDERPサーバの運用には以下の制約があります。

DERPマップのカスタマイズ

tailnetで使用するDERPマップをカスタマイズできます。
設定するには、tailnetポリシーファイルにderpMapオブジェクトを追加します。
derpMapオブジェクト内で、DERPリージョンのRegionIDnullに設定することで、そのリージョンの使用を明示的に無効化できます。
例えば、ニューヨークのDERPリージョン(RegionID:1)を無効化するには、tailnetポリシーファイルに以下を追加します。


{
  // ... tailnetポリシーファイルの他の設定
  "derpMap": {
    "regions": {
      "1": null,
    },
  },
}

DERPリージョンのRegionIDが不明な場合は、https://controlplane.tailscale.com/derpmap/defaultからTailscale公式のDERPマップ(リージョンIDを含む)を取得できます。
このURLはWebブラウザまたはcurlコマンドでアクセスできます。


curl https://controlplane.tailscale.com/derpmap/default

jqがインストールされている場合は、以下のコマンドでTailscaleのデフォルトDERPリージョンとそのIDの一覧を表示できます。


curl --silent https://controlplane.tailscale.com/derpmap/default | jq -r '.Regions[] | "\(.RegionID) \(.RegionName)"'

コンプライアンス目的でtailnetをアメリカ国内のDERPサーバのみに制限したい場合は、Tailscaleサポートへお問い合わせください。

DERPパケット

DERPサーバがリレーするパケットには、DISCOパケットと暗号化済みWireGuardパケットの2種類があります。
通常、DERPサーバは主にDISCOパケット(探索メッセージ)を使用して、2つのtailnetデバイス間の直接接続を確立・調整します。
一方、2つのデバイスがフォールバックの接続方式としてDERPサーバを使用する場合は、暗号化済みWireGuardパケットをリレーします。

DISCOとは、TailscaleのDERPサーバが直接接続を確立する前にtailnetデバイス間で探索メッセージを送受信するために使用するプロトコルです。
これらの探索メッセージはDISCOパケットとも呼ばれます。

可用性と障害時の動作

TailscaleのコーディネーションサーバはDERPサーバの一覧を管理しており、Tailscaleを実行しているデバイスはコーディネーションサーバからこの一覧を取得してローカルに保存します。
そのため、コーディネーションサーバが停止していてもDERPサーバが稼働していれば、TailscaleクライアントはDERPサーバの最後の既知の状態を保持しています。
このDERPサーバの一覧は、Tailscaleクライアントを再起動しても保持されます。

DERPサーバ(またはリージョン)で障害が発生した場合の動作は以下の通りです。