情景题要

因为团队有远程办公的需求,所以为了方便远程开发联调,需要部署一套虚拟局域网的方案。
排除Frp方案后,目前市面上有两种主要的方案

1.公网服务器中转流量的VPN的方式
2.基于点对点(P2P)的NAT穿透方案

肯定选择第二种,打洞成功后流量不经过中心服务器,对中心服务器的带宽要求没那么严格,且更加稳定。

工具选择

目前市面上主流的P2P NAT穿透VPN主流的有以下几种:

ZeroTier
Tailscale

两者之间的对比文章挺多的,但实际效果还得亲自尝试后才知道。
一开始我也是用的ZeroTier,出于中心服务器的网络延迟问题考虑,使用自建planet的方式
但在团队日常的开发使用过程中,发现有网络不通的问题,绝对更换成Tailscale的方案,自建中心服务器有开源的Headscale
Headscale有官方的安装指南,按照流程安装也挺方便的。

Headscale安装

安装服务器的操作系统:Ubuntu20.04 有docker安装的教程,但官方说“未经开发人员验证”,所以并未采用docker方案。

下载安装包

官方Github Release页下载安装包,注意系统的架构,并且是.deb后缀的包。 alt text

安装 Headscale:

sudo apt install ./headscale.deb

启用 Headscale 服务,这将在启动时启动 Headscale:

sudo systemctl enable headscale

配置 Headscale:

nano /etc/headscale/config.yaml

修改server_url,设置为自己的服务器的ip。
如果是通过反向代理访问的,则填外部连接的地址。
如果有域名可填域名,上TLS加密的话把http改为https,我没上域名和TLS。 alt text 本来打算修改组网内的机器的ip范围,但好像新版不支持更改,不是非要修改所以就不管了 alt text derp服务器感觉没有必要,而且需要https,所以没去部署。
自定义dns也没设置,在配置文件下面可以设
Headscale还有灵活的ACL用户通讯策略,有需求的可以看看,目前我用不到所以没设置

启动 Headscale:

sudo systemctl start headscale

检查 Headscale 是否按预期运行:

systemctl status headscale

Headscale添加用户

alt text

Headscale里的用户可以理解为一个网段,每个网段就是一个虚拟局域网。
我为了方便后面的设备进入这个网段中,所以采用预身份验证密钥的方式

创建用户

headscale users create myfirstuser

使用命令行生成密钥:

headscale --user myfirstuser preauthkeys create --reusable --expiration 24h

--expiration 为密钥有效期,如果要以天数为单位,后面带d
这将返回一个预先经过身份验证的密钥,对应后续客户端设备接入时的<YOUR_AUTH_KEY>

Tailscale客户端接入虚拟局域网中

Tailscale客户端下载
安装好后,Windows设备用PowerShell,Linux设备用sudo命令执行

tailscale up --login-server <YOUR_HEADSCALE_URL> --authkey <YOUR_AUTH_KEY>

<YOUR_HEADSCALE_URL>对应Headscale配置中的server_url alt text Windows下可在任务栏中查看自己的IP,Linux通过ifconfig查看