2335 字
12 分钟

部署 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,请先安装:

Terminal window
# 安装 Docker(以 Ubuntu 为例)
curl -fsSL https://get.docker.com | bash
# 启动 Docker 服务
sudo systemctl enable docker
sudo systemctl start docker

创建 Docker Compose 配置#

创建一个工作目录并编写 docker-compose.yml

Terminal window
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_DOMAINDERP 服务器的域名your-hostname.com
DERP_CERT_DIR证书存放目录/app/certs
DERP_CERT_MODE证书模式:manual(手动)或 letsencrypt(自动申请)letsencrypt
DERP_ADDRDERP 服务监听地址:443
DERP_STUN是否启用 STUN 服务true
DERP_STUN_PORTSTUN 服务端口3478
DERP_HTTP_PORTHTTP 服务端口,设置为 -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
NOTE

使用自定义端口时,后续在 Tailscale ACL 中配置 DERPPortSTUNPort 需要对应修改。

方法二:手动编译部署#

如果你希望更深入地了解 Derper 的运行机制,或者需要定制化编译,可以选择手动编译方式。

安装 Golang#

Derper 是用 Go 语言编写的,需要先安装 Golang(建议 1.21 或更高版本):

Terminal window
# 下载 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#

Terminal window
# 克隆 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:启用客户端验证(防止被白嫖)

启动服务#

Terminal window
# 创建证书目录
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)#

如果使用标准的 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.crtderper.example.com.key

将证书放置在:

  • Docker:./certs/ 目录(与 docker-compose.yml 同级)
  • 手动编译:/var/lib/derper/certs/ 目录

客户端验证#

为了防止自建的 Derper 服务器被其他人白嫖,强烈建议启用客户端验证功能。启用后,只有你的 Tailscale 网络中的设备才能使用该 Derper 服务器。

安装 Tailscale 客户端#

在 Derper 服务器上安装 Tailscale 客户端:

Terminal window
# 安装 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 参数:

ExecStart=/usr/sbin/derper \
--hostname=derper.example.com \
-a :443 \
-http-port 80 \
-certmode letsencrypt \
--certdir /var/lib/derper/certs \
-verify-clients

重启服务:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart derper

配置 Tailscale#

修改 Access Controls#

  1. 访问 Tailscale Admin Console
  2. 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 的客户端上测试:

检查网络状态#

Terminal window
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 显示为你的自建服务器名称,说明配置成功。

测试连接延迟#

Terminal window
tailscale ping <设备名称或IP>
tailscale netcheck
Terminal window
Report:
* 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 方式:

Terminal window
docker logs -f derper

手动编译方式:

Terminal window
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 中 DERPPortSTUNPort 已对应修改
  • 使用 telnetnc 测试端口连通性

总结#

通过自建 Tailscale Derper 服务器,可以有效降低中转延迟,提升网络体验。Docker 部署方式简单快捷,适合快速上手;手动编译方式则提供了更多的灵活性和控制。

建议生产环境中启用客户端验证和自动证书续期,确保服务的安全性和稳定性。同时保留部分官方 DERP 服务器作为备用,避免单点故障导致网络不可用。

部署 Tailscale Derper 自建中继服务器
https://catcat.blog/2025/12/deploy-tailscale-derper
作者
猫猫博客
发布于
2025-12-30
许可协议
CC BY-NC-SA 4.0