坑边闲话:WireGuard 作为下一代 VPN 技术,除了面对 ISP UDP QoS 时比较尴尬之外,性能、安全性都是非常有保障的。但是 WireGuard 的配置相对繁琐,需要用户掌握许多密码、网络的知识才能完成。此外,典型 WireGuard 的 Full-Mesh 的结构也让设备的增添、移除变得非常复杂。Tailscale 通过引入管理节点,让配置变得自动化,同时 Tailscale 也支持自定义管理平面。

1. Tailscale 简介·

Tailscale 是一个基于 WireGuard 的网络技术,用于创建安全、简单、私有的虚拟网络,它具有以下优点:

  • 基于 WireGuard: WireGuard 是一个新的、高性能的 VPN 协议,旨在提供安全、简单、快速的网络连接。Tailscale 使用 WireGuard 作为其底层协议,但对其进行了封装,以提供更加用户友好和企业友好的功能。
  • 简单性: 传统的 VPN 和私有网络解决方案通常需要复杂的配置和维护。Tailscale 的目标是简化这个过程,使任何人都可以在几分钟内设置自己的私有网络。
  • 跨平台: Tailscale 支持多种操作系统和平台,包括 Linux、Windows、macOS、iOS、Android 和其他设备。
  • 安全性: 利用 WireGuard 的强大加密功能,Tailscale 提供了高度的安全性,确保数据传输的隐私和完整性。
  • 访问控制: 用户可以轻松地控制哪些设备和应用可以访问其网络资源,提供了细致的权限管理。

Tailscale 是一个使个人和团队能够轻松创建、管理和使用私有网络的工具。其强大、灵活且用户友好的特性使它成为许多网络需求的理想选择。

使用心得

曾经我以为异地组网是个简单的工作,但是在使用 WireGuard 相当长一段时间之后,我发现 WireGuard 的配置太过繁琐。如果把 WireGuard 作为底层,再外套一层管理平面,应该会让整套服务更加人性化。Tailscale 就是这样的产品。

1.1 Tailscale 的收费策略·

使用 Tailscale 的软件是免费的,但是使用 Tailscale 的服务却有收费的选项。当然,Tailscale 的免费版本服务对个人或者小组来说也够用了。这里针对 Tailscale 付费版本的本地私有托管进行简单介绍。

2. 全平台部署·

2.1 Linux:以 Debian 12 为例·

在 Linux 上通过命令行安装 Tailscale 非常简单,只需执行以下一句命令即可完成:

1
curl -fsSL https://tailscale.com/install.sh | sh

偷懒的用户看到这里就够了。总的来说,该脚本给 Debian 系统的包管理器添加了 Tailscale 官方维护的上游库,其中包括添加 gpg 密钥和添加 DPKG 源两步,该脚本主要功能与以下几行命令类似。

1
2
3
4
5
6
curl -fsSL https://pkgs.tailscale.com/stable/debian/bookworm.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/debian/bookworm.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list

# 安装 Tailscale
sudo apt-get update
sudo apt-get install tailscale

安装完成,即可启动 Tailscale:

1
sudo tailscale up

2.2 Windows:以 Win10 为例·

Windows 部署 Tailscale 非常简单,因此安装过程简单略过。

Windows 上的一大特色就是好用的远程桌面,为此我展示自己常用的配置:

图 1. Windows 上的远程桌面,遵循狡兔三窟的原则,保留多种连接通道。

校园网可能因为外线失联而中断,路由器端口转发可能因为路由器宕机而失联,IPv4 可能因为流量用尽而失去控制。但是把所有的连接方式汇总在一起,总有一款适合你。

在 Windows 乃至 macOS 平台,Tailscale 的开机自动启动需要做一些额外工作。在 Windows 上,需要将 Tailscale 设置为 Unattended-Mode,即系统因为某些原因重启之后,自动登录 Tailscale,无需等待用户进入桌面再启动 Tailscale,这在 Windows Server 上非常有用。

图 2. 设置 Tailscale 加电开机无人值守自动启动。

2.3 路由器:以 OpenWrt 为例·

在 OpenWrt 上安装 Tailscale 也非常简单,只要你的内核支持,即可通过 OPKG 安装。因为 Tailscale 通过 Go 实现,因此可能需要一些 Go 的运行时环境。然而,OpenWrt 上游的 Tailscale 一般比较老,我们推荐类似 Debian 12 的安装方式:

1
curl -fsSL https://tailscale.com/install.sh | sh

