赞
踩
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 list
拉取文件
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
在服务器端执行该命令即可
在浏览器打开地址:服务端的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 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格式

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。