
[!NOTE] 很多玩虚拟组网的小伙伴都爱死 Tailscale 的易用性,但由于官方控制面板闭源,且对免费账户的连接设备数有严格限制,对于拥有多台服务器和设备的极客来说总觉得束手束脚。今天老周手把手教大家用 Docker-compose 自建 Headscale 开源控制端,搭配精美的 Web UI 网页管理面板和自动申请 HTTPS 证书的 Caddy 代理,打造一个 100% 由自己掌控的私有虚拟局域网!
亲爱的读者,欢迎回到 老周的AI进化实验室!
在上一期中,我们体验了去中心化组网新星 EasyTier 的魅力。但很多小伙伴给老周留言:“老周,我已经在各种设备上配置好了 Tailscale,客户端体验极佳,实在不想折腾别的软件了。但是官方免费版限制设备数量,而且控制面板在人家服务器上,我总觉得隐私不够稳,这怎么破?”
答案很简单:自建 Headscale。
Headscale 是 Tailscale 控制服务器的开源替代品。它完美兼容 Tailscale 官方的所有客户端,但把所有的节点注册、网络中转、DNS 解析、以及 ACL 访问控制的权限,全部收回到你自己的公网服务器上。
今天,老周就带大家通过 Docker-compose 一键部署一套完整的 Headscale + Caddy(自动 HTTPS)+ Headscale-Admin(精美 Web UI 后台) 私有组网矩阵!
自建 Headscale 几乎继承了 Tailscale 全部的优点,同时完美避坑:
为了保证组网控制端能在公网正常工作,并顺利申请 SSL 证书,我们需要准备:
headscale.yourdomain.com 和 hs-admin.yourdomain.com)的 A 记录解析到你的 VPS 公网 IP 上。
我们采用 Docker-compose 容器化方式部署,整体架构极其清爽
headscale:核心控制端服务。 headscale-admin:可视化网页后台,免去在黑窗口敲命令管理节点的痛苦。在 VPS 上创建工作文件夹:
sudo mkdir -p /opt/headscale/config
cd /opt/headscale
config.yaml在 /opt/headscale/config/ 下创建 Headscale 的主配置文件 config.yaml:
sudo nano config/config.yaml
填入以下基础配置,注意修改 server_url 为你自己的解析域名:
server_url: https://headscale.yourdomain.com:443
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 127.0.0.1:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_without_tls: true
db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite
# 基础网络配置
ip_prefixes:
- 10.10.10.0/24
- fd7a:115c:a1e0::/48
derp:
server:
enabled: false
urls:
- https://controlplane.tailscale.com/derpmap/default
# DNS 和 域名直连配置
dns:
magic_dns: true
base_domain: yourdomain.com
nameservers:
- 1.1.1.1
- 8.8.8.8
docker-compose.yml回到 /opt/headscale/ 目录,创建容器编排文件:
sudo nano docker-compose.yml
写入以下内容,注意将 Caddy 中的域名及邮箱替换为您自己的实际信息:
version: '3.8'
services:
headscale:
image: headscale/headscale:latest
container_name: headscale
volumes:
- ./config:/etc/headscale
- ./data:/var/lib/headscale
ports:
- "8080:8080"
command: headscale serve
restart: always
headscale-admin:
image: registries.aperture.moe/headscale-admin:latest
container_name: headscale-admin
ports:
- "9090:80"
restart: always
caddy:
image: caddy:latest
container_name: caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
restart: always
volumes:
caddy_data:
caddy_config:
Caddyfile 反向代理规则在 /opt/headscale/ 目录下创建 Caddyfile:
sudo nano Caddyfile
配置反向代理和自动 SSL 证书申请:
headscale.yourdomain.com {
reverse_proxy headscale:8080
}
hs-admin.yourdomain.com {
reverse_proxy headscale-admin:80
}
在当前目录下运行命令启动容器:
sudo docker compose up -d
启动后,Caddy 会在后台自动为你的两个子域名申请 SSL 证书。
因为我们是私有自建,首先需要在 Headscale 中创建一个“命名空间”(User),用于区分和管理你的设备网络。
sudo docker compose exec headscale headscale users create laozhou
在客户端终端直接执行(指定自建控制端域名):
tailscale up --login-server https://headscale.yourdomain.com
https://headscale.yourdomain.com/windows,下载并运行官方提供的注册表导入脚本,修改 Tailscale 默认控制端为你的自建域名。Alternative Server 改为你的域名 https://headscale.yourdomain.com。当你在客户端发起连接命令后,终端或 APP 会弹出一个网页链接:
https://headscale.yourdomain.com/register?key=xxxxxxxxxxxxxxxx
打开这个网页,你会获得一串用于在服务端注册节点的 命令行密钥 (Key)。回到你的公网 VPS,运行以下命令完成激活(替换为你的实际密钥和用户名):
sudo docker compose exec headscale headscale nodes register --user laozhou --key xxxxxxxxxxxxxxxx 回到客户端,你会发现 Tailscale 已经瞬间显示连接成功!
每次添加节点都要去服务器敲命令显然不够极客。现在,在浏览器中打开: https://hs-admin.yourdomain.com
获取 API Key
:回到 VPS 生成一个 API Key 用于网页管理: bash
sudo docker compose exec headscale headscale apikeys create配置登录
:在网页后台输入你的控制端地址 https://headscale.yourdomain.com 以及刚才生成的 API Key。
大功告成
:在精美的网页面板中,你现在可以直观地查看在线设备、管理命名空间、一键删除或添加授权节点,省心省力!
自建 Headscale 彻底打破了官方免费额度的桎梏,让我们可以随心所欲地扩展局域网设备。通过 Docker-compose 和 Caddy 的加持,整套部署的维护难度 and 证书申请成本被降到了最低。
在下一期文章中,老周将带大家解决国内用户最头疼的问题:“即便直连成功,Tailscale 速度为什么依然很慢?”。老周将手把手带大家开启并放行 IPv6,实现免 VPS、零成本的百分百 P2P 瞬间直连,速度直接跑满千兆带宽!
老周的AI进化实验室 持续分享最接地气的 AI 提效黑科技、私有网络基建与数字化进化指南。如果你觉得有收获,欢迎点赞、在看并分享给身边的朋友!