Tailscale
Tailscale 构建在 WireGuard 之上,提供 OAuth2 (SSO)、OpenID 和 SAML 身份验证,以便节点构建网状网络。它是跨平台的,具有 ACL 设置和内部 DNS。
安装
也可以将 tailscale 作为 Docker 容器运行。这样,可以在单台机器上运行多个出口节点,每个节点都有自己的 tailnet。
第三方客户端
- KTailctl — 用于监视和管理 Tailscale 的 GUI。
- trayscale — Tailscale CLI 客户端的非官方 GUI 包装器。
- tailscaledesktop — 非官方 Tailscale 桌面应用程序。
- tailscale-systray-git — Tailscale 系统托盘菜单的 Linux 移植版。
用法
要使用 tailscale,请 启用/启动 tailscaled.service 并按如下方式运行服务器
# tailscale up
您可以通过指定 身份验证密钥 来为无头机器进行身份验证
# tailscale up --authkey=tskey-KEY
- 编辑
/etc/default/tailscaled以包含TS_NO_LOGS_NO_SUPPORT=true - 编辑
/etc/default/tailscaled并将--no-logs-no-support添加到FLAGS
高级用法
使用自定义控制服务器
可以使用像 headscale 这样的自定义控制服务器。
登录请输入
# tailscale up --login-server https://example.com
在无头系统上,可以使用令牌进行非交互式登录。
# tailscale up --login-server https://example.com --authkey your_auth_key
作为 Docker 容器运行
请按照 此指南了解如何将 tailscale 作为 docker 容器运行的大致思路。
作为出口节点
为了能够将作为 docker 容器运行的 tailscale 实例用作出口节点,我们需要为容器的网络使用较小的 MTU。这是由于存在 与 MTU 相关的问题。
如果您还没有,请创建一个自定义网络
# docker network create --opt com.docket.network.driver.mtu=1280 my_custom_network
然后,将该网络用于容器实例
# docker run --detach --name=my_tailscale_container --network=my_custom_network --volume /var/lib/tailscale-exitnode-1:/var/lib/tailscale --env TS_STATE_DIR=/var/lib/tailscale --env TS_USERSPACE=1 --env TS_AUTHKEY=tskey-auth-XXX --env TS_EXTRA_ARGS='--advertise-exit-node' tailscale/tailscale
请注意
- 默认情况下,docker 会创建一个
bridge类型的网络,因此无需在此处指定。 - 使用身份验证密钥来验证节点。使用常规 SSO 方法进行身份验证通常需要太长时间,并且在初始身份验证成功之前可能会超时。
- 定义
TS_USERSPACE=1,这样容器就不需要提升的权限(CAP_NET_ADMIN和CAP_NET_RAW)。 - 将主机上的一个未使用目录(
/var/lib/tailscale-exitnode-1)绑定挂载到容器内的/var/lib/tailscale,并定义TS_STATE_DIR=/var/lib/tailscale,以便 tailscale 使用持久状态文件。没有这些,出口节点将使用易失性内存来保存状态,因此每次容器重新启动时都会获得新的 ID 和 tailnet IP 地址 。
技巧与提示
与 NetworkManager 一起使用
如果您使用 NetworkManager,您可能会注意到您的 tailnet 中与其他设备连接出现问题。这是由于 NetworkManager 和 tailscaled 之间发生了管理冲突。
要解决此问题,我们需要 NetworkManager 来取消管理 tailscale 网络设备(例如 tailscale0)。
为此,只需创建一个类似 /etc/NetworkManager/conf.d/99-tailscale.conf 的配置文件,其中包含以下内容
[keyfile] unmanaged-devices=interface-name:tailscale0
然后 重新启动 NetworkManager.service 和 tailscaled.service。
您可能还需要重新启动 tailscale
# tailscale down # tailscale up
之后,您应该能够 ping 到 tailnet 中的其他设备。
Magic DNS
Tailscale 期望系统具有工作的 systemd-resolved 来设置 DNS 服务器和来自 tailnet 配置的搜索后缀,否则它会 尝试覆盖 /etc/resolv.conf。
故障排除
Tailscale 启动时崩溃
启动 tailscaled.service 后,它可能会崩溃并陷入重启循环。这可能是由于缺少 tun 内核模块。要验证这是否确实是这种情况,请通过 systemd 查看 tailscaled.service 的日志
# systemctl status tailscaled.service
或者,在您的终端中以 root 用户身份运行二进制文件
# /usr/sbin/tailscaled
在 systemctl status 中或通过运行二进制文件可能会出现以下或类似的错误
...is CONFIG_TUN enabled in your kernel? modprobe tun failed with: modprobe: FATAL: Module tun not found in directory /lib/modules/5.17.4-arch1-1 kernel/drivers/net/tun.ko found on disk, but not for current kernel; are you in middle of a system update and haven't rebooted? found: /lib/modules/5.17.8-arch1-1/kernel/drivers/net/tun.ko.zst wgengine.NewUserspaceEngine(tun "tailscale0") error: tstun.New("tailscale0"): no such device
如果是这样,只需重新启动系统,然后观察 tailscaled.service 是否处于活动状态,而不是通过 systemctl status 加载。