1. headscale文件下载

# 下载地址 尽量选择新版本下载
https://github.com/juanfont/headscale/tags

在这里插入图片描述
linux机器下载上图选中文件
或者使用命令下载

 wget --output-document=/usr/local/bin/headscale \
   https://github.com/juanfont/headscale/releases/download/v<HEADSCALE VERSION>/headscale_<HEADSCALE VERSION>_linux_<ARCH>

< HEADSCALE VERSION> 为版本号
< ARCH> 为支持平台

2. 上传并赋予文件权限

上传 headscale_xxxx_linux_xxx 文件到服务器/usr/local/bin目录下并重命名为headscale
并赋予文件权限
服务器使用命令下载的无需上传

chmod +x /usr/local/bin/headscale

3. 创建以及修改相关配置文件

3.1 创建配置目录:

mkdir -p /etc/headscale

3.2 创建目录用来存储数据与证书:

mkdir -p /var/lib/headscale

3.3 创建空的 SQLite 数据库文件:

touch /var/lib/headscale/db.sqlite

3.4 创建 Headscale 配置文件:

# 下载官方的配置文件
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • 修改配置文件,将 server_url 改为公网 IP 或域名。如果是国内服务器,域名必须要备案。我的域名无法备案,所以我就直接用公网 IP 了。

  • server_url 设置为 http://<PUBLIC_IP>:8080,将 <PUBLIC_IP> 替换为公网 IP 或者域名。

  • 若是listen_addr为127.0.0.1:8080,需要改为listen_addr: 0.0.0.0:8080,监听本地,后期url访问将会无效。

  • 如果暂时用不到 DNS 功能,可以先将 magic_dns 设为 false。

  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:

ip_prefixes:
  # - fd7a:115c:a1e0::/48
  - 10.1.0.0/16

3.5 创建 SystemD service 配置文件:

本人使用官网的的.service无法访问,就不再创建headscale用户和用户组,直接进行启动,所以跳过3.6,3.7步,也将 User,Group,NoNewPrivileges,PrivateTmp,ProtectSystem,ProtectHome,AmbientCapabilities 等参数给注释掉了;这一点自己看需要调整,下图的几个参数都是可选的,不一定需要。

在这里插入图片描述

# /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

3.6 创建 headscale 用户

useradd headscale -d /home/headscale -m

3.7 修改 /var/lib/headscale 目录的 owner

chown -R headscale:headscale /var/lib/headscale

3.8 修改配置文件中的 unix_socket

进入配置文件

vim /etc/headscale/config.yaml
unix_socket: /var/run/headscale/headscale.sock

4 启动及运行

4.1 Reload SystemD 以加载新的配置文件:

systemctl daemon-reload

4.2 启动 Headscale 服务并设置开机自启:

systemctl enable --now headscale

4.3 查看运行状态:

systemctl status headscale

4.4 查看占用端口:

 ss -tulnp|grep headscale

Tailscale 中有一个概念叫 tailnet,你可以理解成租户,租户与租户之间是相互隔离的,具体看参考 Tailscale 的官方文档: What is a tailnet。Headscale 也有类似的实现叫 namespace,即命名空间。我们需要先创建一个 namespace,以便后续客户端接入,例如:

 headscale namespaces create default

4.5 查看命名空间:

headscale namespaces list
ID | Name | Created
1 | default | 2022-03-09 06:12:06

4.6 查看、删除节点:

#查看
headscale nodes list
#删除
headscale nodes delete -i <节点id>

5 客户端接入

目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器。

OS 是否支持 Headscale
Linux Yes
OpenBSD Yes
FreeBSD Yes
macOS Yes
Windows Yes 参考 Windows 客户端文档
Android 需要自己编译客户端
iOS 暂不支持

官方静态编译的二进制文件

5.1 linux 接入

5.1.1下载

wget https://pkgs.tailscale.com/stable/tailscale_1.22.2_amd64.tgz

版本号可以自行更换,版本号查看

在这里插入图片描述

5.1.2 解压

tar zxvf tailscale_1.22.2_amd64.tgz

解压后目录

tailscale_1.22.2_amd64/
tailscale_1.22.2_amd64/tailscale
tailscale_1.22.2_amd64/tailscaled
tailscale_1.22.2_amd64/systemd/
tailscale_1.22.2_amd64/systemd/tailscaled.defaults
tailscale_1.22.2_amd64/systemd/tailscaled.service

5.1.3 将二进制文件复制到官方软件包默认的路径下,并赋予可以执行文件权限

cp tailscale_1.22.2_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.22.2_amd64/tailscale /usr/bin/tailscale

赋予执行文件权限

chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

5.1.4 将 systemD service 配置文件复制到系统路径下

cp tailscale_1.22.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

5.1.5 将环境变量配置文件复制到系统路径下

cp tailscale_1.22.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled

5.1.6 刷新服务启动并设置开机自启

systemctl daemon-reload

systemctl enable --now tailscaled

systemctl status tailscaled

5.1.7 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 有需求,可自己研究官方文档,这里不再赘述。

执行完上面的命令后,会出现下面的信息:

To authenticate, visit:

