前言
在好久以前我們介紹過了 Tailscale 這款建立內網工具,從那之後我就一直用著。但是一直有一點非常不滿意,直到近期達到了高峰。
我們都知道,但 Tailscale 裝置跟裝置可能因為 NAT 問題無法建立自己的私人連線時,就會仰賴中繼伺服器,也稱為 DERP。這個伺服器通常是由 Tailscale 在全世界各地建置的。但由於今年初台灣連向國外的各種海纜大爆炸,因此造成在使用這些伺服器時,卡頓到非常不像話。
因此我就在尋找官方的文章,看看 DERP 伺服器能不能自己建置,這樣就不用仰賴別人所建置的,在延遲與資料安全來說會更有保障。結果官方還真的有提供這樣的方法,這篇文章就要來介紹他。
行前說明
建立自己的 DERP 伺服器時,我們需要準備一台伺服器,這台伺服器上須要有獨立的 IPv4 及 IPv6 位址,缺一不可。且需要對外開啟以下的 Port:
| 協定 | 埠號 | 說明 |
|---|---|---|
| TCP | 80 | 用於 HTTP |
| TCP | 443 | 用於 HTTPS |
| UDP | 3478 | 用於 STUN |
準備就緒後,就要開始安裝 DERP 伺服器了!
註:其實 HTTP 是可以被關閉的,而 HTTPS 及 STUN 也可以改到其他 Port,敬請參考這篇文章:自定義自架 Tailscale DERP 的服務 Port。
安裝 Go
DERP 是由 Go 所寫出來的,所以我們必須先在我們的 Linux 上安裝 Go。你可以到 這裡 下載 Go 的安裝檔,並到 這裡 看安裝 Go 的教學。
安裝 DERP
安裝 DERP 相當簡單,在你安裝完 Go 之後,只需要一行命令就能將當安裝好。
go install tailscale.com/cmd/derper@main
執行 DERP
在我們開始執行 DERP之前,我們需要先有一個網域或子網域,並將該網域使用 A 及 AAAA 紀錄綁上你的 IPv4 及 IPv6 位址。接著就可以用以下命令來啟動啦!他會自動為你的網域生成一張 SSL 憑證。
sudo derper --hostname=derp.example.com
使用瀏覽器打開該網域,你就會看到一個歡迎頁面,代表他運作正常哦。

但是這樣的啟動方式有一個小問題,任何人都可以使用這個 DERP 伺服器,因此如果你只想讓你帳號的設備來使用,你必須先安裝 Tailscale,也就是之前的 這篇 教學文章。
在安裝完 Tailscale 之後,就可以使用以下命令來啟動啦!
sudo derper --hostname=derp.example.com --verify-clients
包成服務
在上面的步驟,我們是直接在終端機執行 derper 命令,但如果想要把它丟到背景,我們可以把它包成一個服務。
在 /etc/systemd/system 底下新增一個檔案 derpsvc.service。
sudo vim /etc/systemd/system/derpsvc.service
貼上以下內容(請做適當修改):
[Unit]
Description=Tailscale Derp Server
After=multi-user.target
[Service]
User=root
Type=simple
ExecStart=/root/go/bin/derper --hostname derp.example.com
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
接著讓系統重新載入設定檔。
sudo systemctl daemon-reload
現在,你可以透過以下命令控制這個 DERP 服務囉!
sudo systemctl start derpsvc # 啟動服務
sudo systemctl restart derpsvc # 重新啟動服務
sudo systemctl stop derpsvc # 停止服務
sudo systemctl enable derpsvc # 開機自動執行此服務
sudo systemctl disable derpsvc # 開機不執行此服務(預設)
新增 DERP 到 Tailnet
當我們設定完後,此時你的機器仍然不會使用這個 DERP,我們必須管理介面的 Access Controls 新增他。
在文件的最後加上以下內容(以下為我的設定,請適當的修改):
{
"derpMap": {
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "tpe",
"RegionName": "Taipei",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"HostName": "derp.example.com",
"IPv4": "127.0.0.1",
"IPv6": "::1"
}
]
}
}
}
}
我們需要為每台 DERP 伺服器給予專屬 ID,而 Tailscale 將 900 ~ 999 都設為保留可自訂使用的範圍。RegionCode 及 RegionName 則是你為該節點取的名字。HostName 則是我們剛剛使用的網域。
設定完保存後,你應該就能在管理介面的設備中,看到他出現囉!

只使用自己的 DERP 伺服器
如果你只想使用自己的 DERP 伺服器,你可以在 derpMap 中加上以下內容:
{
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {}
}
}
當加上 OmitDefaultRegions 時,你的機器就不會再使用 Tailscale 所提供的 DERP 伺服器,但你也必須要在 Regions 中加上你自己的,這麼一來就都會強制使用你自己的 DERP 伺服器囉!
移除 DERP 伺服器
大部分的 DERP 伺服器都應該是由 Tailscale 提供,而官方有提供他的伺服器列表:https://controlplane.tailscale.com/derpmap/default 。
在裡面,你可以看到各個節點的名稱以及各自的 ID,如果我們想要禁用某些伺服器,我們可以在 ACL 中的 derpMap 加上以下內容:
{
"derpMap": {
"Regions": {
"1": null,
"2": null
}
}
}
上面的命令,就是我們禁用了 ID 為 1 與 2 的 DERP 伺服器,對照上官方給的伺服器列表,也就是紐約及舊金山。
結語
這篇文章看起來又把 Tailscale 玩出新的高度囉,真的覺得這個軟體設計的很厲害,能讓我鑽研這麼久並一直自定義成我喜歡的樣子,由衷佩服 Tailscale 的開發團隊!