前言
zerotier 是我正在用的虚拟局域网设施。它的主要特性就是能用 UDP 打洞 技术,在没有公网 IP 地址的情况下实现 P2P 连接。tailscale 是它的类似物。
今天从网上看到了一份 评测 ,里面提到:
- Tailscale: Download speed: 796.48 Mbps, Upload speed: 685.29 Mbps
- ZeroTier: Download speed: 584.17 Mbps, Upload speed: 406.12 Mbps
看起来 tailscale 比 zerotier 快不少。于是决定把现有的 zerotier 网络迁移到 tailscale 上面去。
中继服务器 headscale 架设
想了想,现在的 zerotier 网络由于大陆没有中继服务器,打洞偶尔会非常不顺利。tailscale 和 zerotier 一样在大陆没有中继服务器,估计也会遇到一样的问题。最好的解决方案也许就是使用 tailscale 的开源实现,headscale 自建一个中继服务器。
所以,决定自建 headscale 服务!
因为 headscale 服务需要在节点建立 P2P 连接时提供帮助,所以需要所有节点即使在没有 tailscale 网络时,也能连接到 headscale 服务。也就是说,headscale 服务需要一个公网 IP。因此,我只能在我的 VPS 上搭建服务。
为了保持现在依赖 zerotier 网络的服务依然能够运行,我需要保证新的 tailscale 网络里设备依然有它们原本在 zerotier 网络里时 的 IP。为了避免 IP 地址冲突,首先,删掉原来就有的 zerotier:
1 | 0 apt autoremove zerotier-one |
接着,参考 headscale 的 Linux 安装指南。我们的 VPS 是 Debian bookworm 发行版,amd64 架构。因此,我们先下载对应的 deb 包,然后安装:
1 | wget https://github.com/juanfont/headscale/releases/download/v0.22.3/headscale_0.22.3_linux_amd64.deb |
接着来配置 headscale。因为端口很难记,所以我们先用 nginx 给它反向代理一下,让它可以使用酷炫的维尔薇爱好者特供域名和 SSL :
1 | map $http_upgrade $connection_upgrade { |
这样配好了以后,就可以用 headscale.villv.tech 访问我们监听 18002 端口的 headscale 服务了。我们再编辑 /etc/headscale/config.yaml
把 headscale 服务配好(配置文件中有详细的注释,不再给出示例)。
写 headscale 配置时发现它只支持 110.64.0.0/10 这一个网段,和原来 zerotier 的 172.27.0.0/16 完全不在一个段。它还不支持改网段,这下 zerotier 白删了。tailscale 给了个 解释 说明为什么用这个段( 但是没说为什么不支持改)。其中有句话特别好玩:
The addresses are supposed to be used by Internet Service Providers (ISPs) rather than private networks. Philosophically, Tailscale is a service provider creating a shared network on top of the regular Internet. When packets leave the Tailscale network, different addresses are always used.
好耶,我现在也是个 ISP 了!
不管怎么样,总之 headscale,启动!
1 | root:/etc/nginx/sites-enabled# systemctl enable --now headscale.service |
客户端 tailscale 安装
首先,VPS 作为网关,肯定得加入我们的 headscale 网络,这样才能把流量转发到我们在 headscale 网络里的服务中。所以,先试着在 VPS 上安装。
注意,你可以需要辗转两个组织(headscale 和 tailscale)提供的文档,才能把它玩起来。
依照 tailscale 提供的 安装指南 :
1 | curl -fsSL https://pkgs.tailscale.com/stable/debian/bookworm.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null |
接着,再依照 headscale 提供的 接入指南
在 headscale 服务器上执行:
1 | root:~# headscale users create jyi |
获取到一个连接密钥。
接着在需要连接到 headscale 服务的 tailscale 客户端上执行,并且带上刚刚获取的连接密钥:
1 | root:~# tailscale up --login-server https://headscale.villv.tech --authkey XXXXXXXXXXXXXce90980f4XXXXXXXXXXXXXXXXXXXXXXXXXX |
搞定!接下来检查一下自己是否已经拿到了 tailscale 的 IP 地址:
1 | root:~# ip a |
发现,大功告成!
然后,我们再在另一台机器(我的 homelab)上做类似的事情,在上面配置好 tailscale 的客户端。
最后,试着 ping 一下:
1 | warmhome 21:01 ~ |
好耶,ping 通了!而且通过 tailscale 网络 ping VPS 的延迟基本上和直接 ping VPS 的物理地址的延迟一样,感觉很不错。