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


引言:为什么需要自建 DERP?

Tailscale 是一款基于 WireGuard 的零配置 VPN 工具,它能让你的设备组成一个虚拟局域网。但在使用过程中,你可能会遇到以下问题:

  • 连接速度慢:官方 DERP 服务器都在海外,国内连接延迟高达 200-500ms
  • 稳定性差:高峰时段官方服务器可能拥挤,导致连接不稳定
  • 隐私顾虑:所有中继流量都经过 Tailscale 官方服务器
  • 企业合规:某些企业要求网络流量必须在内网环境

自建 DERP 服务器可以完美解决这些问题:延迟降低到 10-50ms,流量完全自主可控,还能节省官方免费额度的配额。

DERP 原理详解

什么是 DERP?

DERP 全称是 Defined Encrypted Relayed Protocol,即「定义加密中继协议」。它是 Tailscale 设计的一种专用中继协议,用于在设备无法直接 P2P 连接时进行流量中继。

Tailscale 连接建立过程

┌─────────────────────────────────────────────────────────────────────────┐
│                     Tailscale 连接建立流程                               │
└─────────────────────────────────────────────────────────────────────────┘

                    1. 注册与认证
    ┌──────────┐                      ┌──────────────┐
    │ 设备 A   │ ───────────────────▶ │ Tailscale    │
    │ (北京)   │ ◀─────────────────── │ Control      │
    └──────────┘       获取网络信息    │ Server       │
                                       └──────────────┘
    ┌──────────┐                              │
    │ 设备 B   │◀─────────────────────────────┘
    │ (上海)   │        分发节点信息
    └──────────┘

                    2. NAT 穿透尝试 (STUN/ICE)
    ┌──────────┐                      ┌──────────┐
    │ 设备 A   │ ═══════════════════▶ │ 设备 B   │  直接连接成功!
    │ (北京)   │     P2P 直连          │ (上海)   │  ✅ 最佳方案
    └──────────┘                      └──────────┘

                    3. NAT 穿透失败 → DERP 中继
    ┌──────────┐                      ┌──────────┐
    │ 设备 A   │ ╳    NAT 限制阻止     │ 设备 B   │
    │ (北京)   │                      │ (上海)   │
    └────┬─────┘                      └─────┬────┘
         │                                  │
         │          DERP 中继服务器          │
         │     ┌────────────────────┐      │
         └────▶│  DERP Server       │◀─────┘
               │  (加密转发流量)     │
               └────────────────────┘
                     ⚡ 延迟增加

DERP 的工作原理

  1. 协调阶段:Tailscale 控制服务器协调双方尝试直接连接
  2. 穿透尝试:使用 STUN/ICE 技术尝试 NAT 穿透
  3. 回退机制:如果直连失败,自动切换到 DERP 中继
  4. 持续优化:后台持续尝试直连,成功后自动切换回 P2P

加密机制

🔐 端到端加密

DERP 服务器只能看到加密后的数据,无法解密内容:

  • 基于 WireGuard 协议,使用 Noise 协议框架
  • 每个连接使用独立的临时密钥
  • DERP 服务器只负责转发,无法窃听流量

即使使用官方 DERP 服务器,你的数据也是安全的。但自建服务器能让你:

  • 完全掌控网络基础设施
  • 确保流量不离开你的网络环境
  • 满足企业合规要求

服务器要求

硬件配置

配置项 最低要求 推荐配置
CPU 1 核 2 核+
内存 512MB 1GB+
带宽 1Mbps 10Mbps+(取决于用户数)
存储 10GB 20GB+

端口要求

⚠️ 重要:必须开放的端口

自建 DERP 服务器需要开放以下端口:

  • 443/TCP - HTTPS 流量(标准端口,推荐)
  • 10315/TCP - DERP 协议端口(或你自定义的端口)
  • 2367/TCP - STUN 端口(可选,用于 NAT 穿透)

确保云服务商的安全组/防火墙也放行了这些端口。

服务器选择建议

选择服务器时,考虑以下因素:

  1. 地理位置:选择离你团队最近的机房
  2. 带宽质量:选择 BGP 多线或优质单线
  3. 网络稳定性:选择知名云服务商

💡 推荐配置

对于 5-10 人的小团队,国内云服务商的最轻量配置(1核1G)完全足够:

  • 阿里云轻量应用服务器 / 腾讯云轻量服务器
  • 带宽 3-5Mbps 即可满足日常使用
  • 成本约 30-50 元/月

