自建 Tailscale DERP 中继服务器完整指南

使用 Docker 部署自定义 DERP 服务器,配合 Nginx 反向代理和 ACL 配置,支持 IPv6

周二 1月 21 2025
1033 字 · 6 分钟

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 文件。

启动服务

Terminal window
docker compose up -d

Nginx 反向代理配置

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";
}
}

重要配置解释

  1. 强制 WebSocket 头proxy_set_header Upgrade "websocket"Connection "upgrade" 是必须的,否则在 HTTP/2 下会出现 426 错误

  2. 使用 HTTP/1.1proxy_http_version 1.1 确保 WebSocket 正常工作

  3. 关闭缓冲proxy_buffering off 避免中继数据被缓存

  4. 长超时:86400 秒(24 小时)保持连接不断开

重载 Nginx:

Terminal window
sudo nginx -t && sudo nginx -s reload

Tailscale 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区域代码,如 hkgsgptyo
HostNameDERP 服务器域名
DERPPortDERP 端口,通过 Nginx 反代后是 443
STUNPortSTUN 端口,保持 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 客户端执行:

Terminal window
tailscale netcheck

输出应显示你的自定义 DERP 区域及其延迟:

Report:
* UDP: true
* IPv4: yes, ...
* IPv6: yes, ...
* DERP latency:
- hkg: 25.3ms (Tencent Cloud Hong Kong)

检查连接方式

Terminal window
tailscale status

如果显示 relay "hkg" 或类似内容,说明正在使用你的 DERP 中继。

开放防火墙端口

确保服务器防火墙允许以下端口:

端口协议用途
443TCPHTTPS/DERP
3478UDPSTUN
Terminal window
# UFW 示例
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp

常见问题

Q: 状态显示 IPv6: No

检查以下几点:

  1. 服务器是否有 IPv6 地址
  2. DNS 是否配置了 AAAA 记录
  3. Docker 是否使用 network_mode: host
  4. 防火墙是否放行 IPv6

Q: 426 Upgrade Required 错误

Nginx 配置问题,确保:

  1. 设置了 proxy_set_header Upgrade "websocket"
  2. 设置了 proxy_set_header Connection "upgrade"
  3. 使用 proxy_http_version 1.1

Q: 客户端验证失败

确保:

  1. 服务器上运行了 Tailscale 客户端
  2. 正确挂载了 /var/run/tailscale/tailscaled.sock
  3. 容器有权限访问该 socket

总结

自建 DERP 服务器的优势:

  • ✅ 降低中继延迟
  • ✅ 提升数据隐私性
  • ✅ 完全控制中继节点位置
  • ✅ 支持 IPv6

配置要点:

  • 使用 network_mode: host 支持完整网络功能
  • Nginx 反向代理需要正确配置 WebSocket 头
  • ACL 配置中可禁用官方 DERP 只用自建的

Thanks for reading!

自建 Tailscale DERP 中继服务器完整指南

周二 1月 21 2025
1033 字 · 6 分钟