Tailscale 是什么?从 SSH、公网端口到虚拟私人网络讲清楚
从跨网络访问 Linux 的需求出发,串起 Tailscale、Tailnet、WireGuard、SSH、端口与 UFW,理解为什么可以保留 SSH 服务,同时关闭公网 SSH 入口。
在配置 Linux 服务器远程访问时,经常能看到这样一句建议:
关闭公网 SSH 端口,通过 Tailscale 访问服务器。
它的意思是:保留服务器上的 SSH 服务,让已获授权的设备通过 Tailscale 私人网络登录,同时阻止公网直接访问 SSH 入口。
这里涉及几件不同的事:IP 地址和端口帮助连接到服务,SSH 提供远程登录,防火墙决定连接是否允许通过,Tailscale 则把不同地点的设备连接到一个私人网络。本文从最常见的局域网访问说起,把这些概念串起来。
假设实验室的电脑和 Ubuntu 主机连接在同一个局域网中,Ubuntu 的地址是 192.168.1.20。在网络允许互访、SSH 服务已经运行的情况下,可以这样登录:
ssh yzn@192.168.1.20这条命令包含三部分:
| 内容 | 含义 |
|---|---|
ssh |
使用 SSH 客户端建立安全的远程登录连接 |
yzn |
目标系统上的登录用户名 |
192.168.1.20 |
目标主机的 IP 地址 |
没有另外指定端口时,OpenSSH 客户端通常连接 TCP 22 端口。假如服务端改用了 2222 端口,客户端也要对应指定:
ssh -p 2222 yzn@192.168.1.20可以把 IP 地址理解成楼的地址,把端口理解成楼内的房间号。更准确地说,网络连接需要结合地址、传输协议和端口来区分;例如 TCP 22 和 UDP 22 属于不同的端口空间。端口号也是约定,运行在 22 端口上的服务并不天然就一定是 SSH。
SSH 提供加密通信、服务器身份验证和用户认证等能力,具体选项见 OpenSSH 客户端手册。
如果 MacBook 回到家里,而 Ubuntu 仍在实验室,两台机器就处在不同网络中。
192.168.1.20 属于私有 IPv4 地址。许多家庭和实验室都可能重复使用这个地址,公共互联网不会根据它直接找到某个实验室里的电脑。如果家里的网络恰好也用了同一网段,访问这个地址甚至可能连到家中的另一台设备。私有地址范围的定义见 RFC 1918。
一种传统做法是:实验室拥有可用的公网 IPv4 地址,再让路由器把某个公网端口转发到 Ubuntu 的 SSH 端口。
例如下面这组映射:
| 访问入口 | 转发目标 |
|---|---|
| 路由器的公网地址,TCP 2222 | 192.168.1.20,TCP 22 |
客户端相应使用:
ssh -p 2222 yzn@你的公网地址这需要同时处理公网地址、路由器端口转发和防火墙规则。如果网络处在运营商级 NAT 后面,自己控制的路由器未必拥有能够接受入站连接的公网 IPv4 地址。云服务器还可能需要配置云平台的安全组。
使用公网 IPv6 是另一种情况,通常不需要 IPv4 式的端口映射,但仍然需要合适的路由和防火墙规则。无论采用哪种公网入口,都要管理服务对外暴露的范围。
Tailscale 提供了另一条路径:让自己的设备加入一个跨越这些物理网络的私人网络。
Tailscale 是建立和管理安全私人网络的软件与服务;Tailnet 是使用 Tailscale 连接起来的那个网络。
比如,我可以把下面这些设备加入自己的 Tailnet:
| 设备 | 所在位置 | 示例 Tailscale IPv4 地址 |
|---|---|---|
| MacBook Pro | 家里 | 100.101.102.101 |
| R2-kubuntu | 实验室 | 100.101.102.102 |
| RDK X5 | 机器人所在网络 | 100.101.102.103 |
| Windows PC | 另一处网络 | 100.101.102.104 |
表中的地址仅用于说明,实际地址由 Tailscale 分配。
设备仍然使用原来的 Wi-Fi、网线或移动网络上网,同时获得一套用于 Tailnet 通信的地址。只要设备在线、底层网络可用并且访问策略允许,就可以通过这套地址访问对方。
“像在同一个局域网里”是对使用体验的比喻:可以直接连接对方的私人地址。它不意味着不同地点真的变成了同一个物理局域网,也不意味着自动发现机制、广播或组播行为都与本地网络相同。
Tailnet 也不一定只属于一个人,它可以包含多个用户、设备及共享资源。参见 Tailscale 概念介绍和术语说明。
Tailscale 默认从 100.64.0.0/10 中分配 IPv4 地址,对应范围是:
100.64.0.0 ~ 100.127.255.255这是一段用于共享地址空间的特殊用途地址,并不是全部 100.* 地址都属于 Tailscale。它与常见的 192.168.* 私有地址范围也不是同一个概念。Tailscale 同时支持 IPv6 地址。
同一台已注册设备从实验室 Wi-Fi 换到手机热点时,Tailscale 地址通常保持不变,因此不需要每次都根据底层网络重新寻找机器。不过,删除设备后重新注册等操作可能改变地址。
这些地址的范围与稳定性说明见 Tailscale IP 地址文档。
WireGuard 负责加密隧道,Tailscale 负责把设备发现、身份、权限和连接管理等工作组织起来。
WireGuard 是现代 VPN 隧道协议及其实现。它能够在节点之间安全地传输 IP 数据包。
单独配置一个 WireGuard 网络时,通常需要自己处理节点配置、公钥交换、对端地址和路由等事项。Tailscale 在此基础上,把大量工作自动化:
| 要解决的问题 | Tailscale 提供的能力 |
|---|---|
| 哪些用户和设备可以加入? | 登录与设备身份管理 |
| 对方现在位于哪个网络? | 设备发现与连接信息协调 |
| 哪些设备可以访问哪些服务? | 访问策略 |
| 两端位于 NAT 后面怎么办? | NAT 穿透与中继 |
| 如何维护设备间的加密连接? | 密钥分发、轮换与连接管理 |
可以进一步区分两个层面:
- 控制平面:协调设备身份、公钥、连接信息和策略。
- 数据平面:传输实际的 SSH、Web 或其他应用数据。
这里交换的是建立连接所需的信息,并不是把设备私钥交给所有节点。Tailscale 对控制平面与数据传输的设计有一篇详细说明:How Tailscale works。
需要区分“联系协调服务”和“应用数据经过中继”。
Tailscale 会尽可能建立设备之间的直接连接,也就是 P2P。直接连接不可用时,还可以通过中继传输数据。
这张图表示可选的数据路径,并不表示同一份应用数据一定同时走两条路径。
| 连接方式 | 数据路径 |
|---|---|
| Direct | 两台设备直接建立加密连接 |
| Peer Relay | 通过 Tailnet 中配置为中继的另一台设备转发 |
| DERP Relay | 通过 DERP 中继服务器转发 |
实际建立连接时可能先使用 DERP,再切换到直接连接或 Peer Relay。“优先直连”不等于每次都必须等待直连失败后才允许中继。
经过中继时,设备间的数据仍保持端到端加密,中继无需解密 SSH 会话等应用内容。直连通常能减少绕路,但实际速度仍取决于两端带宽、延迟和网络条件。参见官方连接类型说明与 DERP 文档。
是。VPN 的全称是 Virtual Private Network,即虚拟私人网络。
日常谈到商业 VPN 时,很多人想到的是:电脑先连接一个出口,再由那个出口访问互联网。Tailscale 常见的用途则是连接自己的电脑、服务器、NAS 和开发板,让设备之间能够安全互访。
加入 Tailnet 后,普通上网流量默认不会全部改走另一台设备。如果希望某台机器代理客户端的互联网出口,可以配置 Exit Node(出口节点),并在客户端选择使用它。
因此,“连上 Tailscale”和“所有上网流量经过远端出口”是两个不同的配置状态。参见 Exit Node 官方说明。
假设 R2-kubuntu 的 Tailscale 地址是 100.101.102.102,它的普通 SSH 服务已经运行,并且监听地址与访问策略允许连接,就可以执行:
ssh yzn@100.101.102.102其中:
- Tailscale 负责提供通往目标设备的私人网络连接。
- SSH 负责建立远程登录会话。
yzn是目标 Linux 系统中的用户,通常不是 Tailscale 登录邮箱。
同一条网络连接也能承载 SFTP、Web、RDP、VNC 等服务。相应服务仍需要自己运行、监听合适的地址,并满足各自的认证要求。
这是两种需要分开理解的使用方式:
| 项目 | 通过 Tailscale 使用普通 SSH | 启用 Tailscale SSH |
|---|---|---|
| 服务端由谁提供? | 通常是系统的 OpenSSH 服务 | Tailscale 内置的 SSH 服务 |
| 谁决定用户如何登录? | OpenSSH 配置、系统账号和密钥等 | Tailscale SSH 策略与身份 |
| 端口 | 由普通 SSH 服务端配置 | 接管发往设备 Tailscale 地址的 22 端口连接 |
| 是否需要专门开启 Tailscale SSH? | 不需要 | 需要 |
| 是否仍需 Tailnet 网络访问许可? | 需要 | 需要,还需符合 SSH 策略 |
启用 Tailscale SSH 后,针对 Tailscale 地址的 SSH 连接会交给它处理;这不会自动修改原有的 sshd_config 或 authorized_keys,也不会自动关闭公网上的 OpenSSH 入口。
如果目标只是“通过 Tailscale 地址使用原来的 SSH 密钥登录”,使用第一种方式即可。详细行为见 Tailscale SSH 文档。
防火墙根据规则处理网络流量,例如允许某个来源访问 TCP 443,或拒绝公网连接 TCP 22。
**UFW(Uncomplicated Firewall)是简化 Linux 防火墙配置的工具。**在 Ubuntu 和 Kubuntu 上,可以通过它管理主机的防火墙规则。系统底层负责执行规则,UFW 提供更容易操作的命令接口。
例如查看当前规则:
sudo ufw status verbose下面这条命令表示添加允许 TCP 22 的规则:
sudo ufw allow 22/tcp这里没有限制来源或网卡,因此它并不表示“只允许 Tailscale 访问 SSH”。这只是说明命令含义,不是一份关闭公网 SSH 的完整配置。
另外,主机 UFW、云平台安全组、路由器防火墙和端口转发位于不同位置。能否从公网连接到服务器,要结合整条路径判断。UFW 的基本用法见 Ubuntu 防火墙文档。
在常见的 Linux 默认配置下,Tailscale 会维护自己的 netfilter 规则,其中包括接受来自 tailscale0 虚拟网卡的流量。这些规则可能在 UFW 的规则之前生效。
因此,不能只看到 ufw deny 22,就断言 Tailnet 中的 SSH 连接一定被阻断。
管理时需要分别考虑:
- 公网、局域网等入口允许哪些连接;
- Tailnet 内哪些身份可以访问哪些设备和端口;
- SSH 服务本身允许哪些系统用户登录。
Tailnet 内的访问范围应结合 Tailscale 访问策略管理;需要与主机防火墙做更细的组合时,再检查规则顺序及 netfilter 模式。参见 Tailscale netfilter 模式文档。
普通公网 SSH 连接,会尝试直接访问服务器或路由器对外提供的 TCP 端口。
使用 Tailscale 后,SSH 数据先通过 Tailscale 的加密连接到达目标设备,再交给目标 SSH 服务。公网看到的传输入口与隧道内部的 SSH 端口属于不同层次:阻止公网直接访问 TCP 22,并不等于阻止加密隧道内部访问 TCP 22。
目标可以设计成这样:
Tailscale 需要底层网络允许必要的协调、穿透或中继通信。通常不必手动把路由器的公网 SSH 端口映射到服务器;特定的 UDP 放行规则可能改善直连效果。具体要求见官方防火墙端口说明。
所以,最开始那句话更准确的写法是:
保留 SSH 服务,关闭公网对 SSH 端口的直接访问,让已授权设备通过 Tailnet 登录服务器。
安装 Tailscale 本身不会替你关闭原有公网入口。真正调整配置时,应先验证 Tailscale 上的新 SSH 会话能够成功建立,再修改公网规则,最后从不经过 Tailnet 的外部网络验证公网入口已关闭。若服务器同时有公网 IPv4 和 IPv6,也要分别检查。
截至 2026 年 9 月 26 日核对,Tailscale 官方 Personal 方案为免费方案。
当前页面列出的主要额度包括:
| 项目 | Personal 方案 |
|---|---|
| 价格 | 0 美元 |
| 用户数 | 最多 6 个 |
| 用户设备数 | 不限 |
| Tagged resources | 包含 50 个 |
| ACL 分组 | 最多 3 个 |
“用户设备”是关联到用户身份的设备;“Tagged resources”是使用标签身份管理的资源,例如以标签标识的服务器。它们是不同的计数类别,50 个 tagged resources 不等于整个 Tailnet 最多只能连接 50 台设备。
对 MacBook、Windows、Linux 工作站、开发板和个人服务器互联这类需求,免费方案通常能够满足需要。不同功能仍可能有独立额度;已有账号也可能保留旧方案,因此具体以自己的管理后台和官方价格页为准。标签身份的概念见官方 tags 文档。
| 名称 | 主要负责什么? |
|---|---|
| IP 地址 | 标识网络中的接口或访问目标 |
| 端口 | 在传输协议中区分网络服务端点 |
| SSH | 安全远程登录、命令执行及相关功能 |
| Firewall | 根据规则允许或阻止网络流量 |
| UFW | 简化 Linux 主机防火墙规则管理 |
| WireGuard | 加密 IP 隧道 |
| Tailscale | 自动建立和管理设备间的安全私人网络 |
| Tailnet | 由 Tailscale 连接起来的用户、设备和资源网络 |
| DERP | 转发加密流量的中继机制 |
| Exit Node | 为客户端提供互联网出口的节点 |
在“MacBook 远程登录实验室 Ubuntu”这个例子里,Tailscale 解决跨网络连接,Tailnet 是设备加入的私人网络,WireGuard 保护传输,访问策略决定谁能连接,SSH 完成登录。
理解这些分工以后,“关闭公网 SSH 端口”就有了明确边界:远程管理能力继续保留,能够发起连接的入口和身份范围则受到更严格的控制。