DERP Serverとは?
- Designated Encrypted Relay for Packetsの略
- 指定パケット暗号化リレー(直訳)
- TailscaleでP2P接続を確立できない場合に挟むリレー
- P2P接続を確立するまでの間もリレーを経由する
- リレーを流れる通信はWireGuardで暗号化されている
- E2E暗号化なのでリレーサーバは通信内容を復号できない(はず)
- 複数リージョンに展開されており,自動的に最短距離(低レイテンシ)のサーバが指定される
各DERP Serverのレイテンシはノード管理画面から確認できる
各RegionとNodeを定義したJSONファイル(DERP map)は以下のURLから取得することができる
https://login.tailscale.com/derpmap/default
Custom DERP Server
Tailscaleの提供するライブラリを使ってDERPサーバを立てることができる.
この機能はα版です. また,以下の機能が利用できなくなります.
- Tailnetを跨いだデバイス共有等
- 公式DERPサーバ(後述)
サーバの構築
Lightsailでインスタンスを立てる
Lightsailでインスタンスを作成. 今回は以下の構成を選択
- リージョン: 東京 ゾーンA(
ap-northeast-1a
) - ネットワーキングタイプ: デュアルスタック(IPv4+IPv6)1
- OS: Amazon Linux 2023
- RAM: 512MB
- vCPU: 2
- SSD: 20GB
Tailscaleのインストール
sudo yum-config-manager --add-repo https://pkgs.tailscale.com/stable/amazon-linux/2023/tailscale.repo
sudo dnf update
sudo dnf install tailscale
インストールできたらログインしておく
DERPサーバのインストール
Amazon Linux 2023のGoはv1.22.7なので依存関係の問題でderperがビルドできない
現時点の安定版v1.23.3をダウンロードしてくる
sudo dnf install go
go install golang.org/dl/go1.23.3@latest
echo 'export PATH=$PATH:/home/go/bin' >> .bash_profile
bash
# Go v1.23.3のインストール
go1.23.3 install
# derperのインストール
go1.23.3 install tailscale.com/cmd/derper@latest
# sudoで動くようにする
sudo cp ~/go/bin/derper /usr/bin/
daemon化や自動更新については今回触れません
Firewallの設定
必要なポートは以下の通り. Lightsail側のFWを開けておく
- HTTP : TCP/80
- HTTPS : TCP/443
- STUN : UDP/3478
DERPサーバを起動する
sudo derper --hostname=<ホスト>.<ドメイン> --verify-clients
--verify-clients
を付けるとDERPサーバと同じtailnetに接続しているノードのみリレーするよう認証できます
CloudflareにIPを登録する
Lightsailの場合,再起動ごとにIPv4アドレスが変更されてしまうため,実運用するなら何らかの方法でIPをAレコードに反映する必要があります.
- 静的IPをアタッチする(
有料無料) - 起動時にスクリプトでCF側のレコードを変更する
Tailscale側の設定
ACLを編集して先ほど作成したリレーサーバを追加する
公式のリレーサーバが有効になっているとそちらを経由してしまうので全部無効化
"derpMap": {
"OmitDefaultRegions": true, // Tailscale公式のDERP Serverを無効化
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "myderp",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"HostName": "<ホスト名>.<ドメイン>",
},
],
},
},
}
設定後,念の為Tailscaleを再接続
テスト
まずクライアント側の接続を確認してみる
❯ tailscale netcheck
Report:
* UDP: true
* IPv4: yes, REDACTED:REDACTED
* IPv6: no, but OS has support
* MappingVariesByDestIP:
* PortMapping:
* CaptivePortal: false
* Nearest DERP:
* DERP latency:
- myderp: 9.6ms ()
ちゃんとDERPサーバからレスポンスが返ってきている
次にリレー経由で疎通できるか確認してみる
# y-workstation-w(OCN) -> ts-derp-01(DERPサーバ)
❯ tailscale ping ts-derp-01
pong from ts-derp-01 (100.80.142.43) via DERP(myderp) in 8ms
pong from ts-derp-01 (100.80.142.43) via DERP(myderp) in 7ms
pong from ts-derp-01 (100.80.142.43) via DERP(myderp) in 9ms
pong from ts-derp-01 (100.80.142.43) via [REDACTED]:REDACTED in 7ms
# y-thinkpad-w(docomo) -> y-workstation-w(OCN)
❯ tailscale ping y-workstation-w
pong from y-workstation-w (100.102.59.109) via DERP(myderp) in 158ms
pong from y-workstation-w (100.102.59.109) via DERP(myderp) in 192ms
pong from y-workstation-w (100.102.59.109) via DERP(myderp) in 171ms
pong from y-workstation-w (100.102.59.109) via REDACTED:REDACTED in 74ms
P2P確立までちゃんとリレーを通っていることが確認できた
まとめ
レイテンシ的にはそこまで変わりませんでした(むしろ悪化した?)が,Tailscaleの仕組みを勉強できたのでOKです.
帯域幅テストができていないので不完全燃焼感はありますね...
-
もしかしたらv6だけでもリレーできるかも? 未検証 ↩