Tailscaleロゴ

カスタムDERPサーバー

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

カスタムDERPサーバーは現在、アルファ段階にあります。

カスタムDERPサーバーとは、特定のネットワーキング要件のために、Tailscale以外の組織や個人によって構築・運用される、専用のDERPサーバーです。
デフォルトでは、すべてのTailscaleネットワーク(tailnetと呼ばれる)はTailscaleが運用するDERPサーバーを使用します。
DERPサーバーは主に、Tailscaleネットワーク(tailnetと呼ばれる)内のデバイス間の接続性を補助する役割を果たします。
また、ダイレクト接続が不可能で、Peer Relayも利用できない場合のフォールバック機構としても機能します。

ほとんどの場合、カスタムDERPサーバーを運用する必要はありません。
DERPサーバーは通常、tailnet内のデバイス間を繋ぐ結合組織として機能するだけで、デバイス間でやり取りされるデータの内容を見ることはできません。

ただし、制限の厳しいネットワーク環境では、デバイスが他のデバイスとダイレクト接続を確立できないため、DERPサーバーを使用する可能性が高くなります。
DERPリレー接続はダイレクト接続よりも遅いため、パフォーマンスの低下を経験するかもしれません。
DERPリレー接続が頻繁に発生し、パフォーマンスの問題を避けたい場合は、カスタムDERPサーバーを設置するよりも、なぜダイレクト接続を確立できないのかを調査するか、Peer Relayを設置する方が一般的には望ましい解決策です。

Tailscale Peer Relayには以下のメリットがあります。

とはいえ、カスタムDERPサーバーを運用することが理にかなう稀なケースもあります。
たとえば、企業ポリシーに準拠するために暗号化トラフィックの経路を制限する目的でカスタムDERPサーバーを運用するケースなどです。

制限事項

ほとんどの場合、カスタムDERPサーバーを運用する必要はありません。
ただし、運用する意味のある稀なケースもあります。
その場合、cmd/derperバイナリのビルド、デプロイ、更新を自分で行う必要があります。

カスタムDERPサーバーの運用は、構築と維持に多大なリソースを必要とする高度な作業です。
さらに、カスタムDERPサーバーの運用には以下の注意点があります:

要件

カスタムDERPサーバーには、インターネットへの直接アクセスICMPトラフィックの許可、およびHTTP、HTTPS、STUN用のポート開放が必要です。

インターネットへの直接アクセス

DERPサーバーは、インターネットへの直接接続が必要であり、NATデバイス(ファイアウォールなど)やロードバランサーの背後に配置してはなりません。
この直接接続要件は、2つの重要な理由から存在します。
デバイス識別プロトコル互換性です。

デバイス識別

DERPサーバーは、受信トラフィックの送信元アドレスを検査することで、tailnetデバイスを識別します。
NATやロードバランサーは元の送信元アドレスを変更してしまうため、これらを経由するとこの重要な機能が動作しなくなります。

プロトコル互換性

Tailscaleクライアントは、双方向データチャネルを確立するためにHTTPアップグレードプロトコルを使用します。
ほとんどのクラウドロードバランサーはこのプロトコルをサポートしておらず、DERPサーバーの運用と互換性がありません。

カスタムDERPサーバーの運用は、構築と維持に多大なリソースを必要とする高度な作業です。

必要なポート

DERPサーバーは、HTTPサーバー、HTTPSサーバー、およびSTUNサーバーを実行するために、以下のポートを開放する必要があります。
これら3つのサービスのポートは、tailnetのユーザーが自宅やカフェなどからアクセスできるよう、インターネットからのトラフィックに対して開放されている必要があります。

サーバーポート
HTTP80
HTTPS443
STUN3478

HTTPSとSTUNで別のポート番号を使用したい場合は、それぞれDERPNode.DERPPortまたはDERPNode.STUNPortを設定します。
HTTPについてはカスタムポート番号を使用できません。

ICMPトラフィック

DERPサーバーは、インバウンドおよびアウトバウンドのICMP(Internet Control Message Protocol)トラフィックを許可する必要があります。

Tailscaleはノード間の接続を支援するためにDERPリレーサーバーを運用しています。
一般的に、TailscaleのDERPサーバーをカスタマイズする必要はありませんが、必要に応じてカスタマイズすることは可能です。

カスタムDERPサーバーの導入

⚠️ カスタムDERPサーバーの運用は、構築と維持に多大なリソースを必要とする高度な作業です。
進める前に、要件制限事項を十分に検討してください。

カスタムDERPサーバーを設定するには、以下が必要です:

  1. ソースからDERPサーバーを実行する。
  2. DERPサーバーをtailnetに追加する。

以下の追加ステップはオプションです:

  1. tailnetデバイスのカスタムDERPサーバーへのアクセスを制限する。
  2. Tailscaleのデフォルトのデフォルトサーバーをtailnetから削除する。

ソースからDERPサーバーを実行する

独自のDERPサーバーを実行するには、ソースからDERPサーバーをビルドする必要があります。
最新バージョンのGoを使用して、以下を実行します:

go install tailscale.com/cmd/derper@latest

これにより、最新のDERPサーバーが$HOME/go/binにインストールされます。

バイナリを実行する前に、サーバーを指すドメイン名が必要です。
ドメイン名とバイナリの両方を用意したら、以下のコマンドでドメイン名上でDERPサーバーを起動します:

sudo derper --hostname=example.com

