组网这件事,没必要交给别人:用 Headscale 把控制服务器搬回自己手里

家里机器一多,最头疼的往往不是买设备,而是怎么让它们安全地互相找得到。手机要连 NAS 上的服务,笔记本出门想回家里取文件,几台小服务器之间要互访——传统的端口映射既麻烦又不安全。基于 WireGuard 的零配置组网工具这几年很火,但控制服务器大多握在别人手里。Headscale 就是把那个“大脑”拿回来自己养的开源方案。

是什么

Headscale 是某商业组网工具控制服务器的开源自托管实现,用 Go 写的,BSD 协议。它干的事很单纯:在你的机器之间当个“密钥交换中心”和“地址分配器”。底层是 WireGuard 的加密通道加上 NAT 穿透技术,节点之间能直接打通,打不通的时候再走中继(DERP)。那套商业方案里,除了 Windows / macOS / iOS 的图形客户端和这个控制服务器外,其余全是开源的,而控制服务器恰好是闭源的——Headscale 就是来补这个缺口的。

关键点是客户端不用换。手机、电脑照样装官方 App,只是登录时把“控制服务器”指向你自己的域名。它在你这边实现的是一整个 tailnet(私有网络)的管控:交换公钥、分配 IP、划用户、共享机器、暴露通告路由。

为什么自己养

第一,密钥、节点 IP、路由表全在你自己的服务器上,不落任何第三方。第二,免费、不限设备数(官方免费档有设备上限,自托管没有这回事)。第三,中继节点能自己摆——官方的 DERP 都在海外,国内跨网访问延迟高,Headscale 自带 DERP,你也可以在同一台或附近的机器上再起一个,延迟能砍一大截。第四,ACL 自己写,哪台机器能访问哪台,精确到协议级别。

怎么搭起来

官方推荐直接 Docker 跑。一条 docker-compose 拉起 headscale/headscale 镜像,挂上配置文件和 SQLite 数据库目录就行。配置文件(config.yaml)里几个关键项:server_url 填你对外暴露的 https 域名;listen_addr 容器内 0.0.0.0:8080;ip_prefixes 用默认的 100.64.0.0/10(tailnet 内网段);magic_dns 开起来;derp 这段里,自建中继就在这里配。

Headscale 必须跑在 HTTPS 后面,所以前面还得有个反向代理(Caddy 之类)自动签证书。域名 A 记录指到服务器公网 IP,Caddy 反代到 8080,证书全自动续。注意新版把 v2 API 放到了本地 Unix socket 上,管理脚本和 Web UI 都走这个。

加设备有两招:一是命令行 tailscale up --login-server https://你的域名,客户端会吐一个链接让你在浏览器里确认;二是预授权密钥(pre-auth key),headscale preauthkeys create 生成一串,设备端带 --authkey 直接连,不用每次手动批准,适合批量加或者没显示器的机器。

家里的 NAS 想让组网直接访问整段局域网?tailscale up --advertise-routes=192.168.x.0/24,服务器端 headscale routes enable --all 批准,出门在外就能直接敲家里内网地址。想让某台机器当全局出口?加 --advertise-exit-node,别的节点用 --exit-node 指定即可。

Headscale-WebUI 总览页
社区 Web UI 的总览页,节点的在线状态、IP、最后心跳一目了然(截图来自 headscale-webui 项目)

配个网页后台

纯命令行管节点迟早嫌烦。社区有几个 Web UI 可选:headscale-webui(Python 写的,功能全,能看每台机器的 IP、最后在线时间、过期时间,还能管预授权密钥和用户)、headscale-ui(Docker 一把梭的现代前端)、还有 headscale-admin。挑一个顺眼的挂上,拓扑和节点状态一眼看清。下面两张就是从这些项目 README 里扒的界面。

Headscale-WebUI 设备页
设备页:每台机器的详情、路由与出口节点开关
Headscale-WebUI 用户页
用户页:按用户(namespace)隔离和管理节点

坑在哪

  • 域名 + TLS 是硬门槛。没有公网域名基本玩不转,客户端只认 HTTPS 的 login-server。
  • 官方 GUI 客户端在 Windows / macOS / iOS 上仍是闭源,但兼容性没问题,只是“大脑”换成了你自己的。
  • NAT 穿透不是万能。两边都是对称型 NAT 或者商宽封了 UDP,就得依赖中继,这时候自建 DERP 低延迟的价值就出来了。
  • ACL 是 HuJSON(带注释的 JSON),语法得对着文档抄,写错了整张表不生效。
  • 版本要对齐。Headscale 迭代快,配置和客户端有耦合,换大版本前一定先看对应版本的文档。
  • 它定位是“单个 tailnet”,适合个人或小团队,不是给企业大规模用的。

小结

如果你家里已经有几台机器要互访、又不想把网络拓扑和密钥交出去,Headscale 是当下最省心、最完整的自建方案。资源占用极低,一台 1 核 1G 的小服务器就够带一个家庭的节点。把控制服务器拿回自己手里,组网的主动权才真正在你这边。

发表评论