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

Mat*_*son 5 ssh debian openssh troubleshooting

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

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

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

我不认为这是防火墙问题,因为它大部分时间都可以工作,但有时却无法工作。也许我的主机正在做一些维护?

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

小智 5

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

打开 cmd 并使用:

putty.exe -v -ssh user@]host
Run Code Online (Sandbox Code Playgroud)

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

为避免关闭连接,请验证您的设置:

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

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

  • 对于所有用户:编辑 /etc/ssh/ssh_config.conf
  • 只为你:编辑 ~/.ssh/config 代替。

插入以下内容:

Host *
    ServerAliveInterval 300
    ServerAliveCountMax 2
Run Code Online (Sandbox Code Playgroud)

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

KeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 2
Run Code Online (Sandbox Code Playgroud)

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

从 ssh_config 手册页:

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

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

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