用 VPS 给 Tailscale 网络加一个稳定中继节点
用 VPS 给 Tailscale 网络加一个稳定中继节点
Tailscale 在某些网络环境下直连不稳定,默认走官方 DERP 服务器延迟又高。如果你有一台公网 VPS 已经在 tailnet 里,可以把它配置成 Peer Relay 节点,让其他设备借道它中转——延迟比 DERP 低得多,吞吐量接近直连。
本文记录实际操作过程,包括遇到的几个坑。
背景:Tailscale 的两种中继机制
DERP(Designated Encrypted Relay for Packets)是 Tailscale 的兜底中继,走 HTTPS/WebSocket,全球分布,但延迟受制于地理位置和官方服务器负载。
Peer Relay 是 v1.86 引入的新机制,用 tailnet 内的普通节点做中继,走原生 WireGuard UDP,延迟更低,吞吐量更高。连接优先级是:
直接连接(NAT 穿透)→ Peer Relay → DERP也就是说,配好 Peer Relay 之后,Tailscale 会在直连失败时优先走它,而不是绕到 DERP。
前提条件
- VPS 已加入 tailnet(
tailscale up过) - Tailscale 版本 >= 1.86(
tailscale version确认) - 云厂商安全组能放行 UDP 端口
本文使用的 VPS 是阿里云,在 NAT 后面(eth0 是内网 IP,公网 IP 通过安全组映射)。
第一步:允许当前用户免 sudo 操作 tailscale
tailscale set 默认需要 root,先设置一次免 sudo:
sudo tailscale set --operator=$USER后续所有 tailscale set 命令都不需要 sudo 了。
第二步:开启 Peer Relay 并广播静态端点
tailscale set --relay-server-port=40000
tailscale set --relay-server-static-endpoints=<YOUR_VPS_PUBLIC_IP>:40000--relay-server-port 指定监听的 UDP 端口,--relay-server-static-endpoints 告诉其他节点去哪里连接这台中继。
坑:如果后续执行了 tailscale up(比如打标签),这两项配置会被重置,需要重新执行上面两条命令。
验证配置是否生效:
tailscale debug prefs | grep -A5 -i relay输出应包含:
"RelayServerPort": 40000,
"RelayServerStaticEndpoints": [
"<YOUR_VPS_PUBLIC_IP>:40000"
],验证 tailscaled 是否在监听:
ss -ulnp | grep 40000第三步:开放安全组端口
在云厂商控制台,给 VPS 的安全组添加入站规则:
| 协议 | 端口 | 来源 |
|---|---|---|
| UDP | 40000 | 0.0.0.0/0 |
VPS 本地防火墙(iptables/ufw)通常不需要额外配置,tailscaled 会自己处理。
从本机验证端口是否可达:
nc -vzu <YOUR_VPS_PUBLIC_IP> 40000
# Connection to <YOUR_VPS_PUBLIC_IP> port 40000 [udp/safetynetp] succeeded!第四步:配置 ACL 授权
Peer Relay 需要在 tailnet 的访问控制策略里明确授权。进入 Tailscale 管理后台 → Access Controls,在 JSON 编辑器里做两处修改:
1. 添加 tagOwners(取消注释并填入):
"tagOwners": {
"tag:relay-server": ["autogroup:admin"],
},2. 在 grants 里新增一条:
"grants": [
{"src": ["*"], "dst": ["*"], "ip": ["*"]},
{"src": ["autogroup:member"], "dst": ["tag:relay-server"], "app": {"tailscale.com/cap/relay": [{}]}},
],保存即生效。
第五步:给 VPS 打标签
坑:tailscale set 没有 --advertise-tags 参数,必须用 tailscale up:
tailscale up --advertise-tags=tag:relay-server打完标签后,节点归属会从用户账号变为 tag,在 tailscale status 里显示为 <your-vps>.xxx.ts.net 而非 user@,这是正常现象。
注意:tailscale up 会重置 relay 配置(见第二步的坑),打完标签后需要重新执行:
tailscale set --relay-server-port=40000
tailscale set --relay-server-static-endpoints=<YOUR_VPS_PUBLIC_IP>:40000验证效果
在另一台设备上 ping VPS 节点:
tailscale ping <your-vps>正常输出:
pong from <your-vps> (<VPS_TAILSCALE_IP>) via DERP(sfo) in 1.89s
pong from <your-vps> (<VPS_TAILSCALE_IP>) via peer-relay(<YOUR_VPS_PUBLIC_IP>:40000:vni:2) in 269ms
pong from <your-vps> (<VPS_TAILSCALE_IP>) via <YOUR_VPS_PUBLIC_IP>:41641 in 267ms可以看到连接路径的协商过程:第一跳先通过 DERP,接着切换到 Peer Relay(延迟从 1.89s 降到 269ms),最终升级为直连。
总结
整个配置归纳为几个关键点:
tailscale set --operator=$USER免 sudo- 设置 relay port 和 static endpoints
- 安全组放行 UDP 端口
- ACL 里添加
tagOwners和 relaygrants tailscale up --advertise-tags=tag:relay-server打标签- 打标签后重新设置 relay 配置(因为
tailscale up会重置)
配置完成后 Tailscale 会自动在合适时机走 Peer Relay,不需要任何客户端改动。
Member discussion