欢迎光临
我们一直在努力

Headscale 如何停用 Tailscale 默认 DERP 服务器仅使用内嵌 DERP 中继?

Headscale 如何停用 Tailscale 默认 DERP 服务器仅使用内嵌 DERP 中继?

如果你正在自托管 Headscale,并希望客户端不再依赖 Tailscale 官方的公共 DERP 中继、只使用自己部署的内嵌 DERP 服务器(例如完全离线/内网环境,或不想流量经过第三方中继),就需要完成两件事:先启用 Headscale 自带的内嵌 DERP 服务器,再把默认加载的 Tailscale 公共 DERP map 清空。本文基于 docs/ref/derp.md 与 config-example.yaml 给出完整操作步骤,并说明如何用 tailscale debug 命令验证最终只有内嵌 DERP 在服务。

前置条件:端口与 HTTPS

内嵌 DERP 服务器默认是禁用的,启用前需满足以下条件(见 docs/setup/requirements.md 与 config-example.yaml 中的注释):

  • tcp/443:公网可达。DERP 中继通过 HTTPS 提供,server_url 必须使用 https,"DERP requires TLS to be in place"。
  • udp/3478:公网可达。STUN 端口,帮助客户端发现公网 IP 并完成 NAT 穿透;启用内嵌 DERP 时 stun_listen_addr 必须定义,默认值为 0.0.0.0:3478。

配置文件默认从 /etc/headscale、$HOME/.headscale 或当前工作目录加载 config.yaml(可通过 -c/–config 或 HEADSCALE_CONFIG 指定其他路径),详见 docs/ref/configuration.md。

第一步:启用内嵌 DERP 服务器

编辑 config.yaml,把 derp.server.enabled 设为 true,并建议填写 Headscale 服务器的公网 IPv4/IPv6 地址以提升连接稳定性:

derp:
server:
enabled: true
ipv4: 198.51.100.1
ipv6: 2001:db8::1

其中 198.51.100.1 / 2001:db8::1 是文档中的示例值,需替换为你服务器的实际公网地址。

其余相关默认项可直接沿用 config-example.yaml 的取值:stun_listen_addr: "0.0.0.0:3478"、region_code: "headscale"、region_id: 999、verify_clients: true(仅允许本 Tailnet 内的节点使用中继,未知客户端会被拒绝)。

启用后,内嵌 DERP 会自动加入客户端拿到的 DERP map,并与 Tailscale 官方的免费 DERP 服务器列表合并提供。

第二步:停用 Tailscale 默认 DERP map

要让客户端只看到并使用你的内嵌 DERP,需要在 derp 段下把默认 DERP map 的来源清空,即把 urls 设为空列表:

derp:
server:
enabled: true
ipv4: 198.51.100.1
ipv6: 2001:db8::1
urls: []

urls 默认指向 Tailscale 的公共 DERP map(示例配置中为 https://controlplane.tailscale.com/derpmap/default),置空后该默认列表不再加载。

单点故障警告(原文档明确提示):移除 Tailscale 的 DERP 服务器后,客户端只剩一个 DERP 服务器可用,它成为单点故障,可能影响连通性。文档要求先确认内嵌 DERP 连通性正常,再移除 Tailscale 的 DERP 服务器,建议按下面的顺序操作:先只改 server.enabled: true 并验证,再清空 urls。

第三步:应用配置并验证

  • 校验配置文件:

    headscale configtest

  • 重启服务使配置生效:

    sudo systemctl restart headscale

  • 在任意一台 Tailscale 客户端上查看客户端实际拿到的 DERP map,应只包含你的内嵌 DERP 区域:

    tailscale debug derp-map

  • 测试与内嵌 DERP 的连通性:

    tailscale debug derp headscale

    注意:该命令中的 headscale 是内嵌 DERP 的 region code,对应 config-example.yaml 中的默认值 region_code: "headscale";如果你修改了 region_code,需相应调整命令参数(文档脚注明确说明此假设)。

  • 额外的 DERP 相关指标与信息可以通过 metrics 与 debug 端点查看,地址为 http://localhost:9090/debug/,详见 docs/ref/debug.md。

  • 可选分支:用自定义 DERP map 文件进一步控制

    除了 urls: [],文档还支持通过 derp.paths 指向本地 YAML 文件(格式见仓库根目录的 derp-example.yaml)来自定义提供给客户端的 DERP map,例如按 region ID 把某个区域显式置 null 禁用、或提供多个自定义 DERP 区域(ID 900/901 的示例)。若你同时启用内嵌 DERP,它会自动合并进这份自定义 map(除非将 automatically_add_embedded_derp_region 设为 false 并手动在 map 文件中添加)。对于"只留内嵌 DERP"这一目标,urls: [] 已经足够;paths 方案适合你还需要维护额外自建中继的场景。

    已知限制

    • 内嵌 DERP 服务器不支持 tcp/80 上的 /generate_204 端点,因此不能用于 Tailscale 的 captive portal 检查。
    • 没有速度或吞吐量优化,文档明确其主要目的是辅助节点之间建立连接。
    • 单点故障风险见上文警告:移除公共 DERP 后所有中继流量都经过你这一个节点。

    当 tailscale debug derp-map 的输出中只剩你的内嵌区域、且 tailscale debug derp headscale 连通性检查通过时,即表示客户端已完全切换到内嵌 DERP 中继。

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:171主机测评 » Headscale 如何停用 Tailscale 默认 DERP 服务器仅使用内嵌 DERP 中继?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址