软件介绍
本文章还未完善,fork 下面这篇文章,改动不大。改了原文章中废弃的命令。但是部分说明未更上,请慎用
Headscale 是什么
Headscale 是Tailscale 的控制服务器。需要在有公网IP的服务器上部署,用于组建虚拟局域网。
Tailscale 是什么
Tailscale 是 Headscale 的客户端,每个需要加入虚拟局域网的设备都要安装 Tailscale 。
Headscale 安装部署
GitHub 仓库地址:(https://github.com/juanfont/headscale
将 headscale
二进制运行文件保存到 /usr/local/bin/ 目录
$ wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v<HEADSCALE VERSION>/headscale_<HEADSCALE VERSION>_linux_<ARCH>
$ chmod +x /usr/local/bin/headscale
创建配置目录:
$ mkdir -p /etc/headscale
创建目录用来存储数据与证书:
$ mkdir -p /var/lib/headscale
创建空的 SQLite 数据库文件:
$ touch /var/lib/headscale/db.sqlite
创建 Headscale 配置文件:
$ wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
修改配置文件,将 server_url
改为公网 IP 或域名。
如果暂时用不到 DNS 功能,可以先将 magic_dns
设为 false。
可自定义私有网段,也可同时开启 IPv4 和 IPv6(阿里云使用100网段会出问题):
ip_prefixes:
- fd7a:115c:a1e0::/48
- 10.1.0.0/16
创建 SystemD 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
修改配置文件中的 unix_socket
:
(这个目录还是别改了,保持默认吧)
unix_socket: /var/run/headscale/headscale.sock
Reload SystemD 以加载新的配置文件:
$ systemctl daemon-reload
启动 Headscale 服务并设置开机自启:
$ systemctl enable --now headscale
查看运行状态:
$ systemctl status headscale
查看占用端口:
$ ss -tulnp|grep headscale
tcp LISTEN 0 1024 [::]:9090 [::]:* users:(("headscale",pi
d=10899,fd=13))
tcp LISTEN 0 1024 [::]:50443 [::]:* users:(("headscale",pi
d=10899,fd=10))
tcp LISTEN 0 1024 [::]:8080 [::]:* users:(("headscale",pi
d=10899,fd=12))
创建用户
$ headscale users create default
查看用户:
$ headscale users list
常用命令
#启动服务
./headscale serve
#查看帮助
headscale -h
headscale [nodes|users] -h
#创建、删除、查看、重命名 用户
headscale users [create|destroy|list|rename]
#节点的概念,类似于机器。每台机器就是一个节点
headscale nodes [move|rename|list|delete]
Tailscale 客户端部署
LInux安装
使用脚本一键安装
启动 tailscaled.service 并设置开机自启:
$ systemctl enable --now tailscaled
查看服务状态:
$ systemctl status tailscaled
Tailscale 接入 Headscale:
# 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名
$ tailscale up --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false
这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。
此时控制台会显示 url ,把url在浏览器中打开,可以看到如下命令
headscale nodes register --user USERNAME --key nodekey:xxxxxxxxxxxxxxxxxxx
把 USERNAME 改成之前创建的 users 名字就行了
可以看到 Tailscale 会自动创建相关的路由表和 iptables 规则。路由表可通过以下命令查看:
$ ip route show table 52
常用命令
#客户端添加路由规则
tailscale set --advertise-routes=115.31.65.0/24,34.117.59.0/24
Windows部署
下载并安装客户端
在浏览器中打开 URL:http://<HEADSCALE_PUB_IP>:8080/windows
,并按其中说明操作。
headscale routes list -i 2
headscale routes enable -r 1
其他 Linux 发行版
除了常规的 Linux 发行版之外,还有一些特殊场景的 Linux 发行版,比如 OpenWrt、威联通(QNAP)、群晖等,这些发行版的安装方法已经有人写好了,这里就不详细描述了,我只给出相关的 GitHub 仓库,大家如果自己有需求,直接去看相关仓库的文档即可。
OpenWrt: https://github.com/adyanth/openwrt-tailscale-enabler
群晖: https://github.com/tailscale/tailscale-synology
威联通: https://github.com/ivokub/tailscale-qpkg
添加路由规则
假设你的家庭内网有一台 Linux 主机(比如 OpenWrt)安装了 Tailscale 客户端,我们希望其他 Tailscale 客户端可以直接通过家中的局域网 IP(例如 192.168.100.0/24) 访问家庭内网的任何一台设备。
配置方法很简单,首先需要设置 IPv4 与 IPv6 路由转发:
$ 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
客户端修改注册节点的命令,在原来命令的基础上加上参数 --advertise-routes=192.168.100.0/24
,告诉 Headscale 服务器“我这个节点可以转发这些地址的路由”。
tailscale set --advertise-routes=115.31.65.0/24,34.117.59.0/24
$ tailscale up --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.100.0/24 --reset
在 Headscale 端查看路由,可以看到相关路由是关闭的。
$ headscale nodes list
$ headscale routes list -i 6
开启路由:
$ headscale routes enable -r
也可以通过参数 -a 开启所有路由:
$ headscale routes enable -i 6 -a
其他节点查看路由结果:
$ ip route show table 52|grep "192.168.100.0/24"
192.168.100.0/24 dev tailscale0
其他节点启动时需要增加 --accept-routes=true
选项来声明 “我接受外部其他节点发布的路由”。
现在你在任何一个 Tailscale 客户端所在的节点都可以 ping 通家庭内网的机器了,你在公司或者星巴克也可以像在家里一样用同样的 IP 随意访问家中的任何一个设备,就问你香不香?
挖坑部署ZeroTier服务端
ZeroTier几个专用名词
·PLANET 行星服务器,Zerotier 根服务器
·MOON 卫星服务器,用户自建的私有根服务器,起到代理加速的作用
·LEAF 网络客户端,就是每台连接到网络节点。