在通过命令行启动了 Tailscale 之后,设备列表里会多出一个网卡,然后以该网卡为基础创建 Interface 即可。

注意

Tailscale 在 Linux 一般需要通过命令行进行配置,OpenWrt 对系统进行配置一般通过 Luci 提供的 WebGUI 进行。然而,Luci 对 Tailscale 的配置能力几乎为 0,因此不太建议在 OpenWrt 上使用 Tailscale. 毕竟,如果命令行是必要的,那为什么不直接用 WireGuard 呢?

Tailscale Admin 界面也不支持对 OpenWrt Tailscale 进行远程更新,用户必须使用 tailscale update ; service tailscaled restart 命令手动更新。

最佳实践:使用 WireGuard 创建大内网,保证多个局域网之间是三层打通的。然后使用 Tailscale 作为回退方案,只在 WireGuard 失效时发挥临时作用。

由于 Tailscale 的 MagicDNS 会影响到 OpenWrt 的 DNS 服务,因此建议关闭 OpenWrt Tailscale 上的 MagicDNS,具体实现方式是在启动 tailscale 时添加以下推荐的参数:

1
tailscale up --accept-routes --ssh --reset --accept-dns=false
  • --accept-routes,接受来自 Tailscale 的路由规则;
  • --ssh,允许使用 Tailscale 自带的 ssh 服务器接受连接;
  • --reset,清理此前可能存在的配置;
  • --accept-dns=false,拒绝 MagicDNS,防止对本地 DNS 产生负面影响,特别是在使用了 OpenClash 等软件时。

2.4 macOS·

macOS 作为一个非常易用且人性化的个人电脑操作系统,安装 Tailscale 有多种方式:

  • 通过 Mac App Store. 通常 Mac 应用商店的程序限制多、版本更新满,所以笔者很少使用它下载程序,这里也不做推荐;
  • Standalone 独立安装:除了不能启用 Tailscale SSH 和不能在运行在 unattended 模式之外,可谓是功能最全的;
  • 直接安装 tailscaled,以 utun 接口的形式提供服务,不推荐。

具体区别可通过在线表格查阅。

此外,在 macOS 上使用 Standalone 模式安装后,需要手动打开 tailscale 命令行支持。

图 3. 打开 Tailscale 设置界面。

图 4. 安装 tailscale 命令行工具,随后即可在 Terminal 里使用命令查看网络状态和配置运行模式。

3. Tailscale 高级教程·

3.1 子网·

子网功能一般在路由器上部署,当然,如果有一台内网设备,也可以利用其内网转发能力设置子网宣告,这一点要比 OpenWrt 稍微方便一些。

3.2 MagicDNS·

设备加入 Tailscale 网络之后,Tailscale 软件会在本地设置一个 VPN 虚拟网络接口,带宽显示 100Gbps,即无上限。通过该接口发送出去的流量,会被 Tailscale 软件截获,二次处理、打包后通过默认路由发送出去。

Tailscale VPN 网络中的所有设备都有这样的一个虚拟网络接口,他们的 IP 均是 100.x.x.x/32 的格式。只要设备的 Tailscale 可用,就可以通过这种 IP 地址联系到对应的其他设备。

图 5. Tailscale 虚拟网络接口的相关信息

然而,这种 IP 地址是不可自定义的,所以准确记忆这些地址非常麻烦。好在 Tailscale daemon 程序提供了一个名为 MagicDNS 的功能,我们可以直接使用 Tailscale 配发的域名解析到该 IP 地址。

  1. 运行 Tailscale daemon 之后,程序会在机器的 DNS 缓存里插入一些解析记录,格式为 <host_name>.xxx-xxx.ts.net,其中
    • <host_name> 是 Tailscale Admin 界面看到的设备名,一般是设备的主机名;
    • xxx-xxx 是 Tailscale 为该用户分配的唯一的二级域名。可以通过摇号的方式再次获取;
    • ts.net 是该 FQDN 的一级域名,属于 Tailscale 公司所有。
  2. 通过访问该地址,用户即可访问到对应设备。
  3. 关闭 Tailscale 服务,该解析记录缓存自动被移除,MagicDNS 将变得不再可用。

图 6. MagicDNS 运作原理,基于 100.100.100.100 本地 Tailscale DNS 服务器。以上游 8.8.8.8 作为回落地址。

图 7. MagicDNS 命名方式。

图 8.  MagicDNS 域名,即可访问 Tailscale IP 地址。

