· BigDog · AI 工程实验  · 13 min read

Tailscale 自建 DERP 中继节点配置

记录 Tailscale DERP 中继节点的自建配置过程。

目录

这篇笔记怎么读

  • 这篇用于排查跨网络连接质量,不是所有场景都需要自建 DERP。
  • 先确认直连是否失败,再决定是否部署中继。
  • 部署后重点看延迟、区域选择和防火墙端口。

概述

Tailscale 自建 DERP(Detour Encrypted Relay Protocol)中继节点,可以解决因无法建立点对点直连导致的流量绕行海外官方节点、连接卡顿问题。通过在国内服务器上部署私有 DERP 节点,可将中继延迟从 200–300ms 降至 30–80ms,显著提升访问体验。

服务器公网 IP43.143.125.173
镜像docker.1panel.live/fredliang/derper(国内加速版)
部署方式:Docker + 自签名证书 + 手动证书模式
安全状态: 已启用客户端验证 + 标签隔离 + ACL 精细控制


一、服务器端部署

1. 生成自签名证书

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

# 生成绑定到服务器 IP 的自签名证书(有效期 10 年)
# 注意:如果你的 OpenSSL 版本低于 1.1.1,请使用方法二(配置文件)
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout /etc/derper/43.143.125.173.key \
  -out /etc/derper/43.143.125.173.crt \
  -subj "/CN=43.143.125.173" \
  -addext "subjectAltName=IP:43.143.125.173"

如果 OpenSSL 不支持 -addext(如 CentOS 7 默认版本),请使用配置文件方式:

创建 san.conf

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
CN = 43.143.125.173

[ v3_ca ]
subjectAltName = IP:43.143.125.173

然后执行:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout /etc/derper/43.143.125.173.key \
  -out /etc/derper/43.143.125.173.crt \
  -config san.conf \
  -extensions v3_ca

验证证书 SAN 字段:

openssl x509 -in /etc/derper/43.143.125.173.crt -text -noout | grep -A1 "Subject Alternative Name"
# 应输出: IP Address:43.143.125.173

2. 启动 DERP 容器(基础版,未启用客户端验证)

注意:此命令仅用于测试。生产环境请直接使用下方“安全增强版”启动命令。

docker run --restart always --name derper \
  -p 443:443 -p 3478:3478/udp \
  -v /etc/derper:/app/certs \
  -e DERP_DOMAIN="43.143.125.173" \
  -e DERP_CERT_MODE=manual \
  -d docker.1ms.run/fredliang/derper

3. 安全增强版启动命令(强制客户端验证)

为了实现 只允许你的 Tailnet 内设备使用本中继,必须启用 DERP_VERIFY_CLIENTS 并挂载 Tailscale socket。

前置条件:服务器必须已安装 Tailscale 客户端并成功登录(参见下方“安全保障”章节)。

docker run --restart always --name derper \
  -p 443:443 -p 3478:3478/udp \
  -v /etc/derper:/app/certs \
  -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
  -e DERP_DOMAIN="43.143.125.173" \
  -e DERP_CERT_MODE=manual \
  -e DERP_VERIFY_CLIENTS=true \
  -d docker.1ms.run/fredliang/derper

参数说明

  • -v /var/run/tailscale/tailscaled.sock:允许容器与宿主机 Tailscale 守护进程通信,验证客户端身份。
  • -e DERP_VERIFY_CLIENTS=true关键安全选项,拒绝未经 Tailscale 认证的连接。

如果希望通过非标准端口(如 54321)绕过 ISP 对 443 端口的封锁,只需修改宿主机的端口映射:-p 54321:443,并在后续 derpMap 中将 DERPPort 改为 54321

4. 验证容器运行状态

docker logs derper

正常输出应包含:

STUN server listening on [::]:3478
derper: serving on :443 with TLS (manual)
derper: verified client connections enabled   # 关键标志

没有 missing server nameacme/autocertunknown certificate 错误。

5. 开放防火墙端口

根据云服务商安全组策略,开放以下入站端口:

端口协议用途是否必须
443TCPDERP TLS 中继
3478UDPSTUN 服务(NAT 穿透)

示例(UFW)

ufw allow 443/tcp
ufw allow 3478/udp

高级建议:如果服务器仅用于 DERP,可在安全组中限制源 IP 为你自己的 Tailnet 出口 IP 范围(可选,非必须)。


二、Tailscale 控制台配置(DERP Map + ACL)

