有一批零散的windows机器需要远程管理,之前一直通过ToDesk远程桌面的方式来管理,延迟高带宽小,操作起来很难受。
为了方便,要把这批机器都换装Linux,同时组建虚拟局域网,方便接入k8s集群统一管理。
Headscale是Tailscale控制端的开源实现,Tailscale本质是一款商业产品,免费用户是有限制的,同时官方提供的DERP节点都不在国内,导致NAT穿透失败后走中继的延迟和带宽表现都挺一般,这就需要自建Headscale和DERP服务器来实现完全可控和加速中继。
简单来说,Headscale是服务端,Tailscale是客户端,DERP是中转流量的小弟。
操作环境
- 阿里云服务器一台,带宽5M,部署Headscale服务给节点做验证
- 阿里云服务器一台,带宽30M,部署DERP服务做辅助打洞和流量中转
❗注意DERP服务强制要求https,部署在大陆地区需要自行解决备案问题
- Linux客户端若干,位于不同省份,均无公网ip,部署Tailscale
Headscale部署
拉取Docker镜像
Headscale官方提供了docker镜像,链接:DockerHubdocker pull headscale/headscale:0.22.3
下载模板配置文件
wget -O /etc/headscale/config-example.yaml \ https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml
根据实际对配置文件进行修改
server_url: http://<服务器ip>:8001 # 这里的ip端口是服务器的ip和实际端口,如果容器内外端口号不一样,填容器外的 listen_addr: 0.0.0.0:8080 # 这里的监听地址和port按实际修改 metrics_listen_addr: 0.0.0.0:9090 # 指标采集接口,没有监控需求的可不暴露此端口 grpc_listen_addr: 127.0.0.1:50443 # grpc端口 grpc_allow_insecure: false private_key_path: /etc/headscale/private.key noise: private_key_path: /etc/headscale/noise_private.key ip_prefixes: # 虚拟局域网的网段,ipv6用不上可以删掉 - fd7a:115c:a1e0::/48 - 100.64.0.0/10 disable_check_updates: true # 关闭Headscale启动时的检查更新 logtail: enabled: false # 关闭Tailscale公司的远程日志收集 其他配置自行参考模板文件
拉起容器
docker run -d \ --name headscale \ -v /etc/headscale:/etc/headscale/ \ -p 8001:8080 \ # 这里的端口要按实际来改 headscale/headscale:0.22.3 \ headscale serve
Tailscale部署
因为Tailscale官方的软件源不在国内,国内也没有加速镜像,跑官方的安装脚本非常慢,所以选择二进制安装的方式来部署。
- 下载二进制文件
Tailscale官方二进制下载页: 下载
自行选择下载合适的二进制包 解压二进制文件包
tar -xvf ./tailscale_1.46.1_amd64.tgz
解压后得到以下文件:
root@armbian:~/tailscale_1.46.1_arm64# tree . ├── systemd │ ├── tailscaled.defaults │ └── tailscaled.service ├── tailscale └── tailscaled 1 drecitory, 4 files
移动文件到对应目录下
mv ./tailscale* /usr/sbin mv ./systemd/tailscaled.service /etc/systemd/system/ mv ./systemd/tailscaled.defaults /etc/default/tailscaled
启动服务
systemctl daemon-reload systemctl start tailscaled.service systemctl enable tailscaled.service
注册节点
首先在Headscale容器内创建一个用户,用户的概念和k8s的Namespace一样,是用来隔离资源的
headscale user create root
在Tailscale节点上执行命令,获取nodekey
tailscale up \ --accept-dns=false \ # 不接受Headscale设置的magic-dns --accept-routes \ # 接受其他节点广播的子网路由 --advertise-routes=192.168.0.0/24,192.168.1.0/24 \ # 向其他节点广播子网路由 --login-server=http://<HeadscaleIP>:8001 # Headscale服务地址
执行命令后Tailscale会给出一个网址,指向Headscale的注册页
[root@centos ~]# tailscale up --accept-dns=false --accept-routes --advertise-routes=192.168.0.0/24,192.168.1.0/24 --login-server=http://<HeadscaleIP>:8001 Warning: IPv6 forwarding is disabled. Subnet routes and exit nodes may not work correctly. See https://tailscale.com/s/ip-forwarding To authenticate, visit: http://<HeadscaleIP>:8001/register/nodekey:fe**************40
记下网址后面跟的nodekey
在Headscale上用nodekey注册节点
到这一步可以不打开注册页,注册页上就一条注册命令,没什么用
直接切到Headscale容器的shell,执行以下命令注册节点
username要换成第一步创建的用户,nodekey要换成上面那个网址的nodekeyroot@e0d00fa45fe0:/# headscale nodes register --user <username> --key nodekey:fe**************40 Machine centos registered
注册完成后,Tailscale会打印出一条信息,如果没有,也可以直接ctrl+c退出来,一般都是注册好了
Success. [root@centos ~]#
检查状态
Headscale上可以用headscale node list
来查看节点状态root@e0d00fa45fe0:/# headscale node list ID | Hostname | Name | MachineKey | NodeKey | User | IP addresses | Ephemeral |Last seen | Expiration | Online | Expired \1 | centos | centos | [*****] | [*****] | root | 100.64.0.1 | false |2023-08-01 00:00:00 | 0001-01-01 00:00:00 | online | no
Tailscale上可以用
tailscale status
来查看状态[root@ovpn ~]# tailscale status 100.64.0.1 centos root linux -
两边都能看到信息,说明节点注册正常
按照同样的流程注册其他节点,节点之间就可以通过Headscale分配的100.64.0.0/10网段的ip进行通信了
DERP的部署比较麻烦,坑比较多,放到下篇单独写