· BigDog · AI 工程实验 · 13 min read
Tailscale 自建 DERP 中继节点配置
记录 Tailscale DERP 中继节点的自建配置过程。
目录
这篇笔记怎么读
- 这篇用于排查跨网络连接质量,不是所有场景都需要自建 DERP。
- 先确认直连是否失败,再决定是否部署中继。
- 部署后重点看延迟、区域选择和防火墙端口。
概述
Tailscale 自建 DERP(Detour Encrypted Relay Protocol)中继节点,可以解决因无法建立点对点直连导致的流量绕行海外官方节点、连接卡顿问题。通过在国内服务器上部署私有 DERP 节点,可将中继延迟从 200–300ms 降至 30–80ms,显著提升访问体验。
服务器公网 IP:
43.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.1732. 启动 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/derper3. 安全增强版启动命令(强制客户端验证)
为了实现 只允许你的 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 name、acme/autocert 或 unknown certificate 错误。
5. 开放防火墙端口
根据云服务商安全组策略,开放以下入站端口:
| 端口 | 协议 | 用途 | 是否必须 |
|---|---|---|---|
| 443 | TCP | DERP TLS 中继 | 是 |
| 3478 | UDP | STUN 服务(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 策略(关键安全配置)
进入 Settings → Access 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
- 其他官方节点 -> standby2. Windows 客户端验证
在命令提示符中运行:
tailscale netcheck或通过托盘图标 → 右键 → Show Netcheck。
3. 强制使用中继测试(可选)
tailscale ping <对端节点IP>如果无法直连,会显示 via DERP(901)。
四、常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
netcheck 显示 unknown 或 down | 防火墙未放行端口 | 检查云安全组,开放 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+
状态: 已验证通过,安全加固完成