不用公网 IP,把 Windows 和 Linux 服务器放进同一个局域网:Tailscale 组网实战

Tailscale 是什么

Tailscale 是一个基于 WireGuard 的组网工具。

它可以把分布在不同网络中的电脑、服务器、手机和 NAS 连接起来,让这些设备像在同一个局域网中一样通信。

例如:

复制代码
家里的 Windows 电脑
│
│ Tailscale 加密网络
│
云服务器上的 Linux

Windows 可能连接的是家庭宽带,Linux 服务器可能部署在 AWS、阿里云、腾讯云或者其他机房。

它们不在同一个物理网络里,但安装 Tailscale 后,会各自获得一个虚拟 IP 地址。两台设备可以直接使用这个地址通信。

Tailscale 的方便之处在于,大多数情况下不需要:

  • 自己搭建 VPN 服务器;

  • 配置端口转发;

  • 购买固定公网 IP;

  • 手动生成和分发 WireGuard 密钥;

  • 修改家里的路由器配置。

只要两台设备可以正常访问互联网,就可以尝试建立连接。

Tailscale 是怎么连接设备的

Tailscale 安装到设备后,会创建一个虚拟网卡,并为设备分配一个专用地址,通常是下面这种格式:

复制代码
100.x.x.x

当 Windows 访问 Linux 时,Tailscale 会优先尝试建立点对点连接。

也就是说,数据尽量直接在 Windows 和 Linux 之间传输,而不是全部经过一台中心 VPN 服务器。

如果两边的网络限制比较严格,无法直接连接,Tailscale 会自动使用中继服务器转发流量。经过中继时,通信内容仍然是加密的。

对普通用户来说,不需要手动判断应该直连还是中继,Tailscale 会自动处理。

这次要实现什么

假设现在有两台设备:

本地电脑

perl 复制代码
系统:Windows 11
位置:家里
设备名称:my-windows

远程服务器

vbscript 复制代码
系统:Ubuntu Linux
位置:云服务器
设备名称:ubuntu-server

我们的目标是:

  1. 在 Windows 和 Linux 上安装 Tailscale;

  2. 使用同一个账号登录;

  3. 让两台设备加入同一个虚拟网络;

  4. 在 Windows 上通过 Tailscale 地址连接 Linux;

  5. 测试成功后,关闭 Linux 对公网开放的 SSH 端口。

一、在 Linux 服务器上安装 Tailscale

下面以 Ubuntu 和 Debian 系统为例。

先通过云服务器控制台或者原来的 SSH 方式登录 Linux,然后执行:

arduino 复制代码
curl -fsSL https://tailscale.com/install.sh | sh

安装完成后,启动 Tailscale:

复制代码
sudo tailscale up

终端会显示一个登录地址:

vbnet 复制代码
To authenticate, visit:

https://login.tailscale.com/a/xxxxxxxx

复制这个地址,在浏览器中打开,然后选择一个账号登录。

可以使用 Google、Microsoft、GitHub、Apple 或其他支持的身份账号。

登录成功后,Linux 服务器就加入了 Tailscale 网络。

查看当前连接状态:

lua 复制代码
tailscale status

查看服务器的 Tailscale IPv4 地址:

复制代码
tailscale ip -4

假设返回:

复制代码
100.86.20.15

这个地址就是 Linux 服务器在 Tailscale 网络中的地址。

它和服务器公网 IP 不一样,只能由同一个 Tailscale 网络中的授权设备访问。

二、确认 Linux 已经启用 SSH

如果服务器原本就能通过 SSH 登录,一般不需要额外安装。

可以执行下面的命令检查:

lua 复制代码
sudo systemctl status ssh

如果提示找不到服务,可以安装 OpenSSH Server:

sql 复制代码
sudo apt update
sudo apt install -y openssh-server

安装后启动 SSH:

bash 复制代码
sudo systemctl enable --now ssh

再次检查:

lua 复制代码
sudo systemctl status ssh

看到下面的状态,说明 SSH 正常运行:

arduino 复制代码
Active: active (running)

三、只允许 Tailscale 网络访问 SSH

如果 Linux 开启了 UFW 防火墙,可以添加一条规则,只允许通过 Tailscale 虚拟网卡访问 22 端口:

vbnet 复制代码
sudo ufw allow in on tailscale0 to any port 22 proto tcp

查看规则:

lua 复制代码
sudo ufw status

这里的 tailscale0 是 Tailscale 创建的虚拟网卡。

这条规则和直接执行下面的命令不一样:

复制代码
sudo ufw allow 22

直接开放 22 端口,可能会允许公网访问。限制到 tailscale0 后,只有通过 Tailscale 网络进入的连接才能访问 SSH。

不过先不要急着关闭公网 SSH,等 Windows 连接测试成功后再处理。

四、在 Windows 上安装 Tailscale

进入 Tailscale 下载页面,下载 Windows 安装程序。

运行安装程序后,Windows 任务栏右下角会出现 Tailscale 图标。

