
字节笔记本
2026年9月24日 · 约 5 分钟读完
Tailscale、Headscale、DERP:一套自建组网的三层关系
这三个名字经常一起出现,但它们不是并列的可选项,而是一套自建组网里的三个层次。把它们的关系捋清楚,后面所有配置决策都会变得好理解。
三层关系:客户端、大脑、兜底
Tailscale 本身是基于 WireGuard 的 mesh VPN 产品,包含两部分:跑在每台设备上的客户端(tailscaled),负责建立实际的 WireGuard 隧道——这是"数据面";以及官方托管的控制面(coordination server),负责认证、分发各节点的公钥和地址、维护 ACL、MagicDNS 解析——告诉每个节点"其他节点在哪、怎么连"。
Headscale 是控制面的开源重实现,协议兼容官方 Tailscale 客户端。也就是说客户端软件还是用 Tailscale 官方那个,只是把 --login-server 指向你自己的 Headscale,而不是指向 tailscale.com。相当于把"大脑"换成自己的,"身体"(客户端、WireGuard 隧道)不变。
DERP 是中继层,属于数据面的兜底。两个节点之间理想情况下是直连(P2P,NAT 打洞成功),但打洞失败时(比如双方都在严格 NAT 后面)就需要一个中继服务器转发加密流量,这就是 DERP。用 Headscale 自建控制面后,就脱离了官方基础设施,所以也得自己搭 DERP,不然打洞失败时没有兜底。控制面会把这些自建 DERP 的信息下发给客户端,客户端才知道往哪个中继走。
一句话总结:Tailscale = 客户端软件 + 隧道机制;Headscale = 换掉官方控制面,自己管理节点和密钥分发;DERP = 直连失败时的中继兜底。
DERP 可以有多个,国内海外都要
可以,而且官方本来就是多 region 设计。
每个 DERP server 有唯一的 region_id 和 region_code。控制面会把所有配置的 DERP 节点列表连同 region 信息下发给客户端,客户端启动时会测每个 region 的延迟,打洞失败需要中继时,自动选延迟最低的那个,不用手动指定。
国内和海外都要的原因很实际:
- 跨境线路质量差:如果只有一个海外 DERP,国内节点之间即便打洞失败要走中继,也得绕出国境,延迟和丢包都会很难看;
- 严格 NAT 环境下 P2P 打洞成功率本来就更低:国内节点之间、以及国内节点连海外节点,NAT 类型往往更严格(家宽和不少云主机是对称 NAT),中继会更频繁被用到,中继本身的线路质量就更重要;
- 就近接入:国内节点间通信走国内中继,国内连海外的走海外中继,比单一区域覆盖好很多。
不是越多越好,自动选路是真的自动
自动判断是真的:客户端定期对所有 DERP region 做延迟探测,每次要用中继时自动挑延迟最低的,完全不用管。
但"要不要加新 DERP"是你根据节点分布手动决定的事,不是越多越好:
- DERP 只是兜底,大多数连接走的是 P2P 直连,打洞成功的话根本用不上 DERP;
- 每加一个 DERP 就是一台公网服务器加带宽成本加维护负担;
- 收益有上限:只要覆盖到实际会用到的地理区域,再加更多区域对个人和小团队场景基本没有提升。
判断标准很简单:节点分布在哪几个大洲/网络环境,就覆盖哪几个方向。
走了 DERP 之后,设备之间是直连吗
分两种情况,不是"过一遍 DERP 再直连"这种串联关系。
情况一:一开始就直连成功。 双方 NAT 类型允许打洞,客户端会互相交换公网 IP 和端口信息(这个交换本身通过 DERP 或控制面完成,但只是交换名片,不转发实际流量),然后直接建立 WireGuard 隧道点对点通信。这种情况下 DERP 全程不参与。
情况二:打洞失败,先走 DERP,但会持续尝试升级。 双方都在严格 NAT 后面打洞失败时,数据确实经过 DERP 转发,能正常通信但延迟更高。
关键在于:即使当前在走 DERP 中继,客户端也不会放弃,会在后台持续重试打洞。网络环境变化(某一方换了 NAT、换了网络)都可能让打洞突然成功,一旦成功,连接自动无感升级为直连,不需要重连、不需要手动干预。
用 tailscale status 可以看到每条连接当前是 direct 还是走的某个 DERP region。
Headscale 有 Web 界面吗
Headscale 本身没有官方 Web 界面——它设计上就是纯 CLI 加 gRPC/REST API 的控制面,管理节点、用户、ACL 全靠命令行。
不过有几个第三方开源 Web UI,通过调用 Headscale 的 API 提供图形化管理:headscale-admin(比较早期、用的人多)、headscale-ui(轻量)、Headplane(相对更新、界面更现代,social login 集成更完整)。这些都是独立部署的,需要额外起一个容器或服务,配好 API key 去连你的 Headscale 实例。选哪个主要看维护活跃度,以及要不要 OIDC 登录、ACL 管理这类功能。
一句话收拢
Tailscale 管隧道,Headscale 管大脑,DERP 管兜底。控制面自己建,中继按节点分布部署,客户端自动选路,连接自动升级直连——这套东西各自的边界划清楚之后,整套自建组网的思路就顺了。


