Headscale:无需订阅费,完美解锁 Tailscale 全部功能!

BBetter Stack
Internet TechnologyTelecommutingComputing/Software

Transcript

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 配合本地大模型完全离线运行,我可能会考虑使用它。

Key Takeaway

Headscale 为追求网络主权和零成本的用户提供了一个强大的 Tailscale 替代方案,尽管配置门槛较高且 UI 尚不完善,但其在私有加密组网方面表现卓越。

Highlights

Headscale 是 Tailscale 控制服务器的开源自托管实现,允许用户完全掌控自己的加密网络并免除订阅费用。

该项目虽然与 Tailscale 竞争,但奇特的是其核心维护者中包含 Tailscale 的员工,这体现了开源社区的独特生态。

通过 Docker 部署 Headscale 涉及到核心容器、Web UI 以及 Caddy 反向代理的协同工作,配置过程相对复杂。

Headscale 使用 SQLite 或 Postgres 数据库管理用户信息和节点,并通过 ACL 文件定义精细的网络访问控制策略。

虽然 Headscale 提供了强大的私有组网能力,但在 Web 界面易用性和某些高级功能(如 Funnel 或原生日志)上仍有缺失。

演示展示了如何通过预认证密钥(Pre-auth keys)将不同地点的 Ubuntu 服务器安全地连接到同一个虚拟私有网络中。

Timeline

Headscale 简介与演示效果

视频开头介绍了 Headscale 作为 Tailscale 开源替代方案的核心优势,即完全掌控加密网络并规避断网或涨价风险。演讲者展示了三台 Hetzner 服务器的实际运行效果,演示了如何在两个已连接节点之间进行互访。通过 SSH 测试证明,位于虚拟网内的节点可以互通,而外部设备则无法访问这些私有 IP。这一部分强调了 Headscale 在防止供应商锁定方面的价值,特别是对于 NAS 或树莓派用户。作者还提出了一个有趣的观察,即该竞争产品竟然是由 Tailscale 员工参与开发的。

环境部署与核心配置深度解析

这一章节深入探讨了 Headscale 的底层架构,包括使用 Docker Compose 部署核心容器、UI 界面和 Caddy 反向代理。作者详细解释了 lib 目录下的 SQLite 数据库功能,它负责存储用户、节点和 DNS 等关键元数据。配置文件采用 JSON 格式的访问控制列表(ACL),用户可以根据需要切换到 Postgres 数据库。视频还展示了如何通过 Cloudflare 修改 A 记录,将自定义域名指向 Headscale 控制端 IP。这部分内容为想要自行搭建的开发者提供了技术参考和配置思路。

用户创建与节点接入流程

作者演示了从零开始将新服务器 Ubuntu Test 3 接入网络的具体步骤,包括在控制端创建名为 Tom 的新用户。为了实现安全接入,需要生成特定的预认证密钥(Pre-auth keys)并配合 login-server 参数运行 Tailscale 客户端。视频详细记录了命令行操作过程,展示了如何通过 docker exec 命令在容器内执行管理任务。当节点成功上线后,可以通过 nodes list 命令实时查看分配的 IPv4 和 IPv6 地址。这一流程体现了 Headscale 虽然没有官方控制面板那样简便,但逻辑上非常严密。

ACL 策略配置与 Web UI 的局限性

此段重点讲解了访问控制策略(ACL)的重要性,指出如果没有正确配置 JSON 文件中的访问规则,节点间将无法通信。作者展示了一个基础的“允许所有”策略示例,并解释了如何启用无需审批的 SSH 连接功能。随后,视频评测了现有的 Headscale UI,指出其在设备管理视图中存在明显的 Bug 和 TypeScript 错误。作者坦言,对于缺乏技术背景的用户来说,目前的配置过程确实过于繁琐。这解释了为什么 Tailscale 暂时不将其视为商业威胁,因为易用性仍是两者的主要分歧点。

功能对比与最终总结

在视频的最后部分,作者诚实地列举了 Headscale 目前尚不支持的高级功能,例如用于内网穿透的 Funnel 和 Serve 命令。此外,该工具在处理多虚拟网(Tailnets)、临时节点以及网络流日志方面也存在短板。尽管如此,作者认为对于追求完全离线环境或本地大模型协作的用户来说,Headscale 依然是不可多得的神器。他鼓励有能力的开发者尝试为该项目开发更好的 UI 界面。总的来说,这是一个为技术极客准备的、充满潜力的高级组网工具。

Community Posts

View all posts