Headscale 搭建笔记
前言
Headscale 是 Tailscale 服务端的一种实现,提供了大多数 Tailscale 官方服务器拥有的功能(比如多用户、OAuth认证、出口节点等)。Headscale 最好安装在同时支持 IPv4 与 IPv6 的 VPS 上,IPv6 在可用的情况下能让各个客户端之间做到点对点直连,而无需经过中转服务器。以下是一个以 Alpine Linux 当作服务端、Fedora Linux 当作客户端的笔记。
安装
由于我选择的是 Alpine Linux 系统,所以安装步骤可能与常见的发行版有所不同。
安装 Headscale
安装需要的一些组件:
1 | doas apk add curl shadow |
然后直接上我自己写的安装脚本:
1 | doas sh -c "$(curl -sL https://github.com/MarksonHon/headscale-installer/raw/refs/heads/main/installer.sh)" |
查看当前安装的版本:
1 | headscale version |
安装 Caddy
我选择使用 Caddy 来反向代理 Headscale,这样做的好处是 80 端口与 443 端口还可以承载其它域名与服务,而不用让 Headscale 独占这两个端口。
1 | doas apk add caddy |
配置
Headscale 配置
文件保存在 /etc/headscale/config.yaml:
1 |
|
Caddy 配置
Caddy 的配置还是很简单的,直接反向代理一下即可。
文件保存在 /etc/caddy/Caddyfile:
1 | { |
由于个人配置,我使用了 ZeroSSL 作为 CA 提供方,理论上这里可以配置为任何支持 ACME 协议的 CA 提供者。
运行
Caddy
1 | doas rc-update add caddy |
Headscale
1 | doas rc-update add headscale |
然后创建一个 Headscale 用户:
1 | doas headscale users create user0 |
客户端登入
手动验证
在客户端使用以其它服务器登录的功能(移动客户端)或者使用命令行(桌面客户端与命令行工具),然后输入 Headscale 服务器的地址,比如:
1 | sudo tailscale login --login-server https://server_address |
然后点开客户端提示的地址,再从网页上复制相关命令粘贴到服务器所在的 SSH 会话中完成验证。记住,必须替换用户名为实际存在的 Headscale 用户,比如上文中的 user0。
预验证密钥
Headscale 可以提供一组预制的验证链接,客户端只需要登入这个链接就能加入网络。
在服务端运行:
1 | doas headscale preauthkeys create -e 24h --user user0 |
上面的命令即创建了一个预验证密钥,有效期为 24 小时,用户为 user0。
然后就能在客户端上执行:
1 | sudo tailscale login --login-server https://server_address --authkey your_key_just_got |
出口节点与路由
宣告路由
要把单独的某个节点配置为出口节点,或者要让该设备同局域网内的其它没有安装 Tailscale 的设备也能被访问到,则可以配置路由功能。
Linux 客户端需要先行开启 IP 转发,开启的方式有多种,可以直接上网搜索。
在客户机上输入:
1 | sudo tailscale web |
然后按照提示,打开对应的 Tailscale 网页设置界面:

点击右上角进行登录,然后就可以配置了。点击 EXIT NODE 选择 Run as exit node 即可把当前客户端作为出口节点,配置 Subnet Router 可以转发 Tailscale 的访问到其它设备。
服务端接受宣告
客户端宣告路由之后,还需要在服务端接受对应的路由。
服务端查看现有的路由信息:
1 | doas headscale routes list |
然后,看仔细你要批准的路由的 ID 是多少,然后运行
1 | doas headscale routes enable Your_ID |
把 Your_ID 替换为实际的 ID。如果想批准多条路由规则,那就重复运行此命令。