1. 登录 Tailscale Admin Console

访问 https://login.tailscale.com/admin/machines

2. 为 DERP 节点打标签(Tag)

在设备列表中找到你的中继服务器(CentOS 7),点击右侧 ...Edit tags,输入你自定义的标签,例如 bigdog,然后保存。

标签作用:将设备标记为纯服务节点,不携带用户身份,便于 ACL 精细控制。

3. 编写 ACL 策略(关键安全配置)

进入 SettingsAccess Controls,编辑策略 JSON。以下模板包含:

  • 允许所有 Tailnet 设备访问 DERP 服务。
  • 禁止 DERP 节点主动访问你的其他设备(最小权限原则)。
  • 正确配置 derpMap(使用非标准端口或自签名证书时需添加 InsecureForTests)。
{
  // 访问控制规则
  "acls": [
    // 允许任意设备连接到你的 DERP 服务器(使用中继服务)
    {
      "action": "accept",
      "src":    ["*"],
      "dst":    ["tag:bigdog:*"]
    }
    // 注意:这里没有写 src 包含 tag:bigdog 的规则 → 默认拒绝 DERP 节点主动访问其他设备
  ],

  // 标签所有者:只有你的账号可以将 bigdog 标签分配给设备
  "tagOwners": {
    "tag:bigdog": ["ef940414@gmail.com"]
  },

  // DERP 地图配置
  "derpMap": {
    "OmitDefaultRegions": false,   // false = 保留官方 DERP 作为备用
    "Regions": {
      "901": {
        "RegionID": 901,
        "RegionCode": "my-derp",
        "RegionName": "My Self-Hosted DERP",
        "Nodes": [
          {
            "Name":         "derp-sh01",
            "RegionID":     901,
            "HostName":     "43.143.125.173",   // 你的公网 IP
            "DERPPort":     443,                // 与容器映射的宿主机端口一致
            "STUNPort":     3478,
            "InsecureForTests": true            // 自签名证书必须设为 true
          }
        ]
      }
    }
  },

  // SSH 规则(可选,保留默认)
  "ssh": [
    {
      "action": "check",
      "src":    ["autogroup:member"],
      "dst":    ["autogroup:self"],
      "users":  ["autogroup:nonroot", "root"]
    }
  ]
}

安全说明

  • 上述 ACL 中 src: ["*"] 代表你 Tailnet 内的所有设备,而非互联网公开访问。
  • 由于 DERP_VERIFY_CLIENTS=true,未通过 Tailscale 认证的客户端根本无法与 DERP 建立 TLS 连接。
  • 标签 tag:bigdog 使中继节点失去用户身份,即使被攻破也无法主动连接你的其他设备。

4. 保存策略

点击 Save,策略会在几十秒内同步到所有 Tailscale 节点。


三、客户端验证

在任意已加入 Tailscale 网络的机器上执行:

1. 检查 DERP 节点状态

tailscale netcheck

期望输出:

Report:
	* DERP:
		- 901: My Self-Hosted DERP (43.143.125.173:443) -> active
		- 其他官方节点 -> standby

2. Windows 客户端验证

在命令提示符中运行:

tailscale netcheck

或通过托盘图标 → 右键 → Show Netcheck

3. 强制使用中继测试(可选)

tailscale ping <对端节点IP>

如果无法直连,会显示 via DERP(901)


四、常见问题排查

现象可能原因解决方法
netcheck 显示 unknowndown防火墙未放行端口检查云安全组,开放 TCP/443 和 UDP/3478
日志出现 missing server name证书未正确加载或 DERP_DOMAIN 与文件名不匹配确保证书命名为 43.143.125.173.crt/.key,且 DERP_DOMAIN 相同
客户端提示证书错误未设置 InsecureForTests: true在 ACL 的 derpMap 节点中添加 "InsecureForTests": true
容器启动后立即退出端口冲突或证书路径错误检查 docker logs derper,确认 443 端口未被占用
tailscale netcheck 看不到 901 区域ACL 未生效或 JSON 格式错误检查控制台策略是否保存成功,等待 1-2 分钟再试
连接被拒绝(ERR_CONNECTION_CLOSED)443 端口被 ISP 封锁改用非标准端口(如 54321),修改防火墙和 derpMap 中的 DERPPort
无法通过客户端验证未安装 Tailscale 或未挂载 socket确保服务器已 tailscale up 并挂载 /var/run/tailscale/tailscaled.sock

