Headscale 是 Tailscale 网页控制端的平替软件,可以个人搭建,但前者不像后者有便捷界面,需手动命令操作。对于没有太多要求 Tailscale 足够满足使用。
使用环境:
# 公网主机 A 搭建:
控制端:Linux_Server_Headscale_Vps
网段:独立 IP
# 内网主机 B 安装:
跳板机:Linux_Client_Tailscale_Home1
网段:192.168.1.0/24,虚拟网 10.2.2.1
# 外网主机 C 安装:
工作机:Windows_Client_Tailscale_Job
网段:任意宽带/流量,虚拟网 10.2.2.2
# 外网主机 D 安装:
路由器:Padavan_Client_Tailscale_Home2
网段:192.168.2.0/24,虚拟网 10.2.2.3
需求探索:
- 任意外网主机 C 不受限制随时访问内网主机 B 所在局域网内所有设备和服务。(已搞定)
- 一路由器主机 D 内网的任意设备不受限制访问内网主机 B 所在局域网内所有设备和服务。(已搞定)
- 双端路由器组网,内网任意设备互访两边所有设备和服务。(未测试)
一、安装 Headscale 服务端
1.主机 A 控制端 Linux
版本:https://github.com/juanfont/headscale/tags
安装:
# v0.18 后执行命令有变动
wget https://github.com/juanfont/headscale/releases/download/v0.18.0-beta2/headscale_0.18.0-beta2_linux_amd64 -O /usr/local/bin/headscale
chmod +x /usr/local/bin/headscale
# v0.17
wget https://github.com/juanfont/headscale/releases/download/v0.17.1/headscale_0.17.1_linux_amd64 -O /usr/local/bin/headscale
chmod +x /usr/local/bin/headscale
2.如果卸载
systemctl stop headscale
systemctl disable headscale
rm -fr /usr/local/bin/headscale
rm -fr /lib/systemd/system/headscale.service
rm -fr /etc/headscale/
#userdel headscale && rm -fr /home/headscale
3.配置文件
# 创建目录
mkdir -pv /etc/headscale
# 拉取配置文件
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
# 修改参数
server_url: http://x.x.x.x:5555 # 以 http(s):// 开头,可以是IP和域名,https貌似也要加上443。作为HTTP对外显示URL,展示信息之类用途。
listen_addr: 0.0.0.0:6666 # 用途:客户端与服务端之间通讯作用,port 可用于 nginx 反代。
ip_prefixes: - 10.2.2.0/24 # 组网的网段,没有 IPV6 可以关闭。
magic_dns: false # 待测
randomize_client_port: true # 让客户端使用随机端口,建议打开,因为如果内网里两台节点可能会冲突
# 其它可以保持默认,更多参数待研究。
4.启动验证配置
先启动一次,是为了检查配置文件并且生成文件,路径/etc/headscale
和/var/lib/headscale
。
headscale serve
其它:
# 查看端口(排查端口占用)
ss -tulnp | grep headscale
# 杀进程
killall -9 headscale
# 再开个窗口测试(忽略此步)
curl http://127.0.0.1:9090/metrics
# 获取注册表(忽略此步,下面有手动步骤)
http://公网IP:6666/windows
5.创建用户(暂时忽略)
useradd headscale -d /home/headscale -m # 测试时不使用,减少影响
chown -R headscale:headscale /var/lib/headscale # 测试时不使用,减少影响
6.自启管理
rm -frv /lib/systemd/system/headscale.service
tee /lib/systemd/system/headscale.service <<-'EOF'
[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
EOF
# 已注释 security 参数
# 报错:(code=exited, status=217/USER)
# 说明 headscale.service 里 User 和 Group 不存在
#
# 报错:(code=exited, status=1/FAILURE)
# 把 Optional security enhancements 内容注释
7.进程管理
# 自启
systemctl daemon-reload
systemctl enable headscale --now
# 其它
systemctl start headscale
systemctl restart headscale
systemctl status headscale
systemctl stop headscale
systemctl disable headscale
8.建立 Namespace
# 建立 Namespace 命名空间 `halo`(可以理解为私域空间,VLAN)
headscale namespaces create halo
# 查看命名空间
headscale namespaces list
9.headscale 常用命令
# ? 表示节点 ID
headscale nodes list # 查看节点信息
headscale nodes delete -i ? # 删除对应节点
headscale routes list # 查询所有节点的子网路由 Enabled 是否开启 false/true
headscale routes enable -r 1 # 仅限v0.18版本使用。数字 1 代表查询到的子网段对应 ID,可以是 2 3 4 5..,但不是节点 ID
10.可能用到
1.IE 浏览器打开
http://公网IP:6666/windows
http://域名/apple
2.Edge 浏览器edge://flags/#edge-automatic-https
->禁用 ->清理所有缓存记录 ->重启 Edge
3.Chrome 处理始终跳转 https 无法访问的问题chrome://net-internals/#hsts
-> Delete domain security policies
输入域名。
4.headscale-ui(未测试)
现成 UI 换浏览器后配置无法保存:
https://github.com/gurucomputing/headscale-ui
docker rm -f HeadscaleUI
docker run -itd \
--name HeadscaleUI \
--restart=always \
-p 8860:80 \
ghcr.io/gurucomputing/headscale-ui:latest
生成 Headscale Apikey,到时 headscale-ui 会用到:
headscale apikeys create -e 720d
# or
docker exec Headscale headscale apikeys create -e 720d
######
Y2RZO2OwsQ.bIfYCW-xOv4viUcihrUc3-bULpESDz7_XB-xxxxxxxx
5.Docker 运行 Headscale(镜像还是 v0.17 版,目前正在使用该方式部署)
官方文档:
https://github.com/juanfont/headscale/blob/main/docs/running-headscale-container.md
# 提前准备:目录,配置,修改参数
mkdir -pv ~/docker/Headscale/config/
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O ~/docker/Headscale/config/config.yaml
部署命令:
docker rm -f Headscale
docker run -itd \
--name Headscale \
--restart=always \
-p 6666:6666 \
--cap-add=CAP_NET_BIND_SERVICE \
--sysctl net.ipv4.ip_forward=1 \
--sysctl net.ipv6.conf.all.forwarding=1 \
-v ~/Docker/Headscale:/etc/headscale/ \
-v ~/Docker/Headscale:/var/lib/headscale \
headscale/headscale:latest \
headscale serve
# --------------------
# 可忽略参数
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--cap-add=SYS_MODULE \
创建隔离空间 halo
docker exec -it Headscale headscale namespaces create halo
备用命令,适用于 v0.17
docker exec -it Headscale headscale nodes list
docker exec -it Headscale headscale routes list -i 1
docker exec -it Headscale headscale routes enable -i 1 -r "192.168.1.0/24"
docker exec -it Headscale headscale routes enable -i 1 -a
docker logs --follow Headscale
验证
docker exec -it Headscale headscale namespaces list
二、Linux 主机 B 客户端
0.开启 IP 转发
echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf
sysctl -p
1.查询版本
https://pkgs.tailscale.com/stable/
wget https://pkgs.tailscale.com/stable/tailscale_1.34.2_amd64.tgz
tar zxvf tailscale_1.34.2_amd64.tgz
2.安装运行
cp -fr tailscale_1.34.2_amd64/tailscaled /usr/sbin/tailscaled
cp -fr tailscale_1.34.2_amd64/tailscale /usr/bin/tailscale
cp -fr tailscale_1.34.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service
cp -fr tailscale_1.34.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled
systemctl enable --now tailscaled
systemctl status tailscaled
注册
1.生成注册秘钥
# 生成注册密钥,advertise-routes 告知服务端本机(内网跳板机)可以转发的网段,到时候会广播给所有已同意 accept-routes=true 的客户端
tailscale up --accept-dns=false --accept-routes=true --login-server http://公网IP:6666 --advertise-routes=192.168.1.0/24
# 获得秘钥
3b7e78fec55b7a3c4xxxxxxxxxxxxxxxxxxxxx
# 备用内容(忽略)
service tailscaled restart
# 重置配置(解决某些问题)
tailscale up --reset
2.同意激活客户端(服务端执行)halo
为之前自定 namespaces 命名空间
headscale -n halo nodes register --key nodekey:3b7e78fec55b7a3c4xxxxxxxxxxxxxxxxxxxxx
3.开启路由
# 查看节点路由
headscale routes list
------------------------------------------------
ID | Machine | Prefix | Advertised | Enabled | Primary
1 | debian | 192.168.1.0/24 | true | false | false
# 开启路由 ID,不是节点 ID,v0.18 可用
headscale routes enable -r 1
------------------------------------------------
ID | Machine | Prefix | Advertised | Enabled | Primary
1 | debian | 192.168.1.0/24 | true | true | false
3.如果卸载
systemctl stop tailscaled
systemctl disable tailscaled
rm -fr tailscale_1.34.2_amd64/tailscaled /usr/sbin/tailscaled
rm -fr tailscale_1.34.2_amd64/tailscale /usr/bin/tailscale
rm -fr tailscale_1.34.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service
rm -fr tailscale_1.34.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled
# 下面只清空目录内容而不删除,不然下次使用会造成找不到目录而无法启动程序
rm -fr /var/lib/tailscale/*
4.其它(可忽略)
Linux 服务端生成一个 24 小时有效激活秘钥,仅限个客户端使用一次。
headscale preauthkeys create -e 24h -n halo
-----------
24842008163327f3fda738360cbbc37bacxxxxxxxx
tailscale up --accept-dns=false --accept-routes=true --advertise-routes=192.168.1.0/24 --login-server http://公网IP:6666 -–authkey 24842008163327f3fda738360cbbc37bacxxxxxxxx
5.查看客户端节点间的路由(备用)
用来查询当某节点设置广播通过后,其它节点是否能收到通告的子网段。
ip route show table 52
6.tailscale up 常用参数(重要)
https://tailscale.com/kb/1080/cli/
-–hostname # 设置名称
--login-server # 注册服务主机地址
-–accept-dns # 使用服务器下发的 DNS
-–accept-routes # 接受外部节点发布的路由
-–advertise-routes # 告知服务器可转发的路由
-–advertise-exit-node # 可以建立数据导向节点 exit node,即本机访问互联网皆通过此节点 bolean
-–exit-node # 指定出口节点, 导向所有流量经这出口节点
-–authkey # 指定生成的 authkey
tailscale ping xx.xx.xx.xx # ping 指定内网地址 可以看是 p2p 还是 中转
tailscale status # 查看节点状态
tailscale netcheck # 查看各 DERP 节点网络情况
tailscale nc/ssh
tailscale file
三、Windows 主机 C 外网客户端
1.安装后不登陆,退出。
https://tailscale.com/download/windows
2.新建注册表.reg 双击导入,拦截软件访问服务器注册服务器,可选,没什么作用。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Tailscale IPN]
"UnattendedMode"="always"
"LoginURL"="http://公网IP:6666"
3.开启 Windows 系统 IP 转发功能,可选,除非这台机器做跳板机。
选中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
将右边 IPEnableRouter
值从 0 改为 1
4.运行 tailscale 软件。
注册
1.生成注册秘钥 cmd 执行:
# 生成注册密钥
tailscale up --accept-dns=false --accept-routes=true --login-server http://公网IP:6666 --unattended
# 获得秘钥
563a29d83282b4935xxxxxxxxxxxxxxxxxxxxx
# 重置缓存旧参数
tailscale up --reset
2.回到服务端激活客户端。halo
建立的命名空间,nodekey
是上边的授权秘钥:
headscale -n halo nodes register --key nodekey:563a29d83282b4935xxxxxxxxxxxxxxxxxxxxx
授权成功时:
- Linux 服务端 SSH 会显示:
Machine xxx registered
- PC 客户端 CMD 会显示:
Success.
- PC 客户端:Tailscale 图标被点亮。
- 遇到问题:
Cannot register machine: machine not found in registration cache
,秘钥不正确或服务器端匹配的 KEY 被清理了。
1.服务端查看注册情况
headscale nodes list
------
ID | Hostname | Name | MachineKey | NodeKey | Namespace | IP addresses | Ephemeral | Last seen | Online | Expired
1 | Debian | debian | [XiRBh] | [O354/] | halo | 10.2.2.1, | false | 2022-12-06 02:42:27 | online | no
2 | MS365 | ms365 | [AU0nO] | [kdhUU] | halo | 10.2.2.2, | false | 2022-12-06 03:11:12 | offline | no
2.Windows可能遇见问题:
https://github.com/juanfont/headscale/blob/main/docs/windows-client.md
四、Padavan 外网主机 D 客户端
搞路由器,小心失联!
# 查看 Soc
cat /proc/cpuinfo
# 根据架构下载安装包:
https://pkgs.tailscale.com/stable/#static
https://bin.entware.net/mipssf-k3.4
https://bin.entware.net/mipselsf-k3.4/archive/
# 安装
opkg update
opkg install "https://bin.entware.net/mipssf-k3.4/archive/tailscale_1.28.0-1_mips-3.4.ipk"
reboot
# 注册
tailscale up --reset
tailscale up --accept-dns=false --accept-routes=true -advertise-routes=192.168.2.0/24 --login-server http://公网IP:6666
tailscale ip
tailscale status
# 服务端激活
内容同上,已省略。
五、Android 客户端
APK 下载:https://leeyr.lanzoul.com/b076qui8b 密码:
f20r
Google Play:https://play.google.com/store/apps/details?id=com.tailscale.ipn&pli=1 Package Name: com.tailscale.ipn [Play Store] File Size: 36.4 MB Update On:2023-01-05
使用方法:
- 快速点击右上角的点,直到跳出 Change server,填好服务器,再 Sign in whit other,跳转浏览器获取秘钥。
- 如果还是跳转到官方登陆界面,就再次点击自定义服务器界面的 Save 即可。
- 关闭页面回到 APP 会自动激活 VPN 功能。
六、iOS 客户端
iOS 目前无法自定义授权域名。当时考虑抓包 Tailscale 授权域名进行 DNS 劫持注册,但本机又需要类似 VPN 软件去修改 DNS。又或者在路由器修改,既然都有路由器做节点了,感觉多此一举。
2023-8-30 19:15:24
官版已支持,自定义授权域名
https://github.com/MirageNetwork/MirageServer
https://testflight.apple.com/join/wg6rNFFv
七、组网测试
- 通过主机 C 成功访问主机 B 所在局域网下所有设备/服务(文件同步、远程桌面等)。
- 通过主机 D 内部任意设备成功访问主机 B 所在局域网下所有设备/服务。
- 速度快慢依赖于打洞是否成功,不然就走官方中继节点传输数据。
八、最后
- Headscale 是中央控制端(注册,下发协调参数等)配置好参数就不用理会了,剩下只要研究下 Tailscale 的官方文档。
- 部署中继 DERP Server 貌似还需要一台服务器 443 端口,因当前穿透成功率很高,DERP 暂未研究。
- Headscale 数据库文件 db.sqlite,可以通过 SQLiteStudio 直接修改,比如路由节点无法 cli 删除时使用。
报错:
Warning: client version "1.34.2" != tailscaled server version "1.32.3 # 路径:/usr/bin/tailscale 和 /usr/sbin/tailscaled 两个文件版本不同导致的。
参考:
Running headscale on Linux
Headscale 的部署方法和使用教程
Headscale 搭建 P2P 内网穿透
NAT 穿透是如何工作的:技术原理及企业级实践
多模式: