背景
用了多年的zerotier,近期发现,手上的VPS,加上自用的电脑,加起来已经超过了25台。这就很尴尬了。
再加上公司内部复杂的网络环境,多部门在不同外网,都有内部共享的需求。试着暂时用了一下zerotier,发现很快就25台了。没办法,只能另外想办法。
在网上找了一下,发现有tailscal方案,试用了一下,发现还可以自己搭整体方案。
试验了一下,现在已经正常跑起来了。在这里记录一下。(好多好多坑。。。。)
为了节省文字,这里不介绍和讨论技术架构及原理,只上干货。
安装headscale服务端
headscal是tailscal的开源服务端替代,安装这个后就可以直接使用它加上tailscal的客户端,任意组网。
https://github.com/juanfont/headscale
安装headscale,可以有很多方法,你可以用DOCKER,也可以用官方的安装包。由于我担心使用DOCKER会有很多内外网络的各种麻烦问题,自己又使用的是unbuntu系统,所以就直接使用了官方的DEB安装包。
- 在官方发布页面 下载我要的.deb 文件。
- 安装
sudo dpkg --install headscale.deb
- 编辑配置文件 /etc/headscale/config.yaml
这里我用找的资料,介绍一下配置文件的参数说明。
---
# Headscale 服务器的访问地址
#
# 这个地址是告诉客户端需要访问的地址, 即使你需要在跑在
# 负载均衡器之后这个地址也必须写成负载均衡器的访问地址
server_url: https://your.domain.com
# Headscale 实际监听的地址
listen_addr: 0.0.0.0:8080
# 监控地址
metrics_listen_addr: 127.0.0.1:9090
# grpc 监听地址
grpc_listen_addr: 0.0.0.0:50443
# 是否允许不安全的 grpc 连接(非 TLS)
grpc_allow_insecure: false
# 客户端分配的内网网段
ip_prefixes:
- fd7a:115c:a1e0::/48
- 100.64.0.0/10
# 中继服务器相关配置
derp:
server:
# 关闭内嵌的 derper 中继服务(可能不安全, 还没去看代码)
enabled: false
# 下发给客户端的中继服务器列表(默认走官方的中继节点)
urls:
- https://controlplane.tailscale.com/derpmap/default
# 可以在本地通过 yaml 配置定义自己的中继接待你
paths: []
# SQLite config
db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite
# 使用自动签发证书是的域名
tls_letsencrypt_hostname: ""
# 使用自定义证书时的证书路径
tls_cert_path: ""
tls_key_path: ""
# 是否让客户端使用随机端口, 默认使用 41641/UDP
randomize_client_port: false
由于我是用nginx来代理服务的,所以这里的配置方式上,是不使用headscale的ACME脚本去获取证书的,也没有填写自定义证书。
- 注册用户
一个用户就相当于一个空间,空间与空间之间是隔离的。
headscale user create xxxx
- 开启headscale服务
systemctl enable --now headscale
systemctl start headscale
systemctl status headscale
- 查看用户
headscale user list
ID | Name | Created
1 | default | 2022-03-09 06:12:06
- 获取API KEY
headscale apikey create
安装headscale前端管理界面
headscale前端有很多开源项目,我这里选用了一个:https://github.com/GoodiesHQ/headscale-admin
直接docker跑起来
docker run -p 8000:80 goodieshq/headscale-admin:latest
然后再在headscale服务端的Nginx反代里,加上反代前端的代码:
location /admin {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $server_name;
proxy_redirect http:// https://;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $server_name;
proxy_redirect http:// https://;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
}
这样就能用你的域名加上/admin来访问管理界面了,填写上你的域名,加上上面生成的API KEY,就能看到用户、节点等信息了。
连接客户端
官方说明有多端的连接方式,我这里只以WINDOWS和LINUX为例。
LINUX客户端连接
在客户端机器上,一条命令安装tailscale客户端
curl -fsSL https://tailscale.com/install.sh | sh
再一条命令加入到healscale服务端
tailscale up --login-server https://your.domain.com --accept-routes=true --accept-dns=false
把域名改为你自己的域名。
此时界面上会有提示一个网址,复制到网页里打开,网页里出现一条命令,复制出来。
headscale nodes register --user username --key mkey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
在headscale服务端,输入上面的命令,此时客户端和服务端都会提示成功,此时接入成功。
WINDOWS客户端连接
在客户端机器上,打开浏览器,打开https://your.domain.com/windows,此时应该可以看到提示。我们先下载那个.reg的注册表文件,然后右键管理员运行,提示导入成功。
再去tailscale官方网址,下载WINDOWS客户端。
安装客户端,然后就能看到右下角任务栏里出现了图标,点击就能看到连接状态和相关信息了。
查看各节点状态
headscale node list
这条命令可查看所有节点信息和连接状态。
客户端,也可以通过以下命令查看各节点连接状态。
tailscale status
安装derp中继服务器
docker安装derp
这个有好多个derp 的镜像,我找到下面这个还算比较靠谱。注意这个镜像的前提是本机要安装tailscale客户端,下面的命令里可以看到。
docker run -d \
--name derp \
--restart unless-stopped \
-p 8800:80 \
-p 3478:3478/udp \
--log-opt max-size=10M \
-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
sparanoid/derp:edge \
derper \
-a :80 \
-verify-clients true
- derper是DERP服务的二进制文件
- 上面打开的80和3478分别是DERP和STUN的端口。
- 指定的-v选项和下面给derper传递的-verify-clients选项是用于验证连接DERP的节点身份的,-verify-clients参数是默认不开启的,谁都可以通过你自建的DERP中转流量,对于流量有限的服务器来说难以接受,这就需要在derper所在的服务器上安装Tailscale,并加入到同一个虚拟网络中,打开derper的-verify-clients选项,同时设置-v参数,将Tailscale的socket套接字映射给derper,这样derper就会通过宿主机上的Tailscale来验证节点的身份,只有和derper在同一个虚拟网络中的节点才有权通过本DERP转发流量。
- 指定log的max-size是因为在打开-verify-clients选项时,每一条认证失败的信息都会被打印到日志里,在一些未授权节点只设置了一个DERP服务器的情况下,未授权节点会不停尝试连接DERP服务器,然后被DERP服务器拒绝连接,时间长了DERP服务器写的日志可能会占用太多的存储空间。
- -a参数指定非443端口时,内置的证书申请服务就会被禁用,derp会以http方式提供服务,https加密就需要前端的nginx来实现。
- 这里有一个坑,-a参数必须在-verify-clients前面,不然指定端口不生效,derper会以443端口https模式提供服务
以上说明引用 https://pigeonforce.xyz/index.php/archives/43/ 感谢鸽子。
然后在nginx里做一下反代,证书就在nginx里直接生成就行。
location / {
proxy_pass http://127.0.0.1:8800;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# websocket握手
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection Upgrade;
}
记得将本机的防火墙,以及运营商的安全组里加入3478/udp 放行。
访问你的域名,应该可以看到以下内容 :
DERP
This is a Tailscale DERP server.
修改服务端配置,增加中继服务器配置文件。
默认headscale服务端的配置里,使用的是tailscale官方的中继服务器:
# List of externally available DERP maps encoded in JSON
urls:
- https://controlplane.tailscale.com/derpmap/default
# Locally available DERP map files encoded in YAML
#
# This option is mostly interesting for people hosting
# their own DERP servers:
# https://tailscale.com/kb/1118/custom-derp-servers/
#
# paths:
# - /etc/headscale/derp-example.yaml
paths: []
#- /etc/headscale/derp.yaml
上面的urls,就是可以用链接来下载配置文件的,下面的paths,就是使用本地配置文件来拉取中断服务器信息。
我们可以将官方的关掉,只使用我们自己配置的中继服务器。
# List of externally available DERP maps encoded in JSON
urls:[]
# - https://controlplane.tailscale.com/derpmap/default
# Locally available DERP map files encoded in YAML
#
# This option is mostly interesting for people hosting
# their own DERP servers:
# https://tailscale.com/kb/1118/custom-derp-servers/
#
# paths:
# - /etc/headscale/derp-example.yaml
paths:
- /etc/headscale/derp.yaml
当然,你可以官方和本地的中断服务器都打开。
编辑本地中继服务器配置文件
vi /etc/headscale/derp.yaml
regions:
901:
regionid: 901
regioncode: DERP
regionname: Custom DERP
nodes:
- name: DERP_SERVER_1
regionid: 901
hostname: derp.example.domain
stunport: 3478
stunonly: false
derpport: 443
全部配置完成后,重启一下headscale
systemctl restart headscale
在任意节点上,看一下DERP配置的下发状态。
tailscale netcheck
Report:
* UDP: true
* IPv4: yes, xxxxx:xxxx
* IPv6: no, but OS has support
* MappingVariesByDestIP: false
* HairPinning: false
* PortMapping:
* Nearest DERP: Aliyun hongzhou
* DERP latency:
- aliyunhz: 2.3ms (Aliyun hongzhou)
- aliyunsz: 28ms (Aliyun shenzhen)
- aliyungz: 28.4ms (Aliyun guangzhou)
参考链接
@米开朗基杨 的博客: 链接
Tailscale的自建DERP教程:链接
kovacs 的博客 :链接
解决阿里云部署后外网出口问题
如果是阿里支的服务器,在安装完headscale服务端后,你会发现,好像上不了外网了,ping baidu.com都不通。。。
查了一下资料,用以下方法暂时避免一下,原因 https://nyan.im/p/troubleshoot-tailscale#comment-18008
修改/etc/netplan/下载配置文件
加上DNS服务IP,我的是50-cloud-init.yaml
network:
ethernets:
eth0:
dhcp4: true
dhcp6: true
nameservers:
addresses: [114.114.114.114]
match:
macaddress: 00:16:3e:2f:ce:f1
set-name: eth0
version: 2
其中,以下两条是我加上去的。
nameservers:
addresses: [114.114.114.114]
这时应该是可以正常连接外网了。但是apt update 和 apt upgrade 都还是会有问题,阿里云的内部镜像,访问不了。
我一恼之下,将APT源换了一下,比如换成北大或中科大的,就正常了。
备份源文件
cp /etc/apt/sources.list /etc/apt/sources.list.backup
编辑/etc/apt/sources.list,替换成中科大,或是北大的源即可。
#网易163源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse # deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse # deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse # deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse # deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse # 预发布软件源,不建议启用 # deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse # deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
#阿里云源 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#清华源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
中科大源 deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
最后apt update 和 apt upgrade 就正常了。
[1]: https://github.com/juanfont/headscale/releases
本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。