它解决什么问题

典型的场景:你有几台云上的 VPS、家里的 NAS 和一块树莓派,想让它们互相访问——比如从 VPS 直接 SSH 到家里的机器。Tailscale 的做法是:每台机器装一个客户端,登录同一账号,加入同一个网络(官方称为 tailnet),每台机器获得一个 Tailscale 的 IPv4/IPv6 地址。之后机器之间可以互相访问,不需要为此在公网开放端口。

两点要说明:能否访问到某台机器上的具体服务,仍取决于管理控制台里的访问策略、机器本身的防火墙,以及服务是否在监听;本篇只讲 Linux 客户端的安装与常用配置。

安装

官方一键脚本适用于 Ubuntu/Debian 系、RHEL/CentOS/Fedora 系、Raspberry Pi OS、Amazon Linux、openSUSE/SLE、Oracle Linux 等:

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

不想用 curl | sh,可按 pkgs.tailscale.com/stable 页面手动配置仓库。以 Ubuntu 26.04(Resolute)为例,以下命令都需要 sudo:

sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/resolute.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/resolute.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update && sudo apt-get install tailscale

Debian 13(trixie)做法相同,把 URL 里的 ubuntu/resolute 换成 debian/trixie。Fedora 用 dnf:

sudo dnf config-manager --add-repo https://pkgs.tailscale.com/stable/fedora/tailscale.repo
sudo dnf install tailscale
sudo systemctl enable --now tailscaled

一个细节:官方 stable 页面的 Ubuntu 与 Debian 小节没有写 systemctl enable --now tailscaled,只有 Fedora 小节明确要求。其它发行版安装后服务是否已启用,以这条命令的输出为准:

systemctl status tailscaled

未运行就手动启用:

sudo systemctl enable --now tailscaled

Arch Linux 和 NixOS 在官方文档里有各自的指南;其它未列出的发行版可用静态二进制,见 stable 页面。

登录与确认

sudo tailscale up

命令输出会给出一个认证网址,在浏览器完成认证;没有浏览器的服务器,把网址复制到本地机器的浏览器打开。完成后到管理控制台的 Machines 页面确认设备出现。本地确认状态用:

tailscale ip
tailscale status

分别显示本机 Tailscale 的 IPv4/IPv6 地址和连接状态。设备密钥过期后强制重新认证:

sudo tailscale up --force-reauth

无人值守机器:认证密钥

云服务器、树莓派这类没有浏览器、也不想人工介入登录的机器,用认证密钥注册:

sudo tailscale up --auth-key=tskey-abcdef1432341818

密钥区分大小写。把真实密钥写在命令行里,它可能留在 shell 历史、脚本或终端记录中,不要写进可共享的脚本或笔记。用密钥登录的设备以生成密钥的用户身份认证;密钥带标签时,设备获得标签的身份。

密钥类型:一次性(用一次后自动吊销)、可重复使用、临时(设备离线后自动移除)、预批准、带标签,以及用于启用 Tailnet Lock 网络的预签名密钥(需要 tailscale lock sign)。有效期可选 1 到 90 天,不指定时为 90 天。

两层有效期要分清:已过期的密钥不能再登录新设备;已被它授权的设备在各自节点密钥过期前保持授权,节点密钥默认 180 天。带标签的设备默认关闭密钥过期。

安全取舍:可重复使用的密钥一旦被盗,任何拿到它的人都能把设备注册进你的网络,应放进专门的密钥保管库。吊销密钥不会让已经用过它的节点失效,要清理必须到 Machines 页面逐个删除。生成与吊销权限仅限 Owner、Admin、IT admin、Network admin,且只能吊销自己的密钥。

Tailscale SSH

在需要被连接的服务器上执行(需要 root):

sudo tailscale set --ssh

需要 Tailscale v1.24 或更高,每台主机只需一次,会生成 SSH 主机密钥对。两个警告:执行后,到该主机 Tailscale IP 的现有 SSH 连接会卡住;如果你正通过这样的会话管理这台机器,先改用云厂商控制台或其它管理通道登录,再执行启用命令。

它用 Tailscale 身份做认证,不需要在客户端生成密钥再把公钥放到服务器;只拦截经过 tailnet 到达 22 端口的流量,/etc/ssh/sshd_config 与 ~/.ssh/authorized_keys 不被改动,不经 Tailscale 的普通 SSH 连接照常可用。代价是:客户端机器上的任何系统用户都能通过 Tailscale 发起连接,本地不需要密钥对,访问控制完全由服务端策略决定。

