公众号旧文

为什么你ssh连服务器会慢?如何改善?

作者:胖子阅读 —

我今天买了第二台洛杉矶的服务器,遇到了一个问题。

明明 CPU 空闲、内存充足,ping 延迟看起来也还可以,但就是:

SSH 登录特别慢。

甚至会出现这样的情况:

  • 打开 SSH 要等几秒才出现登录提示
  • 输入命令后要过一会儿才显示结果

经过简单的测试,我知道了,是网络路径的问题。

今天就用我这真实案例讲清楚:

为什么 SSH 会慢,以及如何改善。

一、为什么 SSH 会慢?

SSH 的数据其实非常小。

你在终端里输入一个命令,比如:

ls

传输的数据可能只有几十个字节。

所以 SSH 的体验,主要取决于两个因素:

延迟(Latency)和丢包(Packet Loss)。

如果网络路径不好,即使服务器再强,也会感觉非常卡。

例如下面这种典型情况:

天津联通 → 美国洛杉矶服务器

表面看延迟可能只有 180ms,但真实路径可能是:

天津
↓
北京
↓
上海
↓
日本
↓
美国西海岸

如果其中某一段网络拥堵,就会产生:

  • 丢包
  • TCP 重传
  • 延迟抖动

这时候 SSH 就会变得非常不流畅。

二、我的真实案例

我这两台服务器,一台在洛杉矶:

LAX

新买的也是洛杉矶,但网络线路不同:

lax-lite

我从天津联通直接连接 lax-lite 时,体验非常差。

但如果先登录到 LAX,再从 LAX SSH 到 lax-lite,速度却很正常。

路径变成了这样:

天津联通
↓
LAX
↓
lax-lite

为什么这样会更快?

因为美国本地机房之间的网络质量,远远好于跨国线路。

所以:

  • 天津 → LAX 走一条比较稳定的线路
  • LAX → lax-lite 走本地网络

整体体验反而更好。

三、跳板机

这种解决方案有一个专业名字:

跳板机(Jump Host)。

简单理解就是:

先连接一台网络质量更好的服务器,再从这台服务器访问目标服务器。

结构通常是:

本地电脑
↓
跳板机
↓
目标服务器

在我的例子中:

本地电脑
↓
LAX
↓
lax-lite

这样做有几个好处:

1️⃣ 避开差的跨国线路 2️⃣ 利用同城机房内部高速网络 3️⃣ 提升 SSH 交互体验

很多运维团队都会使用这种架构。

四、如何实现?

实现其实非常简单。

首先在跳板机上配置 SSH 免密登录。

生成密钥:

ssh-keygen -t ed25519

然后把公钥复制到目标服务器:

ssh
-
copy
-
id root
@lax
-
lite

之后就可以直接从跳板机登录:

ssh
 root
@lax
-lite

如果使用终端工具,比如 SecureCRT,还可以设置自动执行命令。

图片

登录跳板机后自动运行:

ssh
 root
@lax
-lite

这样你在客户端只需要点一次连接,就能直接进入最终服务器。

五、更高级的方案

在 Linux 或 macOS 中,还可以使用 SSH 的 ProxyJump 功能。

在 SSH 配置文件中写:

Host
 LAX

HostName

23
.
94
.xxx.xxx

User
 root
Host
 lax-lite

HostName

45
.
202
.xxx.xxx

User
 root

ProxyJump
 LAX

之后只需要执行:

ssh
 lax-lite

SSH 就会自动完成:

本地 → LAX → lax-lite

整个过程是自动的。

六、总结

如果你发现 SSH 很慢,不要急着怀疑服务器性能。

更可能的原因是:

  • 网络路径不好
  • 跨国线路拥堵
  • 丢包严重

一个简单有效的方法就是:使用跳板机。

通过一台网络更稳定的服务器中转,往往可以显著改善 SSH 体验。

很多大型公司内部的运维系统,其实都是通过跳板机架构来管理服务器的。

所以当你觉得 SSH 很卡的时候,不妨想一想:

问题可能不在服务器,而在你和服务器之间的那条路。