tailscale收费有限制,headscale开源,可做服务端,然后用tailscale作为客户端来接入网络
服务端安装
拉取headscale
wget https://github.com/juanfont/headscale/releases/download/v0.20.0/headscale_0.20.0_linux_amd64 -O /usr/local/bin/headscale赋权限
chmod +x /usr/local/bin/headscale创建目录
mkdir -p /etc/headscale #配置目录
mkdir -p /var/lib/headscale #存储数据与证书创建数据库文件
touch /var/lib/headscale/db.sqlite拉取配置文件
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml修改配置文件:
修改server_url服务端的ip地址和端口
unix_socket: /var/run/headscale/headscale.sock
创建服务
vi /etc/systemd/system/headscale.service# /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=syslog.target
After=network.target
[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5
# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale
[Install]
WantedBy=multi-user.target创建headscale用户
useradd headscale -d /home/headscale -m修改 /var/lib/headscale 目录的 owner
chown -R headscale:headscale /var/lib/headscale重新加载
systemctl daemon-reload开机自启
systemctl enable --now headscale查看运行状态
systemctl status headscale创建命名空间
headscale namespaces create default查看命名空间
headscale namespaces list查看节点列表
headscale nodes listLinux客户端接入
拉取文件
wget https://pkgs.tailscale.com/stable/tailscale_1.22.2_amd64.tgz解压
tar zxvf tailscale_1.22.2_amd64.tgz将二进制文件复制到官方软件包默认的路径下
cp tailscale_1.22.2_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.22.2_amd64/tailscale /usr/bin/tailscale将 systemD service 配置文件复制到系统路径下
cp tailscale_1.22.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service将环境变量配置文件复制到系统路径下
cp tailscale_1.22.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled开启自启
systemctl enable --now tailscaled查看状态
systemctl status tailscaled接入headscale
# 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名
tailscale up --hostname=<节点名称> --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false执行完上面命令后,会出现
To authenticate, visit:
http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704
1150d846在浏览器打开会出现,注册节点的命令,如下
#USERNAME 为在服务端创建namespace
headscale nodes register --user USERNAME --key nodekey:08ec6e3c50b218fb63decc7636420129b758aa44873b67c83c9041a06699a566在服务器端执行该命令即可
windows客户端接入
在浏览器打开地址:服务端的ip:端口/windows,例如http://1.1.1.1:9000/windows

按照步骤在cmd下执行即可
然后用客户端登录,连接字符串在服务端注册
打通局域网
客户端命令
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf重新接入headscale,添加参数 --advertise-routes=192.168.100.0/24 --reset
# 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名
tailscale up --hostname=<节点名称> --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.100.0/24 --reset服务端
headscale routes list
headscale routes enable -r 1 //1为 routes list 的id
headscale routes disable -r 1 //删除路由然后就可以 访问 那台客户端所在的局域网的所有ip了
如果异地的网段与本地的网段有冲突,还不知道怎么解决?
以上参考:https://icloudnative.io/posts/how-to-set-up-or-migrate-headscale
headscale常用命令
headscale namespace list # 查看所有的namespace
headscale namespace create default # 创建namespace
headscale namespace destroy default # 删除namespace
headscale namespace rename default myspace # 重命名namespace
headscale node list # 列出所有的节点
headscale -n default node ls # 只查看namespace为default下的节点
headscale node delete -i<ID> # 根据id删除指定的节点,这里面的id是node list查询出来的id
# 参考headscale nodes delete -i=6
headscale routes list -i 9 # 列出节点9的所有路由信息
headscale routes enable -r 9 #将节点9的路由中信息为192.168.10.0/24的设置为true,
# 这样除了虚拟内网ip,原先的内网ip网段为192.168.10的也能访问了
# 后面的/24表示子网掩码是24个1,就是255.255.255.0
# preauthkeys主要是方便客户端快速接入,创建了preauthkeys后客户端直接使用该key就可以直接加入namespace
headscale -n default preauthkeys list # 查看名称为default的namespace中已经生成的preauthkeys
headscale preauthkeys create -e 24h -n default # 给名称为default的namespace创建preauthkeys
# apikeys是为了客户端和headscale做http鉴权用的,http请求的时候需要设置头部authorization
# 值为固定的字符串"Bearer "加apikeys创建的key
headscale.exe apikeys create # 创建apikeys,在创建的时候需要记录下完整的值,后续查询出来的都是prefix
# 值类似于zs3NTt7G0w.pDWtOtaVx_mN9SzoM24Y02y6tfDzz5uysRHVxwJc1o4
headscale.exe apikeys list -o=json #查询headscale的apikeys,并将结果输出成json格式
文章介绍了如何使用开源项目headscale作为服务端,替代tailscale的部分功能,包括服务端和Linux、Windows客户端的安装配置,以及节点接入和网络路由的设置。通过这种方式,可以搭建自己的网络服务,实现设备之间的安全连接。
1291