これにより、ポート443で公開されたDERPサーバーが起動し、ドメイン経由でアクセスできるようになります。
次に、ステップ2で説明する方法でDERPサーバーをtailnetに追加できます。

⚠️ Tailscaleクライアントの更新との互換性を保つため、go install tailscale.com/cmd/derper@latestでソースから再ビルドして、DERPサーバーを定期的に更新する必要があります。

カスタムDERPサーバーをtailnetに追加する

Tailscaleがあなたのリージョン内にDERPサーバーを提供していない場合、または提供されているDERPを使用できない場合、tailnetのポリシーJSONderpMapキーにDERPMap型の値を設定することで、DERPサーバーのセットを追加または編集できます。

各リージョンには一意のリージョンIDがあります。
リージョンIDの値900から999はカスタムでユーザー指定のリージョンとして予約されており、Tailscaleでは使用されません。

たとえば、以下の設定では、ホスト名example.comのカスタムDERPサーバーを有効にします。
その他のオプションについては、DERPRegionおよびDERPNodeの定義を参照してください。


{
  // ... tailnetポリシーファイルのその他の部分
  "derpMap": {
    "Regions": {
      "900": {
        "RegionID": 900,
        "RegionCode": "myderp",
        "Nodes": [
          {
            "Name": "1",
            "RegionID": 900,
            "HostName": "example.com",
            // IPv4とIPv6はオプションですが、DNSが利用できない場合や
            // 問題がある場合のDERP接続性の問題を減らすために推奨されます。
            // アドレスは公的にルーティング可能で、プライベートIP範囲内に
            // あってはなりません。
            "IPv4": "203.0.113.15",
            "IPv6": "2001:db8::1"
          }
        ]
      }
    }
  }
}

リージョンごとに1つのDERPサーバーしか持てません。
DERPの冗長性が必要な場合は、各リージョンに1つのDERPサーバーを配置する形で複数のリージョンを使用してください。

(オプション)TailscaleのDERPサーバーを削除する

コンプライアンスなどのさまざまな理由により、特定のDERPリージョン経由でトラフィックをルーティングしたくない場合があります。
tailnetポリシーファイルにカスタムDERPマップを作成することで、tailnet内のデバイスが利用可能なDERPリージョンを削除できます。
リージョンを除外するには、その値をnullに設定します。
nullに設定すると、tailnet内のデバイスはそのリージョンのDERPサーバーに接続できなくなります。

たとえば、以下のDERPマップ設定では、リージョンID1を持つニューヨークのTailscale DERPリージョン経由のトラフィックルーティングを無効化します:


{
  // ... tailnetポリシーファイルのその他の部分
  "derpMap": { "Regions": { "1": null } }
}

Tailscaleのデフォルト DERPマップはhttps://controlplane.tailscale.com/derpmap/defaultからアクセスできます:


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

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


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

トラフィックがカスタムDERPサーバーのみを経由するように保証するには、DERPマップのOmitDefaultRegionsフラグをtrueに設定して、Tailscaleのすべてのデフォルト DERPリージョンを削除します。


{
  // ... tailnetポリシーファイルのその他の部分
  "derpMap": {
    "OmitDefaultRegions": true,
    "Regions": {
      "900": {
        "RegionID": 900,
        "RegionCode": "myderp",
        "Nodes": [
          {
            "Name": "1",
            "RegionID": 900,
            "HostName": "example.com",
            // IPv4とIPv6はオプションですが、DNSが利用できない場合や
            // 問題がある場合のDERP接続性の問題を減らすために推奨されます。
            // アドレスは公的にルーティング可能で、プライベートIP範囲内に
            // あってはなりません。
            "IPv4": "203.0.113.15",
            "IPv6": "2001:db8::1"
          }
        ]
      }
    }
  }
}

DERPマップのすべてのオプションについては、ソースコードのDERPMapの定義を参照してください。

(オプション)カスタムDERPサーバーへのクライアントトラフィックを検証する

DERPサーバーのIPアドレスを知っている人なら誰でも、それを自分のDERPマップに追加し、自分のtailnetトラフィックをあなたのDERPサーバー経由でルーティングできてしまいます。
自分のtailnetトラフィックのみをDERPサーバー経由で許可するには、DERPサーバーと同じデバイス上でtailscaledを実行し、--verify-clientsフラグ付きでderperを起動します。


sudo derper --hostname=example.com --verify-clients

カスタムDERPサーバーを監視する

cmd/derpprobeバイナリを使用して、カスタムDERPサーバーを監視し、正常に動作していることを確認します。
監視するDERPマップを記述したJSONドキュメントを指す--derp-map=file:// URLを指定する必要があります。

ポリシーコンプライアンス

カスタムDERPサーバーをホストする理由の1つは、ポリシーコンプライアンスを確保することです。
たとえば、暗号化されていてもトラフィックが公開サーバーを通過することを禁じる、厳格なポリシー要件がある場合があります。

DERPサーバーは暗号化されたトラフィックのみを転送し、平文トラフィックにはアクセスできません。
さらに、TailscaleのDERPサーバーは、すべてのTailscale顧客間で共有されるリソースです。
自社の管理下にないサーバーを暗号化トラフィックが通過することを禁じるような、厳格なルーティングポリシーがあるかもしれません。

そのようなポリシーに準拠するには、1つ以上のカスタムDERPサーバーを運用し、tailnetが利用可能なDERPサーバーのリストからTailscaleのデフォルト DERPサーバーを削除できます。