通过 Tailscale 连接服务器:解决校园网无法 SSH 的问题

记录如何用 Tailscale 打通本地电脑与云服务器的私有网络,在校园网限制公网 SSH 的情况下稳定连接服务器。

通过 Tailscale 连接服务器:解决校园网无法 SSH 的问题

这篇记录一个很实用的问题:在校园网环境下,直接 SSH 连接云服务器可能失败,但服务器本身并没有坏,SSH 配置也没有问题。

常见现象是:

  • 在家里、手机热点、公司网络下可以正常 SSH
  • 换到校园网后,ssh user@server-ip 连接超时
  • 云服务器安全组、端口、密钥都检查过,依然连不上
  • 网站可能能打开,但 SSH 的 22 端口就是不稳定

这种情况下,可以用 Tailscale 把本地电脑和服务器放进同一个私有网络。之后 SSH 不再走服务器公网 IP,而是走 Tailscale 分配的内网 IP 或设备名。

文中所有 IP、用户名、密钥路径都使用占位符,不包含真实服务器信息。

一、为什么校园网会影响 SSH

SSH 默认使用 22 端口。部分校园网、公共网络或企业网络可能会对出站端口做限制。

可能的表现包括:

  • 直接阻断 22 端口
  • 对长连接不友好
  • NAT 或防火墙策略导致连接不稳定
  • 某些云服务器 IP 段访问质量较差

这时即使服务器本身是正常的,本地也可能连不上:

ssh your-user@your-server-public-ip

可能会卡住,最后报:

Operation timed out

或者:

Connection timed out

Tailscale 的思路是:让你的本地电脑和云服务器加入同一个 tailnet,形成一个基于 WireGuard 的私有网络。之后你连接的是 Tailscale 网络里的地址,而不是直接访问公网 SSH 入口。

二、整体方案

最终目标是这样的:

本地电脑  -- Tailscale 私有网络 --  云服务器

连接方式从:

ssh -i ~/.ssh/your-key your-user@your-server-public-ip

变成:

ssh -i ~/.ssh/your-key your-user@your-server-tailscale-ip

或者更方便:

ssh your-server

这里的 your-server 是自己在 ~/.ssh/config 中配置的别名。

三、准备条件

你需要准备:

项目示例占位符说明
本地电脑Mac / Windows / Linux安装 Tailscale 客户端
云服务器Linux 服务器安装 Tailscale 服务端客户端
Tailscale 账号GitHub / Google / Microsoft 等用同一个账号登录
SSH 用户your-user例如普通用户或 root
SSH 私钥~/.ssh/your-key如果使用密钥登录

官方文档:

四、在本地电脑安装 Tailscale

Mac

可以从官网下载并安装:

https://tailscale.com/download

安装完成后,登录自己的 Tailscale 账号。

也可以用 Homebrew:

brew install --cask tailscale

然后打开 Tailscale App 登录。

Windows

从官网下载 Windows 安装包:

https://tailscale.com/download

安装后登录同一个 Tailscale 账号。

Linux 本地电脑

Linux 可以使用官方安装脚本:

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

然后登录:

sudo tailscale up

浏览器会打开认证页面,登录后这台电脑就加入 tailnet 了。

五、在云服务器安装 Tailscale

先通过能连接服务器的网络进入服务器。例如:

  • 手机热点
  • 家里网络
  • 云厂商网页控制台
  • 云服务器的 VNC / Web Shell

进入服务器后安装 Tailscale:

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

启动并登录:

sudo tailscale up

终端会输出一个登录链接。复制链接到浏览器,使用和本地电脑相同的 Tailscale 账号登录。

登录完成后,服务器也会加入同一个 tailnet。

六、查看 Tailscale IP

在服务器上执行:

tailscale ip -4

会输出一个类似下面的地址:

100.x.y.z

这个 100.x.y.z 就是服务器在 Tailscale 私有网络里的 IP。

在本地电脑也可以查看当前 tailnet 里的设备:

tailscale status

你会看到类似:

100.x.y.z    your-server    your-account    linux
100.a.b.c    your-laptop    your-account    macOS

只要两台设备都在列表里,就说明它们已经在同一个 Tailscale 网络中了。

七、通过 Tailscale IP 连接服务器

现在不要再用公网 IP 连接,而是改用 Tailscale IP:

ssh -i ~/.ssh/your-key your-user@100.x.y.z

如果你的服务器 SSH 端口不是 22,需要加 -p

ssh -i ~/.ssh/your-key -p your-ssh-port your-user@100.x.y.z

连接成功后,说明 SSH 已经绕过校园网对公网 SSH 的限制,改走 Tailscale 私有网络了。

八、使用 MagicDNS:用设备名代替 IP

Tailscale 支持 MagicDNS。开启后,可以直接用设备名连接,不用记 100.x.y.z

例如服务器设备名是 your-server,可以尝试:

ssh -i ~/.ssh/your-key your-user@your-server

如果设备名冲突或解析失败,可以回到 Tailscale 管理后台查看设备名称。

MagicDNS 的好处是:

  • 不用记 Tailscale IP
  • 服务器 Tailscale IP 变化时影响更小
  • 命令更短,更适合日常使用

九、配置 SSH Config,让连接更短

推荐把连接信息写进本地 ~/.ssh/config

打开文件:

nano ~/.ssh/config

加入:

Host your-server
    HostName 100.x.y.z
    User your-user
    Port 22
    IdentityFile ~/.ssh/your-key
    ServerAliveInterval 60
    ServerAliveCountMax 3

保存后,连接命令变成:

ssh your-server

如果你启用了 MagicDNS,也可以把 HostName 写成设备名:

