部署 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 镜像,这是一个已经打包好的 Derper Docker 镜像。
安装 Docker
如果你的服务器还没有安装 Docker 和 Docker Compose,请先安装:
# 安装 Docker(以 Ubuntu 为例)curl -fsSL https://get.docker.com | bash
# 启动 Docker 服务sudo systemctl enable dockersudo systemctl start docker创建 Docker Compose 配置
创建一个工作目录并编写 docker-compose.yml:
mkdir -p /opt/derpercd /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/certsNOTE使用自定义端口时,后续在 Tailscale ACL 中配置
DERPPort和STUNPort需要对应修改。
方法二:手动编译部署
如果你希望更深入地了解 Derper 的运行机制,或者需要定制化编译,可以选择手动编译方式。
安装 Golang
Derper 是用 Go 语言编写的,需要先安装 Golang(建议 1.21 或更高版本):
# 下载 Golang(以 1.22.0 为例)wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
# 解压到 /usr/localsudo rm -rf /usr/local/gosudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
# 配置环境变量echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrcsource ~/.bashrc
# 验证安装go version编译 Derper
# 克隆 Tailscale 仓库git clone https://github.com/tailscale/tailscale.gitcd tailscale
# 编译 derpergo build cmd/derper/derper.go
# 移动到系统路径sudo mv derper /usr/sbin/derper创建 Systemd 服务
创建服务文件 /etc/systemd/system/derper.service:
[Unit]Description=Tailscale DerperWants=network-pre.targetAfter=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-clientsRestart=on-failureRestartSec=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 derpersudo systemctl start derper
# 查看服务状态sudo systemctl status derper证书管理
自动申请证书(Let’s Encrypt)
如果使用标准的 80/443 端口,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/目录(与 docker-compose.yml 同级) - 手动编译:
/var/lib/derper/certs/目录
客户端验证
为了防止自建的 Derper 服务器被其他人白嫖,强烈建议启用客户端验证功能。启用后,只有你的 Tailscale 网络中的设备才能使用该 Derper 服务器。
安装 Tailscale 客户端
在 Derper 服务器上安装 Tailscale 客户端:
# 安装 Tailscalecurl -fsSL https://tailscale.com/install.sh | sh
# 启动并加入网络sudo tailscale up启用验证
Docker 方式:
确保 docker-compose.yml 中包含:
environment: - DERP_VERIFY_CLIENTS=truevolumes: - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock手动编译方式:
在 systemd 服务文件中添加 -verify-clients 参数:
ExecStart=/usr/sbin/derper \ --hostname=derper.example.com \ -a :443 \ -http-port 80 \ -certmode letsencrypt \ --certdir /var/lib/derper/certs \ -verify-clients重启服务:
sudo systemctl daemon-reloadsudo systemctl restart derper配置 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 服务器(可选)
如果你希望只使用自建服务器,可以禁用官方 DERP:
{ "derpMap": { "OmitDefaultRegions": false, "Regions": { "900": { // ... 你的自建服务器配置 ... }, // 禁用特定官方服务器 "1": null, "2": null, "3": null, // ... 其他 ID ... // 建议保留一个作为备用 // "20": null, # Hong Kong,作为备选 } }}WARNING不建议完全禁用所有官方服务器,以防自建服务器故障时 Tailscale 完全不可用。
测试验证
配置完成后,在任意已连接 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)Nearest DERP 显示为你的自建服务器名称,说明配置成功。
测试连接延迟
tailscale ping <设备名称或IP>tailscale netcheckReport: * Time: 2025-12-30T02:39:55.29863832Z * UDP: true * IPv4: yes, ip:port * IPv6: no, but OS has support * MappingVariesByDestIP: false * PortMapping: * CaptivePortal: false * Nearest DERP: catcat-derp * DERP latency: - sa: 43.2ms (catcat-derp) - lax: 155.9ms (Los Angeles) - sea: 165.5ms (Seattle) - den: 169.7ms (Denver) - sfo: 172.9ms (San Francisco) - nue: 173.2ms (Nuremberg) - dfw: 177.9ms (Dallas) - hel: 182.8ms (Helsinki) - hkg: 184.2ms (Hong Kong) - hnl: 192.1ms (Honolulu) - iad: 194.7ms (Ashburn) - tor: 203.8ms (Toronto) - ord: 206.5ms (Chicago) - nyc: 207.6ms (New York City) - mia: 216.1ms (Miami) - tok: 216.2ms (Tokyo) - par: 220.2ms (Paris) - fra: 220.7ms (Frankfurt) - lhr: 225.3ms (London) - ams: 231.4ms (Amsterdam) - waw: 237.6ms (Warsaw) - mad: 238.4ms (Madrid) - sin: 248.2ms (Singapore) - syd: 291.3ms (Sydney) - sao: 335.8ms (São Paulo) - dbi: 340ms (Dubai) - blr: 344.4ms (Bangalore) - nai: 359.3ms (Nairobi) - jnb: 385.1ms (Johannesburg)观察 catcat-derp(取决于你的命名) 字样,表示流量正在通过你的自建 Derper 中转。
检查服务器日志
Docker 方式:
docker logs -f derper手动编译方式:
sudo journalctl -u derper -f成功的连接日志类似:
derper: accepting connection from 100.64.1.2:41234derper: 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测试端口连通性
总结
通过自建 Tailscale Derper 服务器,可以有效降低中转延迟,提升网络体验。Docker 部署方式简单快捷,适合快速上手;手动编译方式则提供了更多的灵活性和控制。
建议生产环境中启用客户端验证和自动证书续期,确保服务的安全性和稳定性。同时保留部分官方 DERP 服务器作为备用,避免单点故障导致网络不可用。