如果没有看到,可以点击任务栏中的向上箭头,在隐藏图标里查找。

右键点击 Tailscale 图标,选择:

复制代码
Log in

浏览器会打开登录页面。

这里需要使用刚才 Linux 登录时使用的同一个账号。

登录完成后,Windows 也会加入同一个 Tailscale 网络。

这时可以打开 Tailscale 管理后台,在设备列表中看到两台设备:

perl 复制代码
my-windows Windows
ubuntu-server Linux

每台设备都会有自己的 Tailscale IP。

五、测试 Windows 和 Linux 是否连通

在 Windows 中打开 PowerShell。

先测试 Linux 服务器的 Tailscale IP:

复制代码
ping 100.86.20.15

有些系统或防火墙可能会拦截普通 Ping,因此普通 Ping 失败不一定代表网络无法使用。

还可以使用 Tailscale 自带的测试命令:

复制代码
tailscale ping 100.86.20.15

如果连接正常,会看到类似结果:

csharp 复制代码
pong from ubuntu-server

也可以查看当前网络中的设备:

lua 复制代码
tailscale status

输出中应该能看到 Linux 服务器及其地址。

六、在 Windows 上通过 SSH 登录 Linux

假设 Linux 用户名是:

复制代码
ubuntu

在 Windows PowerShell 中执行:

css 复制代码
ssh ubuntu@100.86.20.15

第一次连接时,可能会出现提示:

kotlin 复制代码
Are you sure you want to continue connecting?

输入:

bash 复制代码
yes

然后输入 Linux 用户密码,或者使用已经配置好的 SSH 私钥。

登录成功后,会进入 Linux 终端:

ruby 复制代码
ubuntu@ubuntu-server:~$

到这里,Windows 和 Linux 的基本组网就完成了。

即使两台设备使用不同运营商、位于不同城市,也可以通过 Tailscale 地址直接连接。

七、使用设备名称连接

每次输入 100.x.x.x 地址还是有点麻烦。

Tailscale 提供了 MagicDNS 功能,可以直接使用设备名称访问服务器。

假设 Linux 服务器的设备名称是:

vbscript 复制代码
ubuntu-server

那么可以在 Windows 中直接执行:

css 复制代码
ssh ubuntu@ubuntu-server

也可以测试:

vbscript 复制代码
ping ubuntu-server

或者:

vbscript 复制代码
tailscale ping ubuntu-server

如果设备名称无法解析,可以登录 Tailscale 管理后台,检查 DNS 页面中的 MagicDNS 是否已经启用。

设备名称也可以在管理后台修改。相比记住一串 IP,给服务器设置一个容易识别的名称会方便很多,例如:

vbscript 复制代码
home-server
web-server
docker-server
nas

八、测试访问 Linux 上的 Web 服务

Tailscale 不只能用来连接 SSH,也可以访问 Linux 上运行的网站、面板和开发服务。

我们可以临时启动一个简单的 HTTP 服务进行测试。

在 Linux 中创建一个目录:

bash 复制代码
mkdir -p ~/tailscale-test
cd ~/tailscale-test

创建一个简单网页:

bash 复制代码
echo 'Hello from Linux Server' > index.html

启动 Python HTTP 服务:

yaml 复制代码
python3 -m http.server 8080

然后在 Windows 浏览器中访问:

arduino 复制代码
http://100.86.20.15:8080

如果 MagicDNS 可用,也可以直接访问:

arduino 复制代码
http://ubuntu-server:8080

看到 Hello from Linux Server,说明 Windows 已经可以访问 Linux 上运行的 Web 服务。

实际使用中,这种方式可以访问很多服务,例如:

  • Docker 管理面板;

  • 宝塔面板;

  • 数据库管理工具;

  • Jellyfin;

  • Home Assistant;

  • 自己开发的后台系统;

  • 只供内部使用的 API;

  • NAS 管理页面。

这些服务不一定需要开放到公网,只要通过 Tailscale 访问即可。

九、确认成功后关闭公网 SSH

当下面几项都测试正常后,可以考虑关闭云服务器安全组中的公网 22 端口:

  • Windows 和 Linux 都显示在线;

  • Windows 可以连接 Linux 的 Tailscale IP;

  • 使用 SSH 登录没有问题;

  • Linux 重启后 Tailscale 可以自动上线;

  • 云服务商提供网页终端或救援控制台。

云服务器安全组中经常会有类似规则:

复制代码
协议:TCP
端口:22
来源:0.0.0.0/0

其中 0.0.0.0/0 表示允许所有公网 IP 尝试访问服务器的 22 端口。

确认 Tailscale 连接没有问题后,可以删除这条规则,或者至少把来源限制到自己的固定 IP。

关闭公网端口后,仍然可以通过 Tailscale 登录:

css 复制代码
ssh ubuntu@ubuntu-server

这样可以减少服务器被扫描和暴力破解的情况。

