Headscale/Tailscale 组网

折腾
261 0

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

Docker 安装方式完成!


二、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 

Linux 安装完成!

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

CMD 继续运行,复制授权 KEY 备用。

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

PC 安装完成!


四、Padavan 外网主机 D 客户端

搞路由器,小心失联!

Padavan 20230104 已更新固件内置 Tailscale 功能界面,不用手动安装

# 查看 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 所在局域网下所有设备/服务。
  • 速度快慢依赖于打洞是否成功,不然就走官方中继节点传输数据。

八、最后

  1. Headscale 是中央控制端(注册,下发协调参数等)配置好参数就不用理会了,剩下只要研究下 Tailscale 的官方文档。
  2. 部署中继 DERP Server 貌似还需要一台服务器 443 端口,因当前穿透成功率很高,DERP 暂未研究。
  3. Headscale 数据库文件 db.sqlite,可以通过 SQLiteStudio 直接修改,比如路由节点无法 cli 删除时使用。
  4. 报错:

    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 穿透是如何工作的:技术原理及企业级实践

多模式:

登录查看隐藏内容

更新 2023-08-30
评论 ( 0 )
私信
pic
code
pre