网状 VPN 是那种悄无声息让一切变简单的工具:你的笔记本、家用服务器、手机和各台 VPS 无论身在何处,都能通过私有地址互相访问。托管式网状 VPN 的问题在于协调服务器:一家公司掌握着你所有设备的地图。Headscale 是这台控制服务器的开源替代品。把它跑在一台小 VPS 上,继续使用原来的客户端应用,地图就归你所有。
各部分如何配合
- Headscale(在你的 VPS 上)分配地址、分发公钥,并执行你的 ACL。
- 客户端就是标准的 Tailscale 应用,指向你的服务器。
- 流量通过 WireGuard 在设备之间直接传输。控制服务器从不承载它。
最后这一点正是很小的套餐就够用的原因:VPS 只需响应小小的协调请求。
你需要准备
- Nano-IP(每月 $8):2 vCPU 和 1 GB 内存远超 Headscale 的用量。
- 独立 IPv4 和一个域名,例如
hs.example.com。设备通过 HTTPS 与控制服务器通信,因此 VPS 必须接受入站的 443;NAT 套餐做不到(详情)。
安装(Debian 12 / Ubuntu 24.04)
从 GitHub 上 Headscale 的发布页面下载当前的 .deb,并把版本号换成最新的:
HS_VER=0.26.1
wget -O headscale.deb \
"https://github.com/juanfont/headscale/releases/download/v${HS_VER}/headscale_${HS_VER}_linux_amd64.deb"
apt install -y ./headscale.deb caddy
编辑 /etc/headscale/config.yaml,关键的是这两行:
server_url: https://hs.example.com
listen_addr: 127.0.0.1:8080
在前面放一个 Caddy 提供 HTTPS:
cat > /etc/caddy/Caddyfile <<'EOF'
hs.example.com {
reverse_proxy 127.0.0.1:8080
}
EOF
systemctl enable --now headscale
systemctl reload caddy
添加用户和设备
headscale users create alice
headscale users list # note the user's ID
headscale preauthkeys create --user 1 --expiration 24h
较旧的版本在 --user 中要求用户名而不是 ID;headscale preauthkeys create --help 会告诉你当前版本需要哪一种。
在 Linux 设备上:
tailscale up --login-server https://hs.example.com --authkey YOUR_KEY
在手机和桌面端,Tailscale 应用允许你在设置中指定自定义的控制服务器。在 VPS 上运行 headscale nodes list,你的设备应该就会出现在列表里。
中继与 NAT 穿透
大多数设备都能直连。当两台设备无法直连时(严格的移动网络、双重 NAT),流量会经过 DERP 中继。开箱即用时,Headscale 使用 Tailscale 的公共中继,中继只能看到加密的数据包。如果你不希望路径上有任何外部环节,就在 config.yaml 中开启内置中继(derp.server.enabled: true),并开放 UDP 3478。此时被中继的流量会计入你的 VPS 带宽。
坦诚的局限
没有官方的 Web 仪表板:用户、密钥和路由都是 CLI 命令(做过两次就熟了)。托管服务的新功能会较晚才出现在 Headscale 中,甚至不会出现。而且控制服务器现在由你负责:它宕机时,已有的连接仍能工作,但新设备无法加入,密钥也无法刷新。请做好备份:全部状态都在 /var/lib/headscale。
对于家庭实验室、一个家庭,或者想把设备地图从第三方服务器上拿回来的小团队来说,这是一台 $8 VPS 最好的用法之一。
相关
- 自建 WireGuard VPN:只需要一条隧道的话,用纯 WireGuard 即可
- 用于 VPN 的 VPS
- 用于远程访问 Home Assistant 的 VPS
评论
暂无评论。来做第一个吧。