剪藏#剪藏#老周的AI实验室

完全免费不限设备!用 Docker 自建 Headscale 打造 100% 掌控的私有组网

2026 年 6 月 29 日1 分钟
分享Twitter / XTelegram微博

Notion image

[!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?

自建 Headscale 几乎继承了 Tailscale 全部的优点,同时完美避坑:

  • 完全免费且无设备上限:再也不用看着官方的设备限制额度发愁,你想连 100 台还是 1000 台设备都没人管。

  • 100% 掌控隐私安全:所有的连接密钥、节点 IP 信息只保留在你自己的服务器上,彻底杜绝数据在第三方服务商处泄露的隐患。

  • 兼容官方客户端:你的手机、电脑、NAS 依然可以直接下载 Tailscale 官方客户端,不需要安装任何第三方改版软件。

  • 支持自建中继(DERP):由于控制权在手,整合国内低延迟中继服务器也更加得心应手。

🛠️ 第一步:前期准备工作

为了保证组网控制端能在公网正常工作,并顺利申请 SSL 证书,我们需要准备:

  1. 一台公网服务器 (VPS):系统推荐使用 Ubuntu 22.04 或 Debian 12,拥有公网 IP。

  2. 一个域名:将两个子域名(例如 headscale.yourdomain.comhs-admin.yourdomain.com)的 A 记录解析到你的 VPS 公网 IP 上。

📦 第二步:编写 Docker-compose 部署矩阵

我们采用 Docker-compose 容器化方式部署,整体架构极其清爽

  • headscale:核心控制端服务。

  • caddy:负责反向代理,并全自动向 Let's Encrypt 申请和续签域名 HTTPS 证书

  • headscale-admin:可视化网页后台,免去在黑窗口敲命令管理节点的痛苦。

1. 创建目录结构

在 VPS 上创建工作文件夹:

JAVASCRIPT
sudo mkdir -p /opt/headscale/config
cd /opt/headscale 

2. 创建并配置 config.yaml

/opt/headscale/config/ 下创建 Headscale 的主配置文件 config.yaml

JAVASCRIPT
sudo nano config/config.yaml 

填入以下基础配置,注意修改 server_url 为你自己的解析域名:

JAVASCRIPT
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

3. 编写 docker-compose.yml

回到 /opt/headscale/ 目录,创建容器编排文件:

JAVASCRIPT
sudo nano docker-compose.yml 

写入以下内容,注意将 Caddy 中的域名及邮箱替换为您自己的实际信息:

JAVASCRIPT
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:

4. 编写 Caddyfile 反向代理规则

/opt/headscale/ 目录下创建 Caddyfile

JAVASCRIPT
sudo nano Caddyfile 

配置反向代理和自动 SSL 证书申请:

JAVASCRIPT
headscale.yourdomain.com {
    reverse_proxy headscale:8080
}

hs-admin.yourdomain.com {
    reverse_proxy headscale-admin:80
}

5. 启动服务并初始化数据库

在当前目录下运行命令启动容器:

JAVASCRIPT
sudo docker compose up -

启动后,Caddy 会在后台自动为你的两个子域名申请 SSL 证书。

🎯 第三步:初始化用户并连接客户端

因为我们是私有自建,首先需要在 Headscale 中创建一个“命名空间”(User),用于区分和管理你的设备网络。

1. 在服务器端创建用户:

JAVASCRIPT
sudo docker compose exec headscale headscale users create laozhou 

2. 连接 Linux 客户端:

在客户端终端直接执行(指定自建控制端域名):

JAVASCRIPT
tailscale up --login-server https://headscale.yourdomain.com 

3. 连接 Windows / macOS 客户端:

  1. Windows 用户:在浏览器打开 https://headscale.yourdomain.com/windows,下载并运行官方提供的注册表导入脚本,修改 Tailscale 默认控制端为你的自建域名。

  2. Android / iOS 客户端:在官方 APP 登录页面连续点击右上角菜单按钮(或连击图标),在隐藏设置中将 Alternative Server 改为你的域名 https://headscale.yourdomain.com

4. 节点激活与注册

当你在客户端发起连接命令后,终端或 APP 会弹出一个网页链接:

https://headscale.yourdomain.com/register?key=xxxxxxxxxxxxxxxx

打开这个网页,你会获得一串用于在服务端注册节点的 命令行密钥 (Key)。回到你的公网 VPS,运行以下命令完成激活(替换为你的实际密钥和用户名):

JAVASCRIPT
sudo docker compose exec headscale headscale nodes register --user laozhou --key xxxxxxxxxxxxxxxx

回到客户端,你会发现 Tailscale 已经瞬间显示连接成功!

🖥️ 第四步:使用 Headscale-Admin 图形化面板

每次添加节点都要去服务器敲命令显然不够极客。现在,在浏览器中打开: https://hs-admin.yourdomain.com

  1. 获取 API Key:回到 VPS 生成一个 API Key 用于网页管理: bash sudo docker compose exec headscale headscale apikeys create

  2. 配置登录:在网页后台输入你的控制端地址 https://headscale.yourdomain.com 以及刚才生成的 API Key。

  3. 大功告成:在精美的网页面板中,你现在可以直观地查看在线设备、管理命名空间、一键删除或添加授权节点,省心省力!

💡 老周碎碎念

自建 Headscale 彻底打破了官方免费额度的桎梏,让我们可以随心所欲地扩展局域网设备。通过 Docker-compose 和 Caddy 的加持,整套部署的维护难度 and 证书申请成本被降到了最低。

在下一期文章中,老周将带大家解决国内用户最头疼的问题:“即便直连成功,Tailscale 速度为什么依然很慢?”。老周将手把手带大家开启并放行 IPv6,实现免 VPS、零成本的百分百 P2P 瞬间直连,速度直接跑满千兆带宽!

老周的AI进化实验室 持续分享最接地气的 AI 提效黑科技、私有网络基建与数字化进化指南。如果你觉得有收获,欢迎点赞、在看并分享给身边的朋友!

原文地址: https://mp.weixin.qq.com/s?__biz=MzY4MjI5NTMwNQ==&mid=2247483984&idx=1&sn=79e6a66e7ad2c2cdad7ae617ab52da60&chksm=f25ab8e182a2d710f16dafe093512e2d1ee438dbb44e8de6c4644153563a2cb50a796942f79e&mpshare=1&scene=1&srcid=0629eKRTVDsiAFfYJmNrqZOd&sharer_shareinfo=25718676d1d08b2667d0426e1d115aff&sharer_shareinfo_first=25718676d1d08b2667d0426e1d115aff#rd

相关文章