跳转到正文
Your Zestful Notions

Tailscale 是什么?从 SSH、公网端口到虚拟私人网络讲清楚

从跨网络访问 Linux 的需求出发,串起 Tailscale、Tailnet、WireGuard、SSH、端口与 UFW,理解为什么可以保留 SSH 服务,同时关闭公网 SSH 入口。

计算机基础,开发实践4分钟阅读

在配置 Linux 服务器远程访问时,经常能看到这样一句建议:

关闭公网 SSH 端口,通过 Tailscale 访问服务器。

它的意思是:保留服务器上的 SSH 服务,让已获授权的设备通过 Tailscale 私人网络登录,同时阻止公网直接访问 SSH 入口。

这里涉及几件不同的事:IP 地址和端口帮助连接到服务,SSH 提供远程登录,防火墙决定连接是否允许通过,Tailscale 则把不同地点的设备连接到一个私人网络。本文从最常见的局域网访问说起,把这些概念串起来。

假设实验室的电脑和 Ubuntu 主机连接在同一个局域网中,Ubuntu 的地址是 192.168.1.20。在网络允许互访、SSH 服务已经运行的情况下,可以这样登录:

Terminal window
ssh yzn@192.168.1.20

这条命令包含三部分:

内容 含义
ssh 使用 SSH 客户端建立安全的远程登录连接
yzn 目标系统上的登录用户名
192.168.1.20 目标主机的 IP 地址

没有另外指定端口时,OpenSSH 客户端通常连接 TCP 22 端口。假如服务端改用了 2222 端口,客户端也要对应指定:

Terminal window
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

客户端相应使用:

Terminal window
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。直接连接不可用时,还可以通过中继传输数据。

flowchart TD A["MacBook"] -->|"直接连接"| B["R2-kubuntu"] A -->|"中继路径"| R["DERP 或 Peer Relay"] R --> B

这张图表示可选的数据路径,并不表示同一份应用数据一定同时走两条路径。

连接方式 数据路径
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 服务已经运行,并且监听地址与访问策略允许连接,就可以执行:

Terminal window
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 提供更容易操作的命令接口。

例如查看当前规则:

Terminal window
sudo ufw status verbose

下面这条命令表示添加允许 TCP 22 的规则:

Terminal window
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。

目标可以设计成这样:

flowchart TD P["公网直接连接"] --> F{"入口检查"} F -->|"拒绝 TCP 22"| X["连接被阻止"] M["已授权的 MacBook"] --> T["Tailscale 加密连接"] T --> A{"Tailnet 访问策略"} A -->|"允许 TCP 22"| S["Ubuntu SSH 服务"] A -->|"拒绝"| X

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 端口”就有了明确边界:远程管理能力继续保留,能够发起连接的入口和身份范围则受到更严格的控制。

© yznn007. 保留所有权利。