部署 Tailscale Derper 自建中继服务器
Tailscale 是一个便捷的组网工具,可以将不同网络环境、甚至不同国家地区的设备连接到同一个虚拟局域网中。当 P2P 打洞失败时,流量会通过 Tailscale 的 DERP(Designated Encrypted Relay for Packets)中继节点进行转发。
由于官方的 DERP 服务器主要分布在国外,在某些网络环境下中转延迟会非常高,严重影响使用体验。通过自建 DERP 服务器,可以显著降低中转延迟,提高访问速度。
准备工作
在开始部署前,你需要准备:
- 服务器:一台具有公网 IP 的服务器(建议选择离你的使用地区最近的服务器)
- 域名:一个解析到服务器的域名(如
derper.example.com) - 防火墙配置:开放以下端口
- TCP 80(HTTP,用于证书验证)
- TCP 443(HTTPS,DERP 服务)
- UDP 3478(STUN 打洞)
如果使用中国大陆的服务器,域名需要完成 ICP 备案才能使用 80 和 443 端口。
方法一:Docker 部署(推荐)
Docker 部署方式更加简单快捷,适合大多数用户。我们使用 fredliang/derper 镜像。
安装 Docker
# 安装 Docker(以 Ubuntu 为例)
curl -fsSL https://get.docker.com | bash
# 启动 Docker 服务
sudo systemctl enable docker
sudo systemctl start docker创建 Docker Compose 配置
mkdir -p /opt/derper
cd /opt/derper创建 docker-compose.yml 文件:
version: '3.8'
services:
derper:
image: fredliang/derper
container_name: derper
restart: always
environment:
- DERP_CERT_MODE=manual # 使用手动证书
- DERP_ADDR=:443 # DERP 服务端口
- DERP_HTTP_PORT=80 # HTTP 端口(用于证书验证)
- DERP_STUN_PORT=3478 # STUN 端口
- DERP_DOMAIN=derper.example.com # 替换为你的域名
- DERP_VERIFY_CLIENTS=true # 启用客户端验证
ports:
- "443:443"
- "80:80"
- "3478:3478/udp"
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
- ./certs:/app/certs环境变量说明
| 变量名 | 必需 | 说明 | 默认值 |
|---|---|---|---|
| DERP_DOMAIN | 是 | DERP 服务器的域名 | your-hostname.com |
| DERP_CERT_DIR | 否 | 证书存放目录 | /app/certs |
| DERP_CERT_MODE | 否 | 证书模式:manual 或 letsencrypt | letsencrypt |
| DERP_ADDR | 否 | DERP 服务监听地址 | :443 |
| DERP_STUN | 否 | 是否启用 STUN 服务 | true |
| DERP_STUN_PORT | 否 | STUN 服务端口 | 3478 |
| DERP_HTTP_PORT | 否 | HTTP 服务端口,设置为 -1 可禁用 | 80 |
| DERP_VERIFY_CLIENTS | 否 | 通过本地 Tailscale 客户端验证连接者身份 | false |
使用自定义端口
如果 80/443 端口已被占用:
version: '3.8'
services:
derper:
image: fredliang/derper
container_name: derper
restart: always
environment:
- DERP_CERT_MODE=manual
- DERP_ADDR=:13477 # 自定义 DERP 端口
- DERP_HTTP_PORT=13476 # 自定义 HTTP 端口
- DERP_STUN_PORT=13478 # 自定义 STUN 端口
- DERP_DOMAIN=derper.example.com
- DERP_VERIFY_CLIENTS=true
ports:
- "13477:13477"
- "13476:13476"
- "13478:13478/udp"
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
- ./certs:/app/certs使用自定义端口时,后续在 Tailscale ACL 中配置 DERPPort 和 STUNPort 需要对应修改。
方法二:手动编译部署
安装 Golang
# 下载 Golang(以 1.22.0 为例)
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
# 解压到 /usr/local
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
go version编译 Derper
# 克隆 Tailscale 仓库
git clone https://github.com/tailscale/tailscale.git
cd tailscale
# 编译 derper
go build cmd/derper/derper.go
# 移动到系统路径
sudo mv derper /usr/sbin/derper创建 Systemd 服务
创建 /etc/systemd/system/derper.service:
[Unit]
Description=Tailscale Derper
Wants=network-pre.target
After=network-pre.target NetworkManager.service systemd-resolved.service
[Service]
ExecStart=/usr/sbin/derper \
--hostname=derper.example.com \
-a :443 \
-http-port 80 \
-certmode letsencrypt \
--certdir /var/lib/derper/certs \
-verify-clients
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target参数说明:
| 参数 | 说明 |
|---|---|
| --hostname | 你的域名 |
| -a | DERP 服务监听地址 |
| -http-port | HTTP 端口,用于 Let’s Encrypt 证书验证 |
| -certmode | 证书模式,letsencrypt 为自动申请,manual 为手动管理 |
| --certdir | 证书存放目录 |
| -verify-clients | 启用客户端验证(防止被白嫖) |
启动服务
# 创建证书目录
sudo mkdir -p /var/lib/derper/certs
# 重载 systemd 配置
sudo systemctl daemon-reload
# 启动并设置开机自启
sudo systemctl enable derper
sudo systemctl start derper
# 查看服务状态
sudo systemctl status derper证书管理
自动申请证书(Let's Encrypt)
Docker 方式:
environment:
- DERP_CERT_MODE=letsencrypt
- DERP_ADDR=:443
- DERP_HTTP_PORT=80手动编译方式:
ExecStart=/usr/sbin/derper \
--hostname=derper.example.com \
-a :443 \
-http-port 80 \
-certmode letsencrypt \
--certdir /var/lib/derper/certs手动管理证书
证书文件命名规则:
域名.crt(完整证书链)域名.key(私钥)
例如:derper.example.com.crt 和 derper.example.com.key
放置位置:
- Docker:
./certs/目录 - 手动编译:
/var/lib/derper/certs/目录
客户端验证
启用客户端验证后,只有你的 Tailscale 网络中的设备才能使用该 Derper 服务器。
安装 Tailscale 客户端
# 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# 启动并加入网络
sudo tailscale up启用验证
Docker 方式:确保 docker-compose.yml 中包含:
environment:
- DERP_VERIFY_CLIENTS=true
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock手动编译方式:在 systemd 服务文件中添加 -verify-clients 参数,然后重启服务。
配置 Tailscale
修改 Access Controls
访问 Tailscale Admin Console,在 Access Controls 中添加自定义 DERP 配置:
{
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "myderp",
"RegionName": "My Custom Derper",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"HostName": "derper.example.com",
"DERPPort": 443,
"STUNPort": 3478,
"STUNOnly": false
}
]
}
}
}
}配置说明:
| 字段 | 说明 |
|---|---|
| RegionID | 自定义 ID,建议使用 900+ 避免与官方冲突 |
| RegionCode | 区域代码,可自定义 |
| RegionName | 显示名称,可使用中文 |
| HostName | Derper 服务器域名 |
| DERPPort | DERP 服务端口(默认 443) |
| STUNPort | STUN 服务端口(默认 3478) |
| OmitDefaultRegions | 是否禁用官方服务器(建议保留作为备用) |
禁用官方 DERP 服务器(可选)
如果只使用自建服务器,可以将特定官方服务器设为 null:
{
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
// ... 你的自建服务器配置 ...
},
"1": null,
"2": null,
"3": null
}
}
}⚠️ 不建议完全禁用所有官方服务器,以防自建服务器故障时 Tailscale 完全不可用。
测试验证
检查网络状态
tailscale netcheck成功输出示例:
Report:
* UDP: true
* IPv4: yes, 1.2.3.4:41234
* IPv6: yes, [2001:db8::1]:41234
* MappingVariesByDestIP: false
* PortMapping: UPnP, NAT-PMP
* CaptivePortal: false
* Nearest DERP: My Custom Derper
* DERP latency:
- myderp: 15ms (My Custom Derper)
- tok: 85ms (Tokyo)
- hkg: 42ms (Hong Kong)测试连接延迟
tailscale ping <设备名称或IP>
tailscale netcheck检查服务器日志
Docker 方式:
docker logs -f derper手动编译方式:
sudo journalctl -u derper -f成功连接日志:
derper: accepting connection from 100.64.1.2:41234
derper: serving client 100.64.1.2常见问题
1. 证书验证失败
问题:Let's Encrypt 证书申请失败
解决方法:
- 确认域名已正确解析到服务器 IP
- 确认防火墙已开放 80 端口
- 检查是否有其他服务占用 80 端口
- 查看服务日志排查具体错误
2. 客户端无法连接
问题:tailscale netcheck 看不到自建服务器
解决方法:
- 确认 Tailscale ACL 配置已保存
- 等待几分钟让配置生效
- 重启客户端 Tailscale 服务
- 检查服务器防火墙是否正确开放端口
3. DERP 验证失败
问题:启用 verify-clients 后无法连接
解决方法:
- 确认服务器上 Tailscale 客户端已启动并加入网络
- 检查
/var/run/tailscale/tailscaled.sock是否存在 - Docker 方式确认 socket 文件已正确挂载
- 查看日志确认验证流程
4. 使用自定义端口后无法连接
问题:修改端口后服务不可用
解决方法:
- 确认防火墙已开放对应端口
- 确认 ACL 中 DERPPort 和 STUNPort 已对应修改
- 使用
telnet或nc测试端口连通性
注意事项
1.如果开启了客户端验证
- DERP_VERIFY_CLIENTS=trueTIP
需要服务器和设备在同一个网络里面,先在本地安装和连接 tailscale, 确保连接成功后再去启动 docker/derper
如果已经先运行 docker 再安装 tailscale,重启 docker 时,挂载的 .sock 文件可能会访问冲突
这时候先把 .sock 文件删除,重新运行 tailscale 自动生成后,再重启 docker
2.故障排查
TIP
tailscale netcheck 检查自建节点是否存在
tailscale status 可以查看节点是否正常运行
访问 <your-domain>/derp 可以查看更多信息
不可使用反代
总结
通过自建 Tailscale Derper 服务器,可以有效降低中转延迟,提升网络体验。
- Docker 部署:简单快捷,适合快速上手
- 手动编译:灵活性更高,可定制化
建议生产环境中启用客户端验证和自动证书续期,确保服务的安全性和稳定性。同时保留部分官方 DERP 服务器作为备用,避免单点故障。