访问需要两条规则:一条允许来源访问目标 22 端口的网络规则,以及一条 ssh 规则。官方示例:

{
  "action": "accept",
  "dst": ["autogroup:self"],
  "src": ["autogroup:member"],
  "users": ["autogroup:nonroot"]
}

这条规则允许成员以非 root 用户 SSH 到自己的设备。细节:只能用主机上已存在的账号,Tailscale 不会创建账号;只支持 22 端口且不可更改;src 和 dst 不允许单独写 *;check 规则先于 accept 规则评估;未修改的默认策略允许用户以 check 模式 SSH 到自己的设备。

如果把 dst 从 autogroup:self 放宽(例如改成某个标签),要重新考虑 users 里的 autogroup:nonroot——保持原样的话,src 允许的所有人都能以目标机上任何非 root 用户登录。这是启用 Tailscale SSH 时最需要想清楚的一处。

check 模式要求连接前重新认证(可能触发 MFA),checkPeriod 默认 12 小时,可设 1 分钟到 168 小时,或 "always"。它只对 Tailscale SSH 生效,不能用于来源是带标签设备的规则。设为 "always" 会打断 Ansible 这类快速开大量连接的自动化工具。

限制:服务端只支持 Linux 和开源版 macOS tailscaled,不支持 Synology、QNAP;重启 tailscaled(例如升级时)会结束正在进行的会话;策略变更几秒内生效并结束该用户已有会话,其它访问方式(如 SSH 密钥)要另外移除。官方认为它不太适合多用户权限各异的机器、以及用 authorized_keys 限制远程命令的机器。需要轮换时:

sudo tailscale up --ssh --force-reauth

这会生成新的节点密钥和 SSH 主机密钥。

子网路由

子网路由让 tailnet 里的机器访问网段里没有装 Tailscale 的设备——比如只在网关(树莓派或 NAS)上装客户端,就能访问整个内网。四步。

第一步,开启 IP 转发(存在 /etc/sysctl.d 时):

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

没有 /etc/sysctl.d 时,把两行配置追加到 /etc/sysctl.conf 再执行 sudo sysctl -p。开启转发后,保持防火墙默认拒绝转发(ufw、firewalld 默认如此)。若 firewalld 在运行,可能因已知问题需要:

sudo firewall-cmd --permanent --add-masquerade

第二步,在充当子网路由器的机器上声明路由:

sudo tailscale set --advertise-routes=192.0.2.0/24,198.51.100.0/24

换成自己的网段,支持 IPv4 和 IPv6;默认路由 0.0.0.0/0 和 ::/0 属于出口节点的用途,不用子网路由声明。

第三步,到管理控制台 Machines 页面批准:找带 Subnets 标记的设备,在 Subnets 部分点 Edit,勾选并 Save(autoApprovers 已覆盖则可跳过)。路由批准与访问规则是分开的,策略也必须允许流量到这些子网,否则流量仍被拒绝。

第四步,Linux 客户端默认只发现 Tailscale 地址,每台要访问子网的 Linux 机器执行:

sudo tailscale set --accept-routes

其它平台自动接收新路由。

高可用的坑:多台冗余子网路由器声明同样的路由时,不要在它们上启用 --accept-routes,否则备用路由器可能从主路由器接收路由、把流量绕过去;大多数高可用场景只用 --advertise-routes。

排错与注意事项

  • 连接不通,先在两端各跑 tailscale status,确认设备在线、地址正确。
  • 设备掉出网络,考虑节点密钥是否过期(默认 180 天),用 sudo tailscale up --force-reauth 重新认证。
  • 子网路由不通,按顺序查:IP 转发是否生效(sysctl net.ipv4.ip_forward)、控制台是否批准了路由、Linux 客户端是否执行过 --accept-routes、策略是否允许到目标子网的流量。
  • Tailscale SSH 连不上,检查两条规则是否都存在、目标账号是否真的存在于服务器上。
  • 官方说明:关闭日志(设置 TS_NO_LOGS_NO_SUPPORT=true 或使用 --no-logs-no-support)可能导致无法获得技术支持。除此之外官方文档未给出更多细节。

以上命令与配置均来自 tailscale.com/kb 官方文档与 pkgs.tailscale.com/stable 安装页面,参考的 kb/1031 页面标注验证日期为 2026 年 1 月 5 日;如果你的安装输出或控制台界面与本文不一致,以官方文档当前版本为准。