Tailscale 的兩台裝置沒辦法直連時,流量會改走官方的 DERP 中繼伺服器。台灣沒有 DERP 區域,中繼通常要繞到香港或東京,而且 DERP 有頻寬限制,傳大檔案、看影片或經由 Subnet Router 存取內網時特別慢。
Peer Relay 讓你指定 tailnet 裡的一台裝置當中繼:直連失敗時,先改經這台裝置轉送,找不到可用的 Peer Relay 才退回 DERP。中繼的位置與頻寬由你決定,通常比 DERP 快很多。
本文依 2026 年 10 月的 Tailscale 官方文件整理,CLI 範例以 Tailscale v1.104 為準。
三種連線方式的差別
| 方式 | 經過哪裡 | 協定 | 速度 |
|---|---|---|---|
| 直連 | 兩台裝置之間直接傳送 | UDP | 最快 |
| Peer Relay | tailnet 裡你指定的裝置 | UDP | 多一跳,通常比 DERP 快很多 |
| DERP | Tailscale 官方的 DERP 伺服器 | TCP | 最慢,頻寬有限制 |
三種方式都是端對端的 WireGuard 加密,Peer Relay 和 DERP 一樣看不到流量的內容,差別只在效能。
連線的優先順序是:能直連就直連;直連失敗時,先試可用的 Peer Relay;都不行才用 DERP。Tailscale 會持續嘗試直連,打洞成功就從 Peer Relay 切回直連。為什麼直連會失敗、怎麼先試著改善網路讓它直連,見 直連與 DERP 中繼。
Peer Relay 不是用來取代 DERP 的:DERP 仍然負責建立連線前的協調,也是最後的備援。
什麼時候需要 Peer Relay
- 裝置在改不了設定的網路裡:公司防火牆、雲端的 NAT gateway、hard NAT,讓連線只能走 DERP。
- 流量大:傳大檔案、串流影片,或經由 Subnet Router、Exit Node 存取整個網段,DERP 的頻寬不夠用。
- DERP 太遠:從台灣繞到香港、東京再回來,延遲明顯。
如果 tailscale status 顯示已經是 direct,就不需要 Peer Relay。
需求
- 當 Peer Relay 的裝置:Tailscale v1.86 以上;iOS、Apple TV、Android 以外的作業系統都可以;頻寬夠、延遲低;有一個其他裝置連得到的 UDP 埠。
- 使用 Peer Relay 的裝置:Tailscale v1.86 以上,作業系統沒有限制(iOS、Apple TV 也可以);要連得到 Peer Relay 的 UDP 埠。
- 帳號:所有方案都能使用;設定存取規則需要 Owner、Admin 或 Network admin 權限。
規劃:哪台當 Peer Relay
Peer Relay 要讓雙方都連得到,所以最好放在有公開 IP、UDP 不被擋的地方:
- 雲端 VPS:最省事。要讓台灣的裝置延遲低,選台灣或鄰近的區域,例如 Google Cloud 的
asia-east1(台灣)。 - 家裡或辦公室有固定 IP 的主機:在路由器上把 relay 的 UDP 埠轉送到這台,再搭配下面的 static endpoint。
- 雲端裡的機器自己當 Peer Relay:機器只開一個 UDP 埠給 Peer Relay,其他入站全部關掉,見後面的「用自己當 Peer Relay」。
放在誰附近也有關係。例如要從台灣存取一台在美國雲端、只能走 DERP 的伺服器,Peer Relay 放在同一個雲端區域,比繞到其他地方的 DERP 快得多;官方也建議依地理區域配置 Peer Relay。
設定步驟
步驟一:在 Peer Relay 裝置上開啟
在要當 Peer Relay 的裝置上指定 UDP 埠(以 40000 為例):
tailscale set --relay-server-port=40000設成 0 會隨機挑一個沒用到的埠,但之後不好設定防火牆,建議指定固定的埠。
接著讓這個埠連得到:
- 本機防火牆:例如
ufw allow 40000/udp。 - 雲端:在安全群組(security group)或防火牆規則放行 UDP
40000。 - 在路由器後面:設定連接埠轉送。
步驟二:連接埠轉送或負載平衡器後面要加 static endpoint
Peer Relay 會自動找出自己的對外位址,但在連接埠轉送或 AWS NLB 這類負載平衡器後面,可能找不到所有能用的位址。這時用 --relay-server-static-endpoints 直接告訴其他裝置要連哪裡,可以列多個,用逗號分隔:
tailscale set --relay-server-port=40000 \
--relay-server-static-endpoints="203.0.113.10:40000"IPv6 位址要加方括號,例如 [2001:db8::1]:40000。
步驟三:用 grant 指定誰可以用
只開 relay 埠還不夠,要在 Admin console 的 Access controls 加上 grant,用 tailscale.com/cap/relay 指定哪些裝置可以使用這台 Peer Relay。先替 Peer Relay 加上 tag(例如 tag:relay),在嚴格 NAT 後面的裝置也加上 tag(例如 tag:office):
{
"tagOwners": {
"tag:relay": ["autogroup:admin"],
"tag:office": ["autogroup:admin"]
},
"grants": [
{
"src": ["tag:office"],
"dst": ["tag:relay"],
"app": {
"tailscale.com/cap/relay": []
}
}
]
}src:在嚴格 NAT 或防火牆後面、需要透過 Peer Relay 才連得到的裝置。dst:當 Peer Relay 的裝置。可以寫 tag、機器名稱、IP set 或 Tailscale IP。tailscale.com/cap/relay不需要參數,留空陣列即可。
這條 grant 的意思是:其他裝置要和 tag:office 的裝置連線時,可以經過 tag:relay 轉送。所以不必把每一台會連進來的筆電、手機都寫進 src,只要寫「難連的那一端」。
這條 grant 只授權 Peer Relay 的轉送,不會讓任何人多連到什麼服務。其他裝置能不能存取 tag:office 上的服務,仍由原本的存取規則決定,例如:
{
"src": ["autogroup:member"],
"dst": ["tag:office"],
"ip": ["tcp:80", "tcp:443"]
}也不需要另外開一條規則讓裝置「存取」Peer Relay 本身。Tag 的設定方式見 Tags 與 auth key,grant 的寫法見 ACL / Grants 入門。
src 不要用 *
官方特別提醒,src 不要寫 * 這類範圍太大的目標,否則所有裝置都會嘗試經過 Peer Relay,流量繞遠路、延遲反而變高。src 應該是位置固定、在嚴格 NAT 或防火牆後面的裝置,例如公司或雲端裡的機器;常常換網路的筆電、手機通常不適合放在 src。
步驟四:確認流量走 Peer Relay
先產生一些流量(例如連到對方的服務,或用 tailscale ping),再查看連線狀態:
tailscale status | grep peer-relay100.64.0.3 office-nas alice@ linux active; peer-relay 203.0.113.10:40000:vni:7, tx 1048576 rx 2097152狀態從 relay "hkg" 變成 peer-relay <位址>:<埠>:vni:<編號>,就代表改走 Peer Relay 了。tailscale ping 會顯示 via peer-relay(...):
pong from office-nas (100.64.0.3) via peer-relay(203.0.113.10:40000:vni:7) in 12ms如果還是 direct,代表兩邊本來就能直連,不需要 Peer Relay;如果還是 relay "<區域>",檢查 relay 的 UDP 埠是不是真的連得到、grant 的 src 有沒有包含難連的那一端、兩邊的版本是不是 v1.86 以上。指令的判讀方式見 用 tailscale netcheck 與 tailscale ping 診斷連線。
多台 Peer Relay
可以設定多台 Peer Relay,例如每個雲端區域各一台。需要中繼時,裝置會向所有可用的 Peer Relay 建立路徑,再依量到的延遲選擇最快的一條;直連成功的話,一律優先使用直連。
沒辦法直接指定某一條連線要走哪台 Peer Relay,但可以用 grant 控制哪些裝置可以使用哪些 Peer Relay,例如讓 tag:us-east-vpc 只能用 tag:us-east-relays:
{
"src": ["tag:us-east-vpc"],
"dst": ["tag:us-east-relays"],
"app": {
"tailscale.com/cap/relay": []
}
}用自己當 Peer Relay
裝置也可以當自己的 Peer Relay:src 和 dst 寫同一台。適合雲端主機只想開一個固定的 UDP 埠、其他入站全部關掉的情況:
{
"src": ["us-west-1"],
"dst": ["us-west-1"],
"app": {
"tailscale.com/cap/relay": []
}
}同樣要在這台裝置上執行 tailscale set --relay-server-port=<埠>。
停用
在 Peer Relay 裝置上把埠設成空字串:
tailscale set --relay-server-port=""之後再把存取規則裡對應的 grant 移除。
安全性
- Peer Relay 只能轉送同一個 tailnet 裡的流量。
- 沒有
tailscale.com/cap/relaygrant 的裝置,無法在 Peer Relay 上建立中繼。 - 流量是端對端加密的,Peer Relay 只看得到加密後的封包,看不到內容。
- Peer Relay 的 UDP 埠要對外開放;放在公網上時,記得只開這一個埠,並讓 Tailscale 保持更新。