Host your-server
    HostName your-server
    User your-user
    Port 22
    IdentityFile ~/.ssh/your-key
    ServerAliveInterval 60
    ServerAliveCountMax 3

不过我更喜欢第一种:Host 用短别名,HostName 写明确的 Tailscale IP。这样排查问题时更直观。

十、在 Codex 中使用

配置好 SSH 别名后,Codex 里可以直接让它执行:

ssh your-server "pwd"

查看服务器目录:

ssh your-server "ls -lah"

查看磁盘:

ssh your-server "df -h"

查看内存:

ssh your-server "free -h"

查看服务状态:

ssh your-server "systemctl status nginx"

这样 Codex 不需要知道你的公网 IP,只需要知道本地 SSH 别名即可。

十一、普通 SSH over Tailscale 和 Tailscale SSH 的区别

这里容易混淆,简单区分一下。

普通 SSH over Tailscale

命令类似:

ssh -i ~/.ssh/your-key your-user@100.x.y.z

特点:

  • 仍然使用服务器上的 OpenSSH
  • 仍然使用原来的 Linux 用户和 SSH 密钥
  • 只是网络路径从公网变成了 Tailscale 私有网络
  • 对个人服务器来说最直观,也最容易理解

Tailscale SSH

Tailscale 也提供自己的 SSH 能力,可以让 Tailscale 接管 tailnet 内的 SSH 认证与授权。

服务器上可以启用:

sudo tailscale set --ssh

然后配合 Tailscale 管理后台的访问控制规则使用。

它的好处是可以把 SSH 权限和 Tailscale 身份绑定起来,适合多人团队、统一权限管理、减少手动维护 SSH key 的场景。

如果只是自己连接自己的服务器,我更建议先用“普通 SSH over Tailscale”。它和传统 SSH 习惯一致,排查也简单。

十二、建议的安全设置

不要公开真实信息

公开教程里不要写:

  • 真实公网 IP
  • 真实 Tailscale IP
  • 真实用户名
  • 真实私钥路径
  • 服务器密码
  • 私钥内容
  • .env 里的生产配置

用占位符就够:

your-server-public-ip
100.x.y.z
your-user
~/.ssh/your-key

尽量使用密钥登录

比起密码登录,更推荐 SSH key。

私钥权限建议设置为:

chmod 600 ~/.ssh/your-key

保留公网 SSH 的最小暴露

如果已经能稳定通过 Tailscale 连接服务器,可以考虑收紧云服务器安全组。

例如:

  • 公网 SSH 只允许自己的固定 IP
  • 或者关闭公网 SSH,仅通过 Tailscale 访问

这个操作要谨慎。关闭公网 SSH 前,一定要确认 Tailscale 可以稳定连接,否则容易把自己锁在服务器外面。

十三、常见问题排查

tailscale status 看不到服务器

检查服务器是否已经登录:

tailscale status

如果没有登录,重新执行:

sudo tailscale up

本地能看到服务器,但 SSH 失败

先测试网络:

ping 100.x.y.z

再测试 SSH:

ssh -v your-user@100.x.y.z

-v 会输出详细日志,方便判断是网络问题、密钥问题还是用户名问题。

Permission denied

通常是 SSH 认证问题,而不是 Tailscale 网络问题。

重点检查:

  • 用户名是否正确
  • 私钥路径是否正确
  • 私钥权限是否为 600
  • 服务器上是否有对应公钥

连接超时

如果连接 Tailscale IP 也超时,检查:

  • 本地 Tailscale 是否在线
  • 服务器 Tailscale 是否在线
  • 两台设备是否在同一个 Tailscale 账号或 tailnet 中
  • 服务器防火墙是否限制了来自 tailscale0 网卡的 SSH

可以在服务器上查看 SSH 是否监听:

sudo ss -tulnp | grep ':22'

十四、完整推荐流程

我的推荐流程是:

  1. 先用能连服务器的网络登录服务器
  2. 服务器安装 Tailscale
  3. 本地电脑安装 Tailscale
  4. 两台设备登录同一个 Tailscale 账号
  5. 在服务器执行 tailscale ip -4 获取 100.x.y.z
  6. 本地用 ssh your-user@100.x.y.z 测试连接
  7. 写入 ~/.ssh/config
  8. 以后直接 ssh your-server
  9. 在 Codex 中使用 ssh your-server "命令" 做远程控制

到这一步,校园网能不能直连云服务器公网 SSH,就没那么重要了。因为真正使用的是 Tailscale 私有网络。

十五、命令速查

命令含义
curl -fsSL https://tailscale.com/install.sh | shLinux 安装 Tailscale
sudo tailscale up登录并加入 tailnet
tailscale status查看当前 tailnet 设备状态
tailscale ip -4查看本机 Tailscale IPv4 地址
ssh your-user@100.x.y.z通过 Tailscale IP 连接服务器
ssh -i ~/.ssh/your-key your-user@100.x.y.z使用私钥通过 Tailscale 连接
ssh -v your-server输出 SSH 调试日志
ssh your-server "df -h"远程查看服务器磁盘
sudo tailscale set --ssh启用 Tailscale SSH

十六、总结

校园网无法 SSH 时,不一定是服务器配置错了,也可能是网络环境对端口或长连接不友好。

Tailscale 的价值在于:它给本地电脑和服务器建立了一个稳定的私有网络。之后我们不再依赖公网 SSH 链路,而是通过 100.x.y.z 这类 Tailscale 地址连接服务器。

对个人开发者来说,最舒服的组合是:

Tailscale IP + SSH key + ~/.ssh/config + Codex

配置完成后,连接服务器会变得很轻:

ssh your-server

然后 Codex 也可以基于这个别名帮你做远程排查、部署和记录整理。