因此,推荐使用 MagicDNS 而非 IP 地址。此外,MagicDNS 搭配 HTTPS,能实现更方便、更合规的 VPN 网络。

3.3 Tailscale HTTPS·

一般我们认为内网中的服务是可信的,零信任网络的应用范围毕竟有限。因此,在内网里使用 HTTPS 貌似没有必要,仅在 NGINX ingress 流量上套一层 HTTPS 就够了。然而,在某些场景中,内网 HTTPS 还是很有必要的,单就避免浏览器警告就很值得使用。

  • 浏览器不安全警告
  • 某些服务仅提供 HTTPS 访问,如 ESXi 控制面板、vSphere 控制面板、Cocipit 控制面板等。

Tailscale 提供了 acme 功能,可以自动申请 Let’s Encrypt 证书。

为此,我们首先要在 Tailscale 配置页面打开 HTTPS 证书服务:

图 9. 确保该项是开启的。

图 10. Windows 版本需要在偏好选项里打开 Use Tailscale DNS settings,不过这一般是默认启用的。

随后,执行下列命令

1
tailscale cert t630-win10.cat-silverside.ts.net

即可在当前目录得到私钥和对应的证书:

1
2
t630-debian.cat-silverside.ts.net.crt
t630-debian.cat-silverside.ts.net.key

将这两个文件拷贝至合适的目录,重启对应服务即可使用。我们以 cockpit 为例:

1
2
sudo cp t630-debian.cat-silverside.ts.net.key t630-debian.cat-silverside.ts.net.crt /etc/cockpit/ws-certs.d/
sudo systemctl restart cockpit

现在,即可使用 MagicDNS 域名 https://t630-debian.cat-silverside.ts.net:9090/ 打开 HTTPS 服务页面。

3.4 Exit node·

Exit-Node 功能非常有用,它可以让我们方便地实现流量伪装、IP 隐藏,甚至是全局流量转发。如果在 WireGuard 上将 Allowded-IPs 设置为 0.0.0.0/0 也能实现相同效果,但是 WireGuard 修改配置文件比较麻烦。

Exit 一般指的是出口,比如楼道里、消防门上方都会表示 Exit,表示从这里可以走出这个现代建筑物。一般来说,符合消防标准的大楼一定会配置 Exit 标识。在 Tailnet (即 Tailscale 网络)中,一般认为 Exit Node 是这样的设备:

  • 它宣告自己可以帮你代理,你可以将自己所有的流量发给它,它会做一层 SNAT,随后即可以它的名义对外发起访问。原则上它就变成了你的逻辑网关
  • 在 Tailnet 中,如果有一台设备想隐藏自己的 IP,就可以将某个 Exit 节点选中,随后自己的公网流量均由该节点代理。

举例说了,我人在北京,山东老家的台式机宣告自己为 Exit Node,那么我在北京即可使用山东 IP 进行上网。抖音、微博等均认为我人在山东,我评论、发内容也会显示我在山东。这个功能非常有用。

注意:一台设备宣告自己为 Exit Node 之后,还需要 Tailnet 管理员在 login.tailscale.com 界面将其审核通过才行,否则 Exit 功能不起作用。

图 11. Windows 设置 Exit Node.

图 12. 在 Admin 界面启用该机器的 Exit Node 功能。

注意

在 Linux 机器上开启 Exit-Node 功能,需要指定启动命令,我们以 Debian 12 为例:

1
sudo tailscale up --accept-routes --ssh --advertise-exit-node

如果内核没有打开流量转发,则需要手动开启,否则无法将此机器配置为 Tailscale 路由器,具体命令如下:

1
2
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

若要持久化生效,则需要编辑 /etc/sysctl.conf 文件,该文件将控制开启哪些内核功能。在该文件中找到对应行,并取消注释即可,相关行如下:

1
2
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

4. Tailscale 的局限性·

时至 2024 年末,此前 Tailscale 存在的许多问题现在已经基本全面解决,尚未发现 Tailscale 有什么严重不便的地方。

然而,Tailscale 频繁的升级可能对网络的可用性有影响,而且有时候升级会带来许多破坏性问题,比如失去对 Tailnet 的控制、新加设备 OAuth 请求失效等。建议不要盲目追新,在没有安全隐患的情况下,尽可能延后 VPN 软件的更新升级是一个明智之选。

总结·

本文详细介绍了 Tailscale 的安装和高级用法,其中 Exit Node、Subnet 等方案在实际应用中极具价值。