headscale的部署方法和使用教程

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
LinuxYes
OpenBSDYes
FreeBSDYes
macOSYes
WindowsYes 参考 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

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值