00:00:00这是 Headscale,它是 Tailscale 的开源免费版,可以安装在任何服务器上。
00:00:06它可以让你完全掌控自己的加密网络,以防断网或 Tailscale 突然涨价。
00:00:13但奇怪的是,Headscale 竟然是由 Tailscale 的员工开发的。
00:00:18为什么他们会付钱给员工去开发自家的竞争产品呢?
00:00:22点个订阅,我们来一探究竟。
00:00:25在深入细节之前,我们先来看看 Headscale 的实际运行效果。
00:00:30好了,现在我有三台 Hetzner 服务器,一台用于 Headscale 主控制端,另外两个节点我想把它们连接起来。
00:00:40所以这两台目前是我加密网络的一部分。
00:00:44如果我运行这条命令(因为一切都在 Docker 上运行),我可以看到当前的节点,分别是 Ubuntu Test 和 Ubuntu Test 2。
00:00:53这些是连接它们所需的 IP 地址。
00:00:56现在,让我们让这两个节点互相连接。
00:00:59首先我复制这个 IP 地址。
00:01:02然后在 Ubuntu Test 2 里面,我要通过 SSH 登录 root 账号。
00:01:07是的,我不该直接用 root,但这只是为了测试。
00:01:09这就是来自 Headscale 的 IP 地址。
00:01:11按下回车并清屏,如你所见,我进入了 Ubuntu Test 1。
00:01:17所以我从 Ubuntu Test 2 进入了 Ubuntu Test 1,现在退出回到 Ubuntu Test 2。
00:01:24在 Ubuntu Test 1 也可以做同样的操作,输入 SSH root 并粘贴 Ubuntu Test 2 的 IP。
00:01:31清屏后可以看到,我从 Ubuntu Test 1 进入了 Ubuntu Test 2。
00:01:36但如果我在虚拟网(Tailnet)之外,比如新建一个标签页,这是我 Mac 的终端,然后尝试 SSH 登录 Ubuntu Test 2 的 IP。
00:01:48可以看到它卡住了,因为我在虚拟网之外。
00:01:52正如你刚才看到的,Headscale 让你拥有网络的完全控制权。
00:01:56你可以控制每一个细节,随意添加节点,完全没有供应商锁定。
00:02:03如果你把它连到 NAS 或旧的树莓派上,它甚至可以在断网的情况下工作。
00:02:08不过配置过程稍微有点复杂。
00:02:11事实上,让我给你演示一下它是如何运作的。
00:02:13现在我创建了一个名为 Ubuntu Test 3 的新服务器,我要创建一个新的虚拟网,也就是一个新的加密服务器,并创建一个新用户来连接两个节点。
00:02:24出于测试目的,连接 Ubuntu Test 3 和 Ubuntu Test 1。
00:02:29在我的 Headscale 控制端,我已经安装好了 Headscale,但我会演示一下具体的安装过程。
00:02:37目前我有三个 Docker 容器在运行。
00:02:40一个是 Headscale UI,一个是 Headscale 核心,还有一个是 Caddy。
00:02:45查看对应的 Docker Compose 文件,可以看到其配置与 Headscale 官方 Docker Compose 文档非常相似。
00:02:56不过我修改了一些地方,比如 Headscale 版本和目录路径。
00:03:03我还添加了一个 Headscale UI 容器,它是众多适用于 Headscale 的开源 Web 界面之一。
00:03:11稍后我会展示给大家看。
00:03:13此外还有 Caddy 作为反向代理。
00:03:16如果你感兴趣,我会把这个具体的 Docker Compose 文件链接放在描述栏中。
00:03:21在这个目录下,我们还有 lib 文件夹和 config 文件夹。
00:03:26如你所见,lib 文件夹主要用于存放 SQLite 数据库,它管理着用户信息、节点信息、DNS 信息等。
00:03:36但在配置中,如果你不想用 SQLite,也可以将其更改为 Postgres 数据库。
00:03:43config 目录则包含 Tailscale 配置和易读的 JSON 格式访问控制列表(ACL)策略文件。
00:03:52我们稍后会讨论这个,但先看看这个配置文件,你可以从 Tailscale 文档中获取,甚至可以像我一样直接 curl 到服务器上。
00:04:01查看 GitHub 上的示例配置,我们可以看到所有可修改的选项,从服务器到前缀,以及添加策略文件的路径。
00:04:11这和我的配置非常像,我只修改了服务器 URL,它链接到一个 Cloudflare 域名,这样网络中的节点就能通过这个 URL 找到其他节点。
00:04:23我还添加了策略文件的路径,大概就是这些。
00:04:28域名是典型的 Cloudflare 域名,通过 A 记录将 headscale 子域名指向我控制端的 IP 地址。
00:04:37设置好之后,查看 Caddyfile,可以看到我们使用了两个 URL,一个给 headscale UI(路径为 /web),另一个给 headscale 代理。
00:04:49万事俱备后,第一步是创建一个新用户,可以通过输入这条命令来完成。
00:04:56我要创建一个叫 Tom 的用户,但你可以随心所欲命名。
00:05:00用户创建好后,运行 users list 可以看到所有用户,我们的新用户在这里,ID 是 6。
00:05:08但现在这个用户名下还没有关联任何节点。
00:05:11所以让我们给 Tom 分配一些节点。
00:05:13在新建的 Ubuntu test 3 服务器中,首先要安装 Tailscale 客户端,可以在服务器中运行这条命令。
00:05:23现在我们就有了 Tailscale 二进制文件的访问权限。
00:05:27注意,如果你不是 root 用户,可能需要加 sudo 来运行 Tailscale。
00:05:31但在运行启动或登录命令之前,我们需要以一种特定的方式来配合 Headscale 使用。
00:05:38为此,我们需要创建一些预认证密钥(pre-auth keys),相关命令可以在 Headscale 文档的入门页面找到。
00:05:46我往下翻翻,复制这条命令。
00:05:49然后在我的 Headscale 控制端,输入 docker exec 并粘贴命令。
00:05:54在 user ID 这里,我们要填入 Tom 的 ID,也就是 6。
00:05:59在此之前,我得额外加一个 headscale 字样,因为我们要进入容器内部操作。
00:06:04现在我们拿到了预认证密钥。
00:06:07接着复制这条命令并粘贴到 Ubuntu test 3 中。
00:06:11然后复制我们的密钥并粘贴到这里。
00:06:15最后,我们要把这里的登录服务器改为我们的 Headscale 服务器,也就是我们之前配置的 headscale.pandor.css。
00:06:23Pandora 被人占了,不然我就用那个名字了。
00:06:26现在按下回车,我们的 Headscale 网络中应该就会多出一个新节点。
00:06:31回到控制端运行 nodes list,可以看到 Ubuntu test 3 已经在线了,它属于用户 Tom,并分配了 IPv4 和 IPv6 地址。
00:06:44现在把 Ubuntu test 1 也加到 Tom 名下。
00:06:47但我先要把 ID 为 1 的现有 Ubuntu test 节点删掉,我用强制删除来跳过确认步骤。
00:06:56完成后,我再创建一个预认证密钥并添加到 Ubuntu test 节点,别忘了加上 SSH 标签来启用 SSH 功能。
00:07:06我们也去 Ubuntu test 3 把 SSH 设置好,这只是开启了通过 SSH 连接的能力。
00:07:13现在查看可用节点列表,Ubuntu test 1 和 Ubuntu test 3 都在 Tom 的名下了。
00:07:20让我们把两台都连上。
00:07:21获取 Ubuntu test 3 的 IP,进入 Ubuntu test 1,然后运行 SSH root 加上那个 IP。
00:07:30启用密钥后,可以看到我成功从 Ubuntu test 1 进入了 Ubuntu test 3。
00:07:35反过来,从 Ubuntu test 3 进入 Ubuntu test 1 也是一样的。
00:07:41如果你完全照着我的步骤做,很有可能连不上,因为你还需要添加访问控制策略(ACL)。
00:07:49让我给你们看看我的配置。
00:07:51清下屏,进入 headscale 目录,在 config 文件夹里有一个易读的 ACL JSON 文件。
00:08:01进去看看,这是一个非常简单的配置,基本上接受来自网络中任何源到任何目的地或端口的连接。
00:08:11在 SSH 部分,它接受虚拟网内的任何节点,允许它们无需审批即可通过 SSH 连接到其他节点的 root 用户。
00:08:24当然,根据你的网络环境和需求,你可能需要收紧策略,让特定节点只能连接特定端口,以保证安全。
00:08:33但这套配置很适合入门。
00:08:37同样,我会把链接放在描述栏。
00:08:40现在你可能会问,那 Headscale UI 呢?
00:08:43它会让整个过程变简单吗?
00:08:45我会说,既是也不是。
00:08:47展示给你看。
00:08:48这是我的 Headscale UI URL,现在可以看到 Tess 和 Tom 两个用户,以及他们相关的设备信息。
00:08:57显示了运行所需的密钥和已连接的节点。
00:09:01初始设置时,你必须添加 Headscale API 密钥,可以通过运行这条命令获得。
00:09:06但我发现这个 UI 在设备视图(device view)上有问题。
00:09:09如你所见,这里没显示多少信息,控制台报了一个 TypeScript 类型错误,这不该是我的锅,因为我没动过源码。
00:09:22而且到了这一步应用往往会卡死,什么都动不了。
00:09:26按理说我应该能在这里添加新设备并修改一些配置。
00:09:32但因为它 Bug 太多,我觉得没那么好用。
00:09:35虽然还有很多其他的 Headscale UI,有些甚至能更方便地配置访问控制策略。
00:09:42但就我个人而言,还没发现特别好用的 Headscale UI。
00:09:46所以,是的,配置过程确实有点繁琐。
00:09:49好吧,是非常繁琐。
00:09:51没有技术背景的人,甚至是初级开发人员,可能都很难独立把它跑通。
00:09:57这可能也是为什么 Tailscale 团队允许员工开发这个项目,因为目前它对公司业务构不成什么威胁。
00:10:07我的意思是,如果有人用 Claude Opus 为它套上一个漂亮的 UI,那可能会非常酷,但也可能会受到开源协议的限制。
00:10:18但一旦一切就绪,Headscale 的表现确实惊人。
00:10:22虽然它还不支持某些功能,比如用于公网或局域网暴露服务器的 Funnel 和 Serve 命令。
00:10:32它也不支持多虚拟网(Tailnets)、临时节点和原生网络流日志。
00:10:38但作为一个开源工具,这已经非常了不起了。
00:10:42如果哪天我想让 OpenClaw 配合本地大模型完全离线运行,我可能会考虑使用它。