通过 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'
十四、完整推荐流程
我的推荐流程是:
- 先用能连服务器的网络登录服务器
- 服务器安装 Tailscale
- 本地电脑安装 Tailscale
- 两台设备登录同一个 Tailscale 账号
- 在服务器执行
tailscale ip -4获取100.x.y.z - 本地用
ssh your-user@100.x.y.z测试连接 - 写入
~/.ssh/config - 以后直接
ssh your-server - 在 Codex 中使用
ssh your-server "命令"做远程控制
到这一步,校园网能不能直连云服务器公网 SSH,就没那么重要了。因为真正使用的是 Tailscale 私有网络。
十五、命令速查
| 命令 | 含义 |
|---|---|
curl -fsSL https://tailscale.com/install.sh | sh | Linux 安装 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 也可以基于这个别名帮你做远程排查、部署和记录整理。