搭建步骤

1 准备服务器环境

首先登录你的服务器,更新系统:

# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装必要工具
sudo apt install -y curl wget

2 安装 Tailscale

DERP 服务器需要 Tailscale 来验证客户端身份:

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

# 启动并登录 Tailscale
sudo tailscale up

# 查看状态
sudo tailscale status

3 下载并编译 derper

DERP 服务器程序是 Tailscale 开源项目的一部分:

# 安装 Go 语言(如果未安装)
sudo apt install -y golang-go

# 设置 Go 环境变量
echo 'export PATH=$PATH:/usr/local/go/bin:~/go/bin' >> ~/.bashrc
source ~/.bashrc

# 编译 derper
go install tailscale.com/cmd/derper@latest

# 查看编译结果
ls -la ~/go/bin/derper

# 移动到系统路径
sudo mv ~/go/bin/derper /usr/local/bin/
sudo chmod +x /usr/local/bin/derper

或者直接下载预编译的二进制:

# 下载最新版本(根据系统架构选择)
# Linux AMD64
wget https://pkgs.tailscale.com/derper/derper-linux-amd64 -O /usr/local/bin/derper
chmod +x /usr/local/bin/derper

# 验证安装
/usr/local/bin/derper --version

4 配置域名和证书

DERP 服务器需要 HTTPS 证书。推荐使用 Let's Encrypt 免费证书:

# 安装 certbot
sudo apt install -y certbot

# 申请证书(替换为你的域名)
sudo certbot certonly --standalone -d derp.yourdomain.com

# 证书路径
# 证书: /etc/letsencrypt/live/derp.yourdomain.com/fullchain.pem
# 私钥: /etc/letsencrypt/live/derp.yourdomain.com/privkey.pem

如果暂时没有域名,也可以使用自签名证书:

# 创建证书目录
sudo mkdir -p /etc/derper/certs

# 生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout /etc/derper/certs/key.pem \
  -out /etc/derper/certs/cert.pem -days 365 -nodes \
  -subj "/CN=你的服务器IP"

5 创建 systemd 服务

创建系统服务,让 derper 开机自启:

# 创建服务文件
sudo tee /etc/systemd/system/derper.service > /dev/null << 'EOF'
[Unit]
Description=Tailscale DERP Server
Documentation=https://tailscale.com/kb/1118/custom-derp-servers
After=network.target tailscaled.service
Requires=tailscaled.service

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/derper \
  --hostname=derp.yourdomain.com \
  --cert-dir=/etc/letsencrypt/live/derp.yourdomain.com \
  --verify-clients=true \
  --stun=true \
  --a=0.0.0.0:10315

Restart=on-failure
RestartSec=5s

# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/derper

[Install]
WantedBy=multi-user.target
EOF

# 创建数据目录
sudo mkdir -p /var/lib/derper

# 重载 systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl enable derper
sudo systemctl start derper

# 查看状态
sudo systemctl status derper

6 验证服务

检查 DERP 服务器是否正常运行:

# 检查端口监听
sudo ss -tlnp | grep derper

# 检查日志
sudo journalctl -u derper -f

# 测试 HTTPS 访问(替换为你的域名或 IP)
curl -v https://derp.yourdomain.com:10315/

# 应该看到类似输出:
# <html><body>DERP</body></html>

也可以在浏览器访问 https://derp.yourdomain.com:10315/,应该看到一个简单的 DERP 页面。


配置详解

derper 启动参数说明

参数 说明 示例
--hostname DERP 服务器域名(用于证书) --hostname=derp.example.com
--cert-dir 证书目录路径 --cert-dir=/etc/letsencrypt/live/derp.example.com
--a 监听地址和端口 --a=0.0.0.0:10315
--verify-clients 验证客户端身份(推荐开启) --verify-clients=true
--stun 启用 STUN 服务 --stun=true
--http-port HTTP 端口(默认 80) --http-port=-1(禁用)
--https-port HTTPS 端口(默认 443) --https-port=10315
--mesh-psk-file 预共享密钥文件(用于 DERP 集群) --mesh-psk-file=/etc/derper/psk

verify-clients 的重要性

🔒 安全建议

