Skip to content

部署 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

bash
# 安装 Docker(以 Ubuntu 为例)
curl -fsSL https://get.docker.com | bash

# 启动 Docker 服务
sudo systemctl enable docker
sudo systemctl start docker

创建 Docker Compose 配置

bash
mkdir -p /opt/derper
cd /opt/derper

创建 docker-compose.yml 文件:

yaml
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 或 letsencryptletsencrypt
DERP_ADDRDERP 服务监听地址:443
DERP_STUN是否启用 STUN 服务true
DERP_STUN_PORTSTUN 服务端口3478
DERP_HTTP_PORTHTTP 服务端口,设置为 -1 可禁用80
DERP_VERIFY_CLIENTS通过本地 Tailscale 客户端验证连接者身份false

使用自定义端口

如果 80/443 端口已被占用:

yaml
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

bash
# 下载 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

bash
# 克隆 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

ini
[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你的域名
-aDERP 服务监听地址
-http-portHTTP 端口,用于 Let’s Encrypt 证书验证
-certmode证书模式,letsencrypt 为自动申请,manual 为手动管理
--certdir证书存放目录
-verify-clients启用客户端验证(防止被白嫖)

启动服务

bash
# 创建证书目录
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 方式:

yaml
environment:
  - DERP_CERT_MODE=letsencrypt
  - DERP_ADDR=:443
  - DERP_HTTP_PORT=80

手动编译方式:

ini
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/ 目录
  • 手动编译:/var/lib/derper/certs/ 目录

客户端验证

启用客户端验证后,只有你的 Tailscale 网络中的设备才能使用该 Derper 服务器。

安装 Tailscale 客户端

bash
# 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh

# 启动并加入网络
sudo tailscale up

启用验证

Docker 方式:确保 docker-compose.yml 中包含:

yaml
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 配置:

json
{
  "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显示名称,可使用中文
HostNameDerper 服务器域名
DERPPortDERP 服务端口(默认 443)
STUNPortSTUN 服务端口(默认 3478)
OmitDefaultRegions是否禁用官方服务器(建议保留作为备用)

禁用官方 DERP 服务器(可选)

如果只使用自建服务器,可以将特定官方服务器设为 null

json
{
  "derpMap": {
    "OmitDefaultRegions": false,
    "Regions": {
      "900": {
        // ... 你的自建服务器配置 ...
      },
      "1": null,
      "2": null,
      "3": null
    }
  }
}

⚠️ 不建议完全禁用所有官方服务器,以防自建服务器故障时 Tailscale 完全不可用。


测试验证

检查网络状态

bash
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)

测试连接延迟

bash
tailscale ping <设备名称或IP>
tailscale netcheck

检查服务器日志

Docker 方式:

bash
docker logs -f derper

手动编译方式:

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

注意事项

1.如果开启了客户端验证

yaml
- DERP_VERIFY_CLIENTS=true

TIP

  • 需要服务器和设备在同一个网络里面,先在本地安装和连接 tailscale, 确保连接成功后再去启动 docker/derper

  • 如果已经先运行 docker 再安装 tailscale,重启 docker 时,挂载的 .sock 文件可能会访问冲突

  • 这时候先把 .sock 文件删除,重新运行 tailscale 自动生成后,再重启 docker

2.故障排查

TIP

  • tailscale netcheck 检查自建节点是否存在

  • tailscale status 可以查看节点是否正常运行

  • 访问 <your-domain>/derp 可以查看更多信息

  • 不可使用反代


总结

通过自建 Tailscale Derper 服务器,可以有效降低中转延迟,提升网络体验。

  • Docker 部署:简单快捷,适合快速上手
  • 手动编译:灵活性更高,可定制化

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


原文地址:https://catcat.blog/2025/12/deploy-tailscale-derper