如何诊断SSH连接超时问题?

如何诊断SSH连接超时问题?

我有一个运行 Debian 7 的 VPS,我从 Windows 机器上使用 PuTTY 连接到它。大多数时候,PuTTY 连接良好,我可以正常登录。但是,PuTTY 有时会报告该情况Connection Timeout

上次发生这种情况时,我尝试远程登录到运行 SSH 的端口,但无法连接。然后,我尝试远程登录到 VPS 上的另一个端口,我知道该端口正在运行服务,并且连接正常。

当它开始“播放”时,如果我尝试连接 5-10 次,就可以成功连接。我检查了系统日志,但没有看到任何可以帮助解决此问题的有趣内容。如果有什么值得的话,当我在服务器“运行”时连接到服务器时,它看起来很慢(我将输入一个命令,需要一两秒的时间才会出现在 SSH 窗口中)。

我不认为这是防火墙问题,因为它在大多数情况下都有效,但有时却不起作用。也许我的主机正在做一些维护?

编辑:TCPKeepAlive 已启用。它刚才又出现了,当尝试 telnet 到 SSH 端口时,它实际上可以连接。诡异的。

答案1

要进行诊断,首先必须使用 putty.exe 的详细模式。

打开cmd并使用:

putty.exe -v -ssh user@]host

-v 将向您显示更多信息。

为了避免紧密连接,请验证您的设置:

在 PuTTY (Win) 上: 转到会话属性 > 连接,然后在发送空数据包以保持会话活动状态下,将保持活动之间的秒数(0 表示关闭)设置为 300(5 分钟)。

在 Linux (ssh) 上: 要在系统范围内启用保持活动状态:

  • 对于所有用户:编辑 /etc/ssh/ssh_config。
  • 适合您:改为编辑 ~/.ssh/config 。

插入以下内容:

Host *
    ServerAliveInterval 300
    ServerAliveCountMax 2

您还可以通过将以下内容添加到 /etc/ssh/sshd_config 来使 OpenSSH 服务器保持与客户端的所有连接:

KeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 2

这些设置将使 SSH 客户端或服务器每 300 秒(5 分钟)向对方发送一个空数据包,如果在 2 次尝试后没有收到任何响应,则放弃,此时连接很可能已被断开。无论如何都被丢弃了。

从 ssh_config 手册页:

服务器最大活动计数设置服务器活动消息的数量(见下文),可以在 ssh(1) 接收不到服务器返回的任何消息的情况下发送该消息。如果在发送服务器活动消息时达到此阈值,ssh 将与服务器断开连接,从而终止会话。需要注意的是,服务器活动消息的使用与 TCPKeepAlive(如下)有很大不同。服务器活动消息通过加密通道发送,因此不会被欺骗。 TCPKeepAlive 启用的 TCP keepalive 选项是可欺骗的。当客户端或服务器依赖于了解连接何时变为非活动状态时,服务器活动机制非常有价值。

默认值为 3。例如,如果将 ServerAliveInterval(见下文)设置为 15 并且 ServerAliveCountMax 保留为默认值,则如果服务器变得无响应,ssh 将在大约 45 秒后断开连接。该选项仅适用于协议版本 2;在协议版本 1 中,没有机制请求服务器对服务器活动消息做出响应,因此断开连接是 TCP 堆栈的责任。

服务器活动间隔设置超时间隔(以秒为单位),在此之后如果没有从服务器接收到数据,ssh(1) 将通过加密通道发送消息以请求服务器响应。默认值为 0,表示这些消息不会发送到服务器;如果设置了 BatchMode 选项,则默认值为 300。此选项仅适用于协议版本 2。 ProtocolKeepAlives 和 SetupTimeOut 是此选项的 Debian 特定兼容性别名。

答案2

听起来您试图排除更广泛的网络问题,而且您可能这样做是正确的。

(我总是会考虑测量网络延迟测量,查看pingtraceroute。因为不需要花太长时间来ping查看是否存在非常广泛的问题,这可能与您的本地互联网连接有关。)

我认为当您使用 VPS 时,有两个常见问题需要注意。

  1. 如果您尝试在太小的 VPS 中运行太多内容。您可能会使用太多内存,然后不断地将数据/代码从磁盘换入和换出。现在你的磁盘非常繁忙,一切都很慢,例如加载 SSH 需要很长时间。

    诊断:监视您的内存使用情况。

    在顶上可能是创建非常粗粒度的内存使用情况日志和其他一些性能信息的便捷方法。atop运行成本约为 5/10M 的 RAM(32 位与 64 位)。这适用于基于 Xen 或 KVM 的 VPS;我不确定它与 OpenVZ(或其他基于容器的 VPS)的配合效果如何。

  2. “吵闹的邻居”问题。有时是由其他人遇到上一个问题引起的:)。在虚拟系统中,您与许多其他人共享硬件。如果某些人使用的磁盘 IO(或可能更多的内存)比“预期”多,则同一硬件上的其他 VPS 将受到影响。

    监测也有助于诊断这一点。然而,这可能是一个更困难和更专业的问题。

最好专注于能够测量和监控(日志/图表)接近服务的实际响应时间的东西。当您的 VPS 主要是公共网络服务器时,这是一个普遍的愿望,并且有免费试用/有限的服务可以为您做到这一点。

我们可以得出结论,一个好的主机将为这两种类型的监控提供基本的建议和/或工具,但我不确定这到底有多普遍:)。

您的 VPS 提供商将会了解这些类型的问题。一种诊断技术是联系他们并描述您遇到的问题:-)。

答案3

我不知道为什么会发生这种情况(正如我们所看到的,普遍的共识似乎是源、目的地和网络组件上有很多因素会影响这种情况)。

但是,我发现scp在执行实际操作之前使用复制一个小虚拟文件ssh似乎几乎可以消除几个 Linux 和 AIX 环境中的此问题:

echo Copying small dummy file to $DESTINATION_IP
scp -o StrictHostKeyChecking=no -o PasswordAuthentication=no dummy.tmp testuser@$DESTINATION_IP:/tmp/. 
echo Testing ssh again
ssh -n -tt -o StrictHostKeyChecking=no -o PasswordAuthentication=no testuser@DESTINATION_IP

相关内容