强烈建议开启 --verify-clients=true

  • 只有你 Tailscale 网络中的设备才能使用 DERP 服务器
  • 防止陌生人白嫖你的服务器
  • 需要 DERP 服务器也在你的 Tailscale 网络中

证书自动续期

Let's Encrypt 证书有效期 90 天,需要定期续期:

# 测试续期
sudo certbot renew --dry-run

# certbot 会自动添加续期任务
# 查看定时任务
sudo systemctl list-timers | grep certbot

防火墙配置示例

# UFW (Ubuntu)
sudo ufw allow 443/tcp
sudo ufw allow 10315/tcp
sudo ufw allow 2367/tcp

# firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=10315/tcp
sudo firewall-cmd --permanent --add-port=2367/tcp
sudo firewall-cmd --reload

客户端配置

添加自定义 DERP 服务器

有三种方式配置客户端使用你的 DERP 服务器:

方式一:通过管理控制台(推荐)

1. 登录 Tailscale 管理后台:https://login.tailscale.com/
2. 进入 Access Controls 页面
3. 编辑 ACL 文件,添加自定义 DERP 映射:
{
  "derpMap": {
    "OmitDefaultRegions": true,
    "Regions": {
      "900": {
        "RegionID": 900,
        "RegionCode": "myderp",
        "RegionName": "My DERP Server",
        "Nodes": [
          {
            "Name": "myderp",
            "RegionID": 900,
            "HostName": "derp.yourdomain.com",
            "DERPPort": 10315,
            "STUNPort": 2367,
            "STUNOnly": false,
            "DERPOnly": false
          }
        ]
      }
    }
  },
  // ... 其他 ACL 配置
}

配置说明:

  • OmitDefaultRegions: true - 禁用官方 DERP 服务器
  • OmitDefaultRegions: false - 保留官方 DERP 服务器(推荐)
  • RegionID - 区域 ID,900+ 为自定义 ID 范围
  • DERPPort - DERP 服务端口
  • STUNPort - STUN 服务端口(-1 表示禁用)

方式二:命令行配置(临时)

# macOS / Linux
sudo tailscale up --derp-map='{"OmitDefaultRegions":true,"Regions":{"900":{"RegionID":900,"RegionCode":"myderp","RegionName":"My DERP","Nodes":[{"Name":"myderp","RegionID":900,"HostName":"derp.yourdomain.com","DERPPort":10315,"STUNPort":2367}]}}}'

# Windows (PowerShell 管理员)
tailscale up --derp-map='{"OmitDefaultRegions":true,"Regions":{"900":{"RegionID":900,"RegionCode":"myderp","RegionName":"My DERP","Nodes":[{"Name":"myderp","RegionID":900,"HostName":"derp.yourdomain.com","DERPPort":10315,"STUNPort":2367}]}}}'

方式三:Headscale 用户

如果你使用 Headscale 自建控制服务器,在配置文件中添加:

# /etc/headscale/config.yaml
derp:
  server:
    enabled: true
    region_id: 900
    region_code: "myderp"
    region_name: "My DERP Server"
    listening_port: 10315
  
  urls:
    - https://derp.yourdomain.com:10315/derp
  
  auto_update_enabled: true
  update_frequency: 24h

验证配置

# 查看 DERP 服务器状态
tailscale status

# 查看当前使用的 DERP
tailscale netcheck

# 输出示例:
# DERP latency:
#   - myderp: 20ms (你的服务器)
#   - nyc: 180ms
#   - sfo: 220ms

# 查看 DERP 映射
tailscale derpmap

各平台配置说明

macOS

# 使用管理控制台配置最简单
# 或使用命令行(需要 sudo)
sudo tailscale up --derp-map=...

Windows

# 以管理员身份运行 PowerShell
tailscale up --derp-map=...

# 或通过 Tailscale 托盘图标配置

Linux

# 需要 root 权限
sudo tailscale up --derp-map=...

iOS / Android

移动端无法直接配置 DERP 映射,需要通过以下方式:

  1. 管理控制台:在 ACL 中配置,对所有设备生效
  2. Headscale:在服务端配置 DERP 映射

与官方 DERP 对比

性能对比

指标 官方 DERP 自建 DERP
国内延迟 200-500ms 10-50ms
带宽 共享(有限制) 独享(自定)
稳定性 取决于网络 完全可控
地理位置 海外节点 就近部署

隐私与安全