http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704

1150d846

在浏览器中打开该链接,就会出现如下的界面:
在这里插入图片描述
将其中的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace。

headscale -n NAMESPACE nodes register --key 905cf165204800247fbd33989dbc22be95c987286c45aac3033937041150d846
Machine register

注册成功,查看注册的节点:

headscale nodes list

ID | Name | NodeKey | Namespace | IP addresses | Ephemeral | Last seen | Onlin

e | Expired

1 | coredns | [Ew3RB] | default | 10.1.0.1 | false | 2022-03-20 09:08:58 | onlin

e | no

回到 Tailscale 客户端所在的 Linux 主机,可以看到 Tailscale 会自动创建相关的路由表和 iptables 规则。路由表可通过以下命令查看:

ip route show table 52

查看 iptables 规则:

 iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N ts-forward
-N ts-input
-A INPUT -j ts-input
-A FORWARD -j ts-forward
-A ts-forward -i tailscale0 -j MARK --set-xmark 0x40000/0xffffffff
-A ts-forward -m mark --mark 0x40000 -j ACCEPT
-A ts-forward -s 100.64.0.0/10 -o tailscale0 -j DROP
-A ts-forward -o tailscale0 -j ACCEPT
-A ts-input -s 10.1.0.5/32 -i lo -j ACCEPT
-A ts-input -s 100.115.92.0/23 ! -i tailscale0 -j RETURN
-A ts-input -s 100.64.0.0/10 ! -i tailscale0 -j DROP

$ iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A ts-postrouting -m mark --mark 0x40000 -j MASQUERADE

5.2 macos 接入

macOS 有 3 种安装方法:

直接通过应用商店安装,地址: https://apps.apple.com/ca/app/tailscale/id1475387142。前提是你需要一个美区 ID。
下载 安装包直接安装,绕过应用商店。
安装开源的命令行工具 tailscale 和 tailscaled。相关链接: https://github.com/tailscale/tailscale/wiki/Tailscaled-on-macOS。
这三种安装包的核心数据包处理代码是相同的,唯一的区别在于在于打包方式以及与系统的交互方式。

应用商店里的应用运行在一个 应用沙箱中,与系统的其他部分隔离。在沙箱内,应用可以是一个 网络扩展,以实现 VPN 或者类 VPN 的功能。网络扩展实现的功能对应用商店之外的应用是无法生效的。

从 macOS 从 10.15 开始新增了 系统扩展,说白了就是运行在用户态的内核扩展,它相比于传统的网络扩展增强了很多功能,比如内容过滤、透明代理、DNS 代理等。Tailscale 独立于应用商店的安装包使用的就是系统扩展,通过 DMG 或者 zip 压缩包进行分发。
相关对比参考

5.2.1 下载

下载地址
解压出来后,将xxxxx.app拖入应用程序里

5.2.2 下载并修改配置文件

Headscale 已经给我们提供了详细的操作步骤,你只需要在浏览器中打开 URL:http://<HEADSCALE_PUB_IP>:8080/apple,便会出现如下的界面:
在这里插入图片描述
如下图
在这里插入图片描述
使用文本编辑器打开并修改下载的配置文件:

非应用商店版本的 macOS 客户端需要将 io.tailscale.ipn.macos 替换为 io.tailscale.ipn.macsys

安装配置文件
打开设置,搜索配置文件,进行安装headscale配置文件,安装结束后。
搜索隐私和安全性,允许tailscale运行。

5.2.3 退出重启tailscale,并login

改完成后重启 Tailscale 客户端,在 macOS 顶部状态栏中找到 Tailscale 并点击,然后再点击 Log in。

在这里插入图片描述然后立马就会跳转到浏览器并打开一个页面。
若没有跳出以下界面,可能是在设置中的隐私和安全性,没有允许tailscale运行。去设置先允许,在退出重新login。

在这里插入图片描述
接下来与之前 Linux 客户端相同,回到 Headscale 所在的机器执行浏览器中的命令即可,注册成功:
在这里插入图片描述
回到 Headscale 服务器主机,查看注册的节点:

headscale nodes list

ID | Name | NodeKey | Namespace | IP addresses | Ephemeral | Last seen | Onlin

e | Expired

1 | coredns | [Ew3RB] | default | 10.1.0.1 | false | 2022-03-20 09:08:58 | onlin

e | no
2 | carsondemacbook-pro | [k7bzX] | default   | 10.1.0.2     | false     | 2022-03-20 09:48:30 | online  | no

回到 macOS,测试是否能 ping 通对端节点:

ping -c 2 10.1.0.1
PING 10.1.0.1 (10.1.0.1): 56 data bytes
64 bytes from 10.1.0.1: icmp_seq=0 ttl=64 time=37.025 ms
64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=38.181 ms

--- 10.1.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.025/37.603/38.181/0.578 ms

也可以使用 Tailscale CLI 来测试:

/Applications/Tailscale.app/Contents/MacOS/Tailscale ping 10.1.0.1
pong from coredns (10.1.0.1) via xxxx:41641 in 36ms

其他相关的接入方式可以参考点击跳转

若有机会,后期我会继续完善

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