Tailscale 自建服务端异地组网笔记 (bate)

Tailscale 自建服务端异地组网笔记 (bate)

vate_room 129 2023-02-09

软件介绍

本文章还未完善,fork 下面这篇文章,改动不大。改了原文章中废弃的命令。但是部分说明未更上,请慎用

Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (icloudnative.io)

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安装

Download · Tailscale

使用脚本一键安装

启动 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部署

下载并安装客户端

Download · Tailscale

在浏览器中打开 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 网络客户端,就是每台连接到网络节点。