方面 官方 DERP 自建 DERP
数据流经 Tailscale 服务器 你的服务器
访问控制 Tailscale 管理 完全自主
审计日志 有限 完全可控
合规性 数据跨境风险 可满足企业合规

成本分析

✅ 自建 DERP

  • 国内云服务器:30-100 元/月
  • 域名:约 50 元/年
  • 证书:免费(Let's Encrypt)
  • 总成本:约 35-105 元/月

❌ 官方方案

  • 个人免费版:100 设备限制
  • 企业版:$6/用户/月
  • 无国内节点优化

适用场景

🎯 推荐自建 DERP 的场景

  • 团队主要在国内,需要低延迟连接
  • 对数据隐私有严格要求
  • 需要满足企业合规要求
  • 大量文件传输需求
  • 希望减少对第三方服务的依赖

🎯 推荐使用官方 DERP 的场景

  • 个人使用,设备数量少
  • 主要在海外,官方节点延迟可接受
  • 不想维护额外服务器
  • 临时测试或轻量使用

常见问题

Q1:DERP 服务器显示连接但不工作?

检查以下几点:

  1. 确认证书有效:curl -v https://derp.yourdomain.com:10315/
  2. 检查 --verify-clients=true 时,DERP 服务器是否在 Tailscale 网络中
  3. 确认端口未被防火墙阻挡
  4. 查看 derper 日志:journalctl -u derper -f

Q2:如何确认当前使用的 DERP 服务器?

# 查看网络状态
tailscale netcheck

# 查看 DERP 延迟
tailscale status

# 查看连接详情
tailscale ping --verbose 其他设备IP

Q3:自建 DERP 会影响 P2P 直连吗?

不会。DERP 只是备用方案:

  • Tailscale 会优先尝试 P2P 直连
  • 只有在直连失败时才使用 DERP 中继
  • 直连成功后会自动切换回 P2P

Q4:如何部署多个 DERP 服务器?

在 ACL 配置中添加多个 Region:

{
  "derpMap": {
    "Regions": {
      "900": {
        "RegionID": 900,
        "RegionCode": "bjderp",
        "RegionName": "Beijing DERP",
        "Nodes": [{"Name": "bjderp", "RegionID": 900, "HostName": "derp-bj.example.com", "DERPPort": 10315}]
      },
      "901": {
        "RegionID": 901,
        "RegionCode": "shderp",
        "RegionName": "Shanghai DERP",
        "Nodes": [{"Name": "shderp", "RegionID": 901, "HostName": "derp-sh.example.com", "DERPPort": 10315}]
      }
    }
  }
}

Q5:忘记域名续期,证书过期了怎么办?

# 手动续期证书
sudo certbot renew --force-renewal

# 重启 derper 服务
sudo systemctl restart derper

Q6:DERP 服务器可以和中转服务(如 frp)共用吗?

可以,但要注意端口冲突:

  • DERP 使用自定义端口(如 10315)
  • 其他服务使用不同端口即可
  • 确保服务器带宽和性能足够

Q7:如何监控 DERP 服务器状态?

# 使用 Tailscale 内置监控
tailscale derpmap

# 查看服务状态
sudo systemctl status derper

# 实时日志
sudo journalctl -u derper -f

# Prometheus 指标(如果启用)
curl http://localhost:10315/metrics

小结

自建 DERP 服务器虽然需要一些前期配置,但带来的好处是显著的:

  • 性能提升:延迟从 200-500ms 降低到 10-50ms
  • 隐私保护:流量完全在自己的服务器上
  • 成本可控:月成本约 35-105 元
  • 完全自主:不依赖第三方服务

📋 快速部署清单

  1. ✅ 准备一台国内云服务器(推荐阿里云/腾讯云)
  2. ✅ 购买域名并解析到服务器 IP
  3. ✅ 开放防火墙端口(443、10315、2367)
  4. ✅ 安装 Tailscale 并登录
  5. ✅ 申请 SSL 证书
  6. ✅ 编译安装 derper
  7. ✅ 创建 systemd 服务
  8. ✅ 在 ACL 中配置 DERP 映射
  9. ✅ 客户端验证连接

完成这些步骤后,你就可以享受低延迟、高隐私的 Tailscale 体验了!


参考资源
Tailscale 官方文档:自定义 DERP 服务器 · derper 源码 · Tailscale 工作原理