需要注意的是,在关闭公网 SSH 之前,一定要保留备用登录方式。万一 Tailscale 配置出错,还可以通过云厂商提供的网页终端进入服务器修复。

十、查看当前是直连还是中继

在 Windows PowerShell 中执行:

vbscript 复制代码
tailscale ping ubuntu-server

结果中可能会显示连接类型。

如果看到类似:

复制代码
via 192.168.x.x:41641

通常表示两台设备已经建立直接连接。

如果看到:

复制代码
via DERP

说明当前连接经过了 Tailscale 中继服务器。

经过中继也可以正常使用,只是速度和延迟可能不如直连。

一般的 SSH、服务器管理和后台访问,即使走中继也不会有太大影响。如果需要传输大量文件,中继速度可能会比较明显。

十一、服务器重启后无法连接怎么办

Tailscale 在正常安装后会作为系统服务运行。

可以在 Linux 中检查:

lua 复制代码
sudo systemctl status tailscaled

如果服务没有启动,可以执行:

bash 复制代码
sudo systemctl enable --now tailscaled

然后查看状态:

lua 复制代码
tailscale status

如果设备认证已经过期,可能需要重新登录:

css 复制代码
sudo tailscale up --force-reauth

对于长期运行的服务器,还可以在 Tailscale 管理后台中查看设备密钥的有效期。

是否关闭设备密钥过期,需要根据实际安全需求决定。家用服务器可以考虑,重要的生产服务器则要更加谨慎。

十二、能连接 Tailscale,但 SSH 失败怎么办

先在 Linux 中检查 SSH 服务:

lua 复制代码
sudo systemctl status ssh

检查 22 端口是否正在监听:

perl 复制代码
sudo ss -lntp | grep ':22'

再检查 UFW:

lua 复制代码
sudo ufw status

如果没有允许 Tailscale 网卡访问 SSH,可以添加:

vbnet 复制代码
sudo ufw allow in on tailscale0 to any port 22 proto tcp

还可以在 Windows 中测试 22 端口:

复制代码
Test-NetConnection 100.86.20.15 -Port 22

如果看到:

yaml 复制代码
TcpTestSucceeded : True

说明 Windows 可以连接到 Linux 的 22 端口。

如果端口可以连接,但 SSH 登录失败,就要检查 Linux 用户名、密码、密钥以及 /etc/ssh/sshd_config 配置。

十三、Tailscale 适合哪些场景

Windows 连接 Linux 服务器只是 Tailscale 最基础的用法。

它还适合下面这些场景:

远程访问家庭 NAS

即使家里没有公网 IP,也可以从外面访问 NAS。

管理多台云服务器

把不同云平台上的服务器放进同一个私有网络,不需要让管理端口全部暴露在公网。

访问 Docker 服务

Portainer、数据库、监控面板等服务可以只对 Tailscale 网络开放。

连接家庭和办公室设备

家里的电脑、办公室服务器和出差时使用的笔记本,可以加入同一个网络。

访问内网设备

通过子网路由功能,还可以访问无法安装 Tailscale 的打印机、摄像头和其他局域网设备。

总结

Tailscale 最吸引人的地方不是功能有多复杂,而是它把原本很麻烦的组网过程简化了。

以前想从 Windows 安全访问一台远程 Linux 服务器,可能要考虑:

  • 公网 IP;

  • 动态域名;

  • 路由器端口映射;

  • VPN 服务器;

  • 防火墙规则;

  • WireGuard 密钥配置。

使用 Tailscale 后,基本流程只剩下:

  1. 在 Linux 上安装并登录;

  2. 在 Windows 上安装并登录;

  3. 使用 Tailscale IP 或设备名称连接。

最终只需要一条命令:

css 复制代码
ssh ubuntu@ubuntu-server

对于个人服务器、家庭实验室和小团队来说,这种方式足够简单,也比长期把 SSH、数据库和管理面板暴露在公网更稳妥。

相关推荐
神奇小汤圆1 小时前
Java 的1 亿次对象创建:JVM 开启 / 关闭逃逸分析,GC 性能差距巨大
后端
tangdou3690986551 小时前
AI真好玩系列-2分钟快速了解DeepAgents | Quick Guide to DeepAgents in 2 Minutes
前端·javascript·后端
神奇小汤圆2 小时前
面试官:MySQL 为什么要是使用 MVCC?原理是什么?
后端
像我这样帅的人丶你还2 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
玉宇夕落2 小时前
别再死磕 Prompt 了!上下文工程 (Context Engineering) 的简单学习
后端
用户34232323763172 小时前
定时器与 PWM 输出详解
后端
Jason_chen3 小时前
Linux 6.2 CAN/CANFD机制详解
后端
Apifox4 小时前
Apifox 6 月更新|Apifox CLI 全面升级、导入导出优化、OAuth 2.0 支持自动刷新令牌
前端·后端·测试
悟空瞎说4 小时前
NestJS 接口设计避坑:摒弃万能用户更新接口,落地单一职责与最小权限原则
后端·nestjs