五、维护命令

# 查看实时日志
docker logs -f derper

# 重启容器
docker restart derper

# 停止并删除容器(重新部署时使用)
docker stop derper && docker rm derper

# 更新镜像
docker pull docker.1panel.live/fredliang/derper
docker stop derper && docker rm derper
# 重新运行上述 docker run 命令

六、 服务器安全保障(必读)

本节汇总了确保你的 DERP 中继节点不被未授权使用、不被恶意利用的所有安全措施。

6.1 强制客户端验证(DERP_VERIFY_CLIENTS)

  • 作用:DERP 服务器会通过 /var/run/tailscale/tailscaled.sock 向宿主机的 Tailscale 守护进程查询每个连接客户端的身份。只有已认证的 Tailnet 成员才能建立中继会话。
  • 验证方法docker logs derper 应包含 verified client connections enabled
  • 效果:即使用户知道你的服务器 IP 和端口,也无法使用 curl 或其他工具连接。

6.2 使用标签(Tag)隔离中继节点

  • 为 DERP 节点打上专用标签(如 tag:bigdog),移除用户身份。
  • 在 ACL 中不写任何 src: ["tag:bigdog"]accept 规则 → DERP 节点无法主动连接你网络内的任何设备。
  • 即使中继节点被入侵,攻击者也无法利用它作为跳板访问你的其他机器。

6.3 最小化防火墙规则

  • 仅开放必要的 TCP 中继端口和 UDP STUN 端口。
  • 建议将 SSH 管理端口(22)限制为仅允许你的办公 IP 或通过 Tailscale SSH 访问(可完全关闭公网 SSH)。
  • 如果使用云安全组,可设置源 IP 限制:只允许你的 Tailnet 出口 IP 范围(非必须,因 Tailscale 已加密)。

6.4 使用非标准端口规避封锁(可选但推荐)

  • 国内云服务器 443 端口常因未备案域名而被 TCP 重置(ERR_CONNECTION_CLOSED)。
  • 改用高位端口(如 54321)可彻底规避该问题:
    • 修改容器启动命令:-p 54321:443
    • 云安全组放行 54321/tcp
    • derpMap 节点中设置 "DERPPort": 54321
  • 不影响安全性,因为验证仍通过 Tailscale 证书。

6.5 定期更新组件

  • Docker 镜像:定期 docker pull 最新版本的 fredliang/derper
  • Tailscale 客户端:在服务器上执行 tailscale update 或通过包管理器更新。
  • 操作系统yum update / apt update && apt upgrade

6.6 监控与告警

  • 检查 DERP 容器日志是否有异常连接尝试:docker logs derper 2>&1 | grep -i "fail\|error"
  • 在 Tailscale Admin Console 中查看中继节点的流量统计,如有突发大流量需警惕。

6.7 意外暴露的预防

  • 不要在公网分享你的 derpMap 配置中的 IP 和端口(已加入 Tailnet 的设备会自动获取,无需手动传播)。
  • 不要将自签名证书的私钥(.key 文件)泄露。
  • 定期审查 ACL 策略和 tagOwners,确保只有你的账号拥有标签授权。

6.8 如果仍然担心外部访问

你可以额外添加网络层防火墙规则,仅允许来自 Tailscale 客户端真实 IP 的访问(动态,较复杂)。但鉴于 DERP_VERIFY_CLIENTS=true 已提供应用层认证,这并非必需。


七、安全加固检查清单

部署完成后,请逐项确认:

  • DERP 容器启动命令中包含 -e DERP_VERIFY_CLIENTS=true 并挂载了 tailscaled.sock
  • 服务器已安装 Tailscale,执行 tailscale up 并成功登录。
  • 在 Admin Console 中为中继节点打上了自定义标签(如 bigdog)。
  • ACL 策略中定义了 tagOwners,且未授予 DERP 节点访问其他设备的权限。
  • derpMap 中设置了 "InsecureForTests": true(因为使用自签名证书)。
  • 防火墙仅开放了必要的 DERP 端口和 STUN 端口,SSH 端口已限制访问。
  • 定期检查容器日志无异常错误。
  • 从客户端运行 tailscale netcheck,确认中继节点状态为 active

文档生成时间: 2026-04-27
环境: CentOS 7 + Docker + Tailscale 客户端 1.82+
状态: 已验证通过,安全加固完成

Back to Blog

Related Posts

View All Posts »