自建 Tailscale DERP 中继服务器完整指南
使用 Docker 部署自定义 DERP 服务器,支持域名反代和纯 IP 两种方案,配合 ACL 配置,支持 IPv6。
Tailscale 默认使用官方的 DERP 中继服务器,但在某些网络环境下延迟较高。自建 DERP 服务器可以显著降低中继延迟,特别是当你的节点分布在特定地区时。
前置条件
- 一台有公网 IP 的 VPS(建议选择延迟低的地区)
- 已安装 Docker 和 Docker Compose
- 域名并配置好 DNS 解析(方案一需要,方案二不需要)
- Nginx(或其他反向代理)处理 SSL(方案一需要,方案二不需要)
方案一:域名部署 DERP(反向代理模式)
Docker Compose 配置
创建 docker-compose.yml:
1 | services: |
关键配置说明
| 配置项 | 说明 |
|---|---|
network_mode: host | 必须。使用宿主机网络栈,支持 IPv6 和 STUN |
DERP_DOMAIN | 你的 DERP 服务器域名 |
DERP_ADDR | 监听地址和端口 |
DERP_VERIFY_CLIENTS | 设为 true 验证客户端身份,防止滥用 |
tailscaled.sock | 挂载 Tailscale socket,用于客户端验证 |
注意:
DERP_VERIFY_CLIENTS=true需要服务器上运行 Tailscale 客户端,并且挂载其 socket 文件。
启动服务
1 | docker compose up -d |
Nginx 反向代理配置
DERP 使用 WebSocket 进行通信,需要正确配置反向代理。
1 | server { |
重要配置解释
强制 WebSocket 头:
proxy_set_header Upgrade "websocket"和Connection "upgrade"是必须的,否则在 HTTP/2 下会出现 426 错误使用 HTTP/1.1:
proxy_http_version 1.1确保 WebSocket 正常工作关闭缓冲:
proxy_buffering off避免中继数据被缓存长超时:86400 秒(24 小时)保持连接不断开
重载 Nginx:
1 | sudo nginx -t && sudo nginx -s reload |
Tailscale ACL 配置
登录 Tailscale Admin Console,进入 Access Controls,添加 derpMap 配置:
1 | { |
配置说明
| 字段 | 说明 |
|---|---|
OmitDefaultRegions | 设为 true 禁用官方 DERP,只用自建的 |
RegionID | 自定义区域 ID,建议用 900+ 避免冲突 |
RegionCode | 区域代码,如 hkg、sgp、tyo |
HostName | DERP 服务器域名 |
DERPPort | DERP 端口,通过 Nginx 反代后是 443 |
STUNPort | STUN 端口,保持 3478 |
可选:指定 IP 地址
如果不想走 DNS 解析,可以直接指定 IP:
1 | { |
方案二:无域名部署 DERP(纯 IP 模式)
如果你没有域名,或者不想折腾 DNS 和 SSL 证书,可以直接用 IP 地址部署 DERP 服务器。这种方式使用 ip_derper 镜像,会自动生成自签名证书,无需 Nginx 反向代理。
Docker Compose 配置
创建 docker-compose.yml:
1 | services: |
关键配置说明
| 配置项 | 说明 |
|---|---|
ip_derper 镜像 | 基于官方 derper 修改,支持纯 IP 运行,自动生成自签名证书 |
DERP_ADDR | 监听端口,这里使用 55555 |
DERP_CERTS | 自签名证书存放路径(容器内部自动生成) |
DERP_VERIFY_CLIENTS | 设为 true 验证客户端身份,防止滥用 |
network_mode: host | 使用宿主机网络栈,支持 IPv6 和 STUN |
与域名版本的区别:无域名版本不需要配置 Nginx 反向代理,DERP 服务器直接暴露端口,使用自签名 TLS 证书。
启动服务
1 | docker compose up -d |
ACL 配置
登录 Tailscale Admin Console,进入 Access Controls,添加 derpMap 配置:
1 | { |
核心配置说明
| 字段 | 说明 |
|---|---|
OmitDefaultRegions | false 表示同时使用自建和官方 DERP;true 表示只用自建 |
IPv4 / IPv6 | 直接指定服务器 IP 地址,不走 DNS 解析 |
InsecureForTests | 核心配置:设为 true 允许跳过 TLS 证书校验(因为使用自签名证书) |
DERPPort | 与 DERP_ADDR 配置的端口一致,这里是 55555 |
STUNPort | STUN 端口,默认 3478;设为 -1 可禁用该节点的 STUN |
注意:
InsecureForTests虽然名称中包含 “ForTests”,但这是 Tailscale 官方提供的跳过 TLS 校验的正式配置项,在纯 IP 无域名场景下是必须的。
防火墙端口
| 端口 | 协议 | 用途 |
|---|---|---|
| 55555 | TCP | DERP 中继 |
| 3478 | UDP | STUN |
1 | # UFW 示例 |
验证 DERP 服务器
检查 DERP 状态
在任意 Tailscale 客户端执行:
1 | tailscale netcheck |
输出应显示你的自定义 DERP 区域及其延迟:
1 | Report: |
检查连接方式
1 | tailscale status |
如果显示 relay "hkg" 或类似内容,说明正在使用你的 DERP 中继。
开放防火墙端口
确保服务器防火墙允许以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 443 | TCP | HTTPS/DERP |
| 3478 | UDP | STUN |
1 | # UFW 示例 |
常见问题
Q: 状态显示 IPv6: No
检查以下几点:
- 服务器是否有 IPv6 地址
- DNS 是否配置了 AAAA 记录
- Docker 是否使用
network_mode: host - 防火墙是否放行 IPv6
Q: 426 Upgrade Required 错误
Nginx 配置问题,确保:
- 设置了
proxy_set_header Upgrade "websocket" - 设置了
proxy_set_header Connection "upgrade" - 使用
proxy_http_version 1.1
Q: 客户端验证失败
确保:
- 服务器上运行了 Tailscale 客户端
- 正确挂载了
/var/run/tailscale/tailscaled.sock - 容器有权限访问该 socket
总结
自建 DERP 服务器的优势:
- 降低中继延迟
- 提升数据隐私性
- 完全控制中继节点位置
- 支持 IPv6
配置要点:
- 使用
network_mode: host支持完整网络功能 - 方案一(域名):Nginx 反向代理需要正确配置 WebSocket 头
- 方案二(纯 IP):使用
ip_derper镜像 +InsecureForTests: true,无需域名和 Nginx - ACL 配置中可禁用官方 DERP 只用自建的
