0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS LightsailにTailscale Custom DERP Serverを立ててリレーするまで

Last updated at Posted at 2024-11-25

DERP Serverとは?

  • Designated Encrypted Relay for Packetsの略
    • 指定パケット暗号化リレー(直訳)
  • TailscaleでP2P接続を確立できない場合に挟むリレー
    • P2P接続を確立するまでの間もリレーを経由する
    • リレーを流れる通信はWireGuardで暗号化されている
    • E2E暗号化なのでリレーサーバは通信内容を復号できない(はず)
  • 複数リージョンに展開されており,自動的に最短距離(低レイテンシ)のサーバが指定される

各DERP Serverのレイテンシはノード管理画面から確認できる
image.png

各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を登録する

CloudflareにA/AAAAレコードを追加
image.png

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です.
帯域幅テストができていないので不完全燃焼感はありますね...

  1. もしかしたらv6だけでもリレーできるかも? 未検証

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?