什么是 DERP
DERP(Designated Encrypted Relay for Packets)是 Tailscale 数据平面里的加密中继层。两台设备在多数情况下会优先尝试直连(经过协调的打洞、局域网路径等);当 UDP 直连暂时或长期不可行时,流量会透明地经 DERP 转发,而端到端仍由 WireGuard 密钥保护——中继服务器看到的是加密后的载荷,而不是你的明文业务数据。
可以把它理解成:「打洞失败时的 Plan B」,保证你在酒店 Wi‑Fi、对称 NAT、或防火墙很严的环境里,仍能连上家里的 NAS 或内网服务,只是路径可能多一跳、延迟略高。
典型工作路径
- 控制平面仍由 Tailscale 协调(登录、ACL、密钥分发等);DERP 主要参与数据面的兜底。
- 官方在全球部署多组 DERP 区域,客户端会按延迟等策略选用合适节点。
自定义 DERP(自建中继)
在合规、延迟、可用性或「流量尽量不出境」等场景下,你可能希望自己运行 DERP,让回退路径走你的机房或云主机,而不是默认的公共中继。
能做什么
- 在私有网络或指定区域提供低延迟的中继入口。
- 满足对数据路径或运维归属有要求的组织策略(注意:中继仍是加密载荷,但元数据层面会有连接特征)。
- 与 Tailscale 的
DERPMap配置结合,把自定义节点声明给整个 tailnet使用。
实现要点(概念层)
- 开源参考实现:Go 编写的
derper,可编译部署;需 TLS(常见为 443 上的 HTTPS/WebSocket 路径)。 - 在 ACL 或主机策略中通过
derpMap/ 相关字段注册你的 DERP 的 主机名、端口、公钥等,使客户端信任并选用该节点。 - 生产环境建议:监控带宽与连接数、做好证书续期、限制暴露面,并按官方文档核对当前配置字段名(Tailscale 版本迭代时会以文档为准)。
和「自建 Headscale」的区别:Headscale 等替代的是控制平面;DERP 解决的是打洞失败时的数据中继。二者可以组合:自建协调 + 自建或混用 DERP,按你的拓扑拆分责任。
技术分享
NAT 与打洞为什么总会失败
对称 NAT、运营商级 NAT(CGNAT)、严格防火墙会让我们「看到的」公网端口对每一对远端都不一致,UDP 打洞成功率下降。此时不是协议「坏了」,而是网络路径客观上不允许直连,中继是务实的工程折中。
延迟与路径选择
Tailscale 会持续探测并优选路径;走 DERP 时多一跳通常带来额外 RTT。自建 DERP 若放在与业务端同一区域、同一运营商,往往比跨洲默认节点更稳、更省延迟。
威胁模型(简化)
中继节点若被入侵,攻击者仍难以解密 WireGuard 内层业务流量,但需意识到流量模式、时序、源目关系等侧信道层面的信息仍存在。高敏感场景应结合 ACL、出口策略与整体零信任设计。
排查思路
- 客户端日志中关注
direct/relay等路径描述,确认当前是否经中继。 - 若自定义 DERP 不生效,优先核对 证书、域名解析、防火墙放行、DERPMap 是否与客户端版本匹配。