Headscale 是一个开源实现版的 Tailscale 控制器,但是它一直没有官方的 WebUI 管理界面,使用体验远不如 Tailscale 官方实现。目前根据 Viz 的推荐,我开始使用 Headplane 管理 Headscale。Headplane 最佳的使用方式是直接使用 Docker,它可以更好的控制 Headscale 进程,达到动态载入 DNS,ACL 策略的功能。我也尝试将裸机安装的 Headscale 迁移到 Docker 中。
Contents
备份 Headscale 配置
Headscale 的配置较为简单,默认设置下只有 /etc/headscale/
和 /var/lib/headscale/
两个目录。前者是 Headscale 的设置,后者是 Headscale 的 sqlite 数据库和密匙。
准备文件
使用 Docker 版 Headplane 需要:
. ├── docker-compose.yml ├── headplane-config │ └── config.yaml ├── headplane-data │ └── users.json ├── headscale-config │ ├── acls.json │ ├── config.yaml │ ├── derp.yaml │ └── dns_records.json └── headscale-data ├── db.sqlite ├── db.sqlite-shm ├── db.sqlite-wal ├── noise_private.key └── private.key
docker-compose.yml
/etc/headscale/
←对应→headscale-config
/var/lib/headscale/
←对应→headscale-data
headplane-config/config.yaml
Docker Compose 的配置参考如下
services: headplane: # I recommend you pin the version to a specific release image: ghcr.io/tale/headplane:0.6.0 container_name: headplane restart: unless-stopped ports: - '127.0.0.1:3003:3000' volumes: - './headplane-config/config.yaml:/etc/headplane/config.yaml' # This should match headscale.config_path in your config.yaml - './headscale-config/config.yaml:/etc/headscale/config.yaml' # If using dns.extra_records in Headscale (recommended), this should # match the headscale.dns_records_path in your config.yaml - './headscale-config/dns_records.json:/etc/headscale/dns_records.json' # Headplane stores its data in this directory - './headplane-data:/var/lib/headplane' # If you are using the Docker integration, mount the Docker socket - '/var/run/docker.sock:/var/run/docker.sock:ro' headscale: image: headscale/headscale:0.26.1 container_name: headscale restart: unless-stopped command: serve labels: # This is needed for Headplane to find it and signal it me.tale.headplane.target: headscale ports: - '127.0.0.1:8080:8080' - '3478:3478' volumes: - './headscale-data:/var/lib/headscale' - './headscale-config:/etc/headscale'
根据需求修改 headplane-config/config.yaml
,必须配置的内容是 cookie_secret。
server: host: "0.0.0.0" port: 3000 cookie_secret: "" cookie_secure: true headscale: url: "http://headscale:8080" config_path: "/etc/headscale/config.yaml" config_strict: true integration: docker: enabled: true container_label: "me.tale.headplane.target=headscale" socket: "unix:///var/run/docker.sock"
修改 headscale-config/config.yaml
:
listen_addr: 0.0.0.0:8080 policy: mode: database
由于使用 Docker,需要监听所有的 IP 地址,并且 ACL 使用 database 模式
启动 Headplane
上述文件准备完成后即可启动 Headplane/Headscale
docker compose pull docker compose up -d
如果已经在 headscale 中配置过 apikey 此时就可以在 Headplane 中输入 apikey 配置 Headscale。如果此时没有 apikey,则可运行:
docker compose exec headscale headscale apikeys create --expiration 999d
如果配置正确的话,你现在就可以在 Headplane 的 WebUI 中看到你的全部 Tailscale 节点。切换到 ACL 选项卡,重新将先前的 acls.json 中的内容粘贴到窗口中并保存。
*为 Headplane/Headscale 配置 OIDC
OIDC(OpenID Connect)是开放授权(OAuth)2.0 的一种扩展,它可以为 Headplane 和 Headscale 提供 SSO 单点登录功能以取代使用 key 注册机器/登录面板的功能。它能够通过 OIDC 提供商的配置直接管理哪些用户被允许登录到 Headscale,并且可以分配不同的权限,例如管理员,或者仅能够管理自己节点的用户。
首先需要根据官方文档设置 OIDC 提供商的权限,最基本的权限是openid
, profile
, email
email会被直接用于 Headscale 的用户名。你需要为 Headplane 和 Headscale 分别设置 oidc client,分别设置 Callback URL /oidc/callback
用于 Headscale,/admin/oidc/callback
用于 Headplane。
首次注册新的客户端时,就可以使用 OIDC 直接登录账户。