Tailscale 默认使用官方的 DERP 中继服务器,但在某些网络环境下延迟较高。自建 DERP 服务器可以显著降低中继延迟,特别是当你的节点分布在特定地区时。
前置条件
- 一台有公网 IP 的 VPS(建议选择延迟低的地区)
- 已安装 Docker 和 Docker Compose
- 域名并配置好 DNS 解析
- Nginx(或其他反向代理)处理 SSL
部署 DERP 服务器
Docker Compose 配置
创建 docker-compose.yml:
services: derper: container_name: derper image: fredliang/derper restart: always network_mode: host # 直接使用宿主机网络,支持 IPv6 environment: - DERP_DOMAIN=drp.example.com - DERP_ADDR=:19850 - DERP_HTTP_PORT=19850 - DERP_VERIFY_CLIENTS=true volumes: - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock关键配置说明
| 配置项 | 说明 |
|---|---|
network_mode: host | 必须。使用宿主机网络栈,支持 IPv6 和 STUN |
DERP_DOMAIN | 你的 DERP 服务器域名 |
DERP_ADDR | 监听地址和端口 |
DERP_VERIFY_CLIENTS | 设为 true 验证客户端身份,防止滥用 |
tailscaled.sock | 挂载 Tailscale socket,用于客户端验证 |
⚠️ 注意:
DERP_VERIFY_CLIENTS=true需要服务器上运行 Tailscale 客户端,并且挂载其 socket 文件。
启动服务
docker compose up -dNginx 反向代理配置
DERP 使用 WebSocket 进行通信,需要正确配置反向代理。
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name drp.example.com;
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
location ^~ / { proxy_pass http://127.0.0.1:19850;
# 核心:强制发送 WebSocket 头 # 解决 HTTP/2 下头丢失导致 426 错误的问题 proxy_set_header Upgrade "websocket"; proxy_set_header Connection "upgrade";
# 必须:协议版本与关闭缓存 proxy_http_version 1.1; proxy_buffering off;
# 基础头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port;
# 超时(保持长连接) proxy_read_timeout 86400s; proxy_send_timeout 86400s;
# 安全头 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; }}重要配置解释
强制 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:
sudo nginx -t && sudo nginx -s reloadTailscale ACL 配置
登录 Tailscale Admin Console↗,进入 Access Controls,添加 derpMap 配置:
{ // 自定义 DERP 服务器 "derpMap": { // 只使用自定义 DERP,禁用官方 DERP "OmitDefaultRegions": true, "Regions": { "900": { "RegionID": 900, "RegionCode": "hkg", "RegionName": "Tencent Cloud Hong Kong", "Nodes": [ { "Name": "hk1", "RegionID": 900, "HostName": "drp.example.com", "DERPPort": 443, "STUNPort": 3478 } ] } } }, "acls": [ { "action": "accept", "src": ["*"], "dst": ["*:*"] } ]}配置说明
| 字段 | 说明 |
|---|---|
OmitDefaultRegions | 设为 true 禁用官方 DERP,只用自建的 |
RegionID | 自定义区域 ID,建议用 900+ 避免冲突 |
RegionCode | 区域代码,如 hkg、sgp、tyo |
HostName | DERP 服务器域名 |
DERPPort | DERP 端口,通过 Nginx 反代后是 443 |
STUNPort | STUN 端口,保持 3478 |
可选:指定 IP 地址
如果不想走 DNS 解析,可以直接指定 IP:
{ "Name": "hk1", "RegionID": 900, "HostName": "drp.example.com", "IPv4": "43.161.214.236", "IPv6": "2001:db8::1", "DERPPort": 443, "STUNPort": 3478}验证 DERP 服务器
检查 DERP 状态
在任意 Tailscale 客户端执行:
tailscale netcheck输出应显示你的自定义 DERP 区域及其延迟:
Report: * UDP: true * IPv4: yes, ... * IPv6: yes, ... * DERP latency: - hkg: 25.3ms (Tencent Cloud Hong Kong)检查连接方式
tailscale status如果显示 relay "hkg" 或类似内容,说明正在使用你的 DERP 中继。
开放防火墙端口
确保服务器防火墙允许以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 443 | TCP | HTTPS/DERP |
| 3478 | UDP | STUN |
# UFW 示例sudo ufw allow 443/tcpsudo ufw allow 3478/udp常见问题
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 头
- ACL 配置中可禁用官方 DERP 只用自建的