目录

headscale的部署方法和使用教程

用于解决内网穿透的各项缺点,有云服务器的可以来看看。

问题点

由于家里的宽带不支持公网IP,因此为了能访问家里的网络使用了frp内网穿透的功能,但是这会带来一个问题,使用内网穿透的话,需要对每一个接口进行一个绑定,随着外网访问的服务越来越多,势必要开启多个接口,这就管理端口会麻烦,而且每次添加都要启停服务。因此最佳的解决方法还是通过VPN的方式来组建一个大内网。

tailscale是什么

首先要介绍一下tailscale,它是基于WireGuard的虚拟组网工具,和Netmaker类似,最大的区别在于Tailscale是在用户态实现了WireGuard协议,而Netmaker直接使用了内核态的WireGuard。所以Tailscale 相比于内核态WireGuard 性能会有所损失,但与OpenVPN之流相比还是能甩好几十条街的,Tailscale虽然在性能上做了些许取舍,但在功能和易用性上绝对是完爆其他工具:

  1. 开箱即用
    • 无需配置防火墙
    • 没有额外的配置
  2. 高安全性/私密性
    • 自动密钥轮换
    • 点对点连接
    • 支持用户审查端到端的访问记录
  3. 在原有的ICE、STUN等UDP协议外,实现了DERP TCP协议来实现NAT穿透
  4. 基于公网的控制服务器下发ACL和配置,实现节点动态更新
  5. 通过第三方(如 Google)SSO服务生成用户和私钥,实现身份认证

简而言之,我们可以将Tailscale看成是更为易用、功能更完善的WireGuard。

但是Tailscale是一款商业产品,个人用户可以免费使用,但是有一些限制,例如:接入设备不能超多20台,子网网段无法自定义,且无法设置多个子网等等。

因此如果我们想拥有更高级的功能,除了付费外还可以更换控制服务器,就是我们接下来讲到的Headscale。

Headscale是什么

Headscale由欧洲航天局的Juan Font使用Go语言开发,在BSD许可下发布,实现了 Tailscale控制服务器的所有主要功能,可以部署在企业内部,没有任何设备数量的限制,且所有的网络流量都由自己控制。

目前 Headscale 还没有可视化界面。

Headscale部署

Headscale的部署推荐直接在云服务器上安装,而且必须要有公网IP的服务器

首先需要到GitHub仓库的Release页面下载最新的二进制文件。

1
2
3
4
# 不要直接复制链接,需要去release页面去获取最新链接
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

创建配置目录

1
mkdir -p /etc/headscale

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

1
mkdir -p /var/lib/headscale

创建空的SQLite数据库文件

1
touch /var/lib/headscale/db.sqlite

创建Headscale配置文件

1
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • 修改配置文件,将 server_url 改为公网 IP 或域名。如果是国内服务器,域名必须要备案
  • 如果暂时用不到 DNS 功能,可以先将 magic_dns 设为 false。
  • server_url 设置为 http://<PUBLIC_IP>,将 <PUBLIC_IP> 替换为公网 IP 或者域名。
  • listen_addr可以指定服务运行的端口,可以设定为0.0.0.0:8080,后续可以使用nginx做反代
  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:
1
2
3
ip_prefixes:
  # - fd7a:115c:a1e0::/48
  - 10.1.0.0/16

创建SystemD service配置文件

1
vim /etc/systemd/system/headscale.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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用户

1
useradd headscale -d /home/headscale -m

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

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

修改配置文件中的unix_socket

1
vim /etc/systemd/system/headscale.service
1
unix_socket: /var/run/headscale/headscale.sock

加载新的配置文件

1
systemctl daemon-reload

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

1
systemctl enable --now headscale

查看运行状态

1
systemctl status headscale

查看占用端口

1
2
3
4
ss -tulnp|grep headscale

tcp     LISTEN   0        128            127.0.0.1:9090           0.0.0.0:*      users:(("headscale",pid=3346308,fd=12))                                        
tcp     LISTEN   0        128                    *:8080                 *:*      users:(("headscale",pid=3346308,fd=10)) 

创建一个 namespace,以便后续客户端接入。

1
2
# NAME可以按照自己的想法来命名
headscale namespaces create <NAME>

Headscale常用命令

查看命名空间

1
2
3
4
headscale namespaces list

ID | Name     | Created            
1  | hikoutei | 2022-07-13 03:21:37

查看命名空间的租户

1
2
3
4
5
headscale nodes list

ID | Name            | NodeKey | Namespace | IP addresses                  | Ephemeral | Last seen           | Online | Expired
1  | fengdenleideMBP | [SCriJ] | hikoutei  | 100.64.0.1, fd7a:115c:a1e0::1 | false     | 2022-07-23 12:10:51 | online | no     
2  | hikoutei        | [1gdYT] | hikoutei  | 100.64.0.2, fd7a:115c:a1e0::2 | false     | 2022-07-23 12:10:30 | online | no 

删除命名空间的租户(按照上面的租户来删除)

1
2
# ID为租户的id,可以参照上面的租户详情
headscale node delete -i<ID>

删除指定命名空间

1
headscale namespaces destroy <NAME>

Tailscalek客户端接入

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

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

MacOS

macOS 有 3 种安装方法:

  • 直接通过应用商店安装,地址。前提是你需要一个美区 ID。
  • 下载 安装包直接安装,绕过应用商店。
  • 安装开源的命令行工具tailscaletailscaled相关链接

这三种安装包的核心数据包处理代码是相同的,唯一的区别在于在于打包方式以及与系统的交互方式。

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

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

⚠️注意:不要同时安装应用商店版本和独立分发版本,同时只能装一个。

而命令行工具既没有使用网络扩展也没有使用系统扩展,而是使用的utun 接口,相比于GUI版本缺少了部分功能,比如MagicDNS和Taildrop。

安装完GUI版应用后,只需要在浏览器中打开 URL:http://<HEADSCALE_PUB_IP>:8080/applehttps://<DOMAIN_NAME>:8080/apple,便会出现如下的界面,

https://oss.hikoutei.com/blog/KPrG2K.png

按照杜仲的操作要么下载macOS profile来操作,要么直接使用default wtire io.tailscale.ipn.macos ControlURL <DEFAULT>

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

然后立马就会跳转到浏览器并打开一个页面。

然后回到Headscale所在的机器执行浏览器中的命令,需要注意的是命令行中需要修改namespace,即可注册成功。

然后在macOS顶部状态栏中找到Tailscale并点击后,即可看到This device

回到 Headscale 所在主机,查看注册的节点:

1
headscale nodes list

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

1
2
# IP为所对应的节点的内网IP
ping <IP>

Windows

Windows Tailscale客户端想要使用Headscale作为控制服务器,只需在浏览器中打开 URL:http://<HEADSCALE_PUB_IP>/windows,便会出现类似Mac的界面,配置方式有两种,一种是点击Windows registry file,另外一种是将命令行输入

其他

对于Linux,Android,及其他版本的安装,或打通局域网等功能,可以参考原始文章

总结

本文将主要是针对原始文章做了一定的修改和美化,因为自己在搭建过程中碰到一些不动地方,因此做个记录,如果有详细需求的,可以参考原始文章