Linux / Nas · 2022年9月2日 1

开源版tailscale,headscale搭建

Headscale 是什么 上一期视频讲了tailscale,Tailscale 是一个收费的vpn服务,免费用户有诸多限制,为了破除这些限制,有开源项目重新把tailscale实现了一遍,项目名称叫headscale

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

目前 Headscale 还没有可视化界面,所有的操作都需要在命令行中完成,但是命令并不多,操作也不复杂。

因为是自建服务,那能自定义的配置就多了,任意定义网段,任意定义命名空间

udp直连会被运营商限速,所以会出现速度骤降,但是ping非常稳定,传速速度页非常稳定。

Headscale 部署

Headscale 部署在 Linux 主机上,随便找台有独立ip的vps就可以了,但是要注意,如果需要穿透的内网无法打洞成功那么流量就会由服务器中转,这意味着穿透后的速度会直接的受限于节点跟服务器之间的网络情况,所以尽量选择离你近的服务器,即使打洞失败了,至少网络还是稳定的,通畅的。

项目主页:https://github.com/juanfont/headscale/

# 下载服务端
wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v0.17.0-alpha4/headscale_0.17.0-alpha4_linux_amd64
# 设置执行权限
chmod +x /usr/local/bin/headscale

准备

#创建配置目录:
mkdir -p /etc/headscale

#创建目录用来存储数据与证书:
mkdir -p /var/lib/headscale

#创建空的 SQLite 数据库文件:
touch /var/lib/headscale/db.sqlite

# 从example 创建 Headscale 配置文件:
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • server_url 设置为 http://<PUBLIC_IP>:8080,将 <PUBLIC_IP> 替换为公网 IP 或者域名。
  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:
  • ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/16
  • 随机端口要打开,否则同一个内网中多个终端会有问题
  • randomize_client_port: true

创建 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

# 创建一个 namespace,以便后续客户端接入,例如:
headscale namespaces create default

# 查看命名空间:

headscale namespaces list

客户端安装

目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器,headscale仅仅是实现了tailscale服务端的功能。

OSSupports headscale
LinuxYes
OpenBSDYes
FreeBSDYes
macOSYes (see /apple on your headscale for more information)
WindowsYes docs
AndroidYes docs
iOSNot yet

Windows客户端

打开http://ip:8080/windows

下载一个注册表修改工具,执行一下

安装tailscale客户端

启动,登陆的时候就会去我们自己的服务器认证了

认证成功获取到ip,客户端就加入网络了

而且windows端做路由也是可以的,如果需要,加上参数–advertise-routes=192.168.188.0/24

打开cmd,执行

tailscale up  --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

再去服务器端查看route,激活路由

headscale routes list -i 1
headscale routes enable -i 1 -r "192.168.188.0/24"

linux客户端

直接下载。查看最新版本:https://pkgs.tailscale.com/stable/

wget https://pkgs.tailscale.com/stable/tailscale_1.28.0_amd64.tgz
tar zxvf tailscale_1.28.0_amd64.tgz x tailscale_1.28.0_amd64/

将二进制文件复制到官方软件包默认的路径下:

cp tailscale_1.28.0_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.28.0_amd64/tailscale /usr/bin/tailscale
chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

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

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

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

cp tailscale_1.28.0_amd64/systemd/tailscaled.defaults /etc/default/tailscaled
# 启动 tailscaled.service 并设置开机自启:
systemctl enable --now tailscaled
# 查看服务状态:
systemctl status tailscaled

Tailscale 接入:

tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false
# 如果申请为虚拟网关,需要指定
tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24
# 打开转发
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

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

To authenticate, visit:

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

在浏览器中打开该链接,就会出现如下的界面:

https://jsdelivr.icloudnative.io/gh/yangchuansheng/imghosting3@main/uPic/2022-03-20-17-06-08qWbz.png

将其中的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace。

headscale -n default nodes register --key d1614a1407b7554cd368db21f383197802d9c95249130d7b3db256458d9a4043
# 注册成功,查看注册的节点:
headscale nodes list
# 许可路由的话,通过上个命令就可以看到linux节点的id,就是1,2,3,……
# 查看改节点的路由,假如id是1
headscale routes list -i 1
# 许可网关
headscale routes enable -i 1 -r "192.168.188.0/24"
# 再次查看虚拟网关状态,id是1
headscale routes list -i 1
# enabled就是已经启用了

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

ip route show table 52

群晖客户端

项目地址:https://github.com/tailscale/tailscale-synology

下载安装包手动上传到webui,安装启用

登录到ssh命令行

tailscale up --login-server=http://ip:8080 --accept-dns=false

剩下的步骤跟linux一致

如果需要群晖做虚拟网关的话,添加参数–advertise-routes=192.168.199.0/24

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

openwrt客户端

项目地址:https://github.com/adyanth/openwrt-tailscale-enabler

按照项目的安装说明安装即可

安装完成,启动服务后,执行跟linux和群晖相同的命令

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

安卓客户端

稍微麻烦些,需要自己去github上生成release,这里就不写了,直接提供包出来

重点就是指定服务器的地址,如果不指定的话认证服务器是指向tailscale的

要想自己指定服务器需要从项目代码中自己生成一个

可以在github上操作,总体来说费劲一点,这不是本期视频的重点,我就直接把我生成的客户端放到蓝凑云了

https://wws.lanzouw.com/iRZcQ0als9sh 密码:dwsn

安装完成后别直接登录,

登陆页面,右上角有一个use login server,

打开,填上自己的服务器的ip和端口登录,同样会跳转到一个页面

复制给出的命令,修改namespace为default

去服务端命令行执行一下,认证成功

安卓端就搞定了

总体而言,除了安卓端麻烦些,openwrt端耗费的时间长一些,难度不高