我使用 Google Cloud VM,每次我切换回终端时都会发现 ssh 会话已冻结。当我尝试重新连接时
ssh -v -i ~/.ssh/key [email protected]
它显示了这一点:
OpenSSH_7.4p1, LibreSSL 2.5.0
debug1: Reading configuration data /Users/UserName/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 53: Applying options for *
debug1: Connecting to host.domain [123.456.123.456] port 22.
debug1: Connection established.
debug1: identity file /Users/UserName/.ssh/ke> type 1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/UserName/.ssh/key-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
看起来似乎已建立连接,但没有其他反应,我需要重新启动虚拟机。这是什么意思?
我应该注意,我可以ping
毫无问题地访问主机,因此它没有被冻结或出现任何问题。
答案1
debug1: Local version string SSH-2.0-OpenSSH_7.4
当客户端连接到 SSH 服务器时,服务器会通过向客户端以纯文本形式发送服务器版本字符串来启动 SSH 协议。使用 OpenSSHssh
实用程序,相关的调试行如下所示:
debug1: Local version string SSH-2.0-OpenSSH_7.6
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6
在“本地版本”行之后,您的客户端正在等待服务器将其版本字符串发送给客户端。如果连接在此处挂起,那是因为客户端尚未从服务器收到版本字符串。
一般来说,有几种情况可能导致这种情况:
- 客户端已连接到非 SSH 服务器。例如,HTTP 服务器不会向客户端发送任何内容,因为 HTTP 协议要求客户端发送第一个数据。
- 服务器出现故障。例如,服务器可能超载,SSH 服务器进程没有机会运行。
- 服务器不知为何挂起了。例如,它可能卡在对客户端 IP 地址进行 DNS 查询时。
- 某些网络设备正在干扰 TCP 连接。
就您而言,您连接到的是端口 22,因此可以安全地假设您正在连接到 SSH 服务器进程。您似乎遇到了问题 #2(服务器出现故障),但除此之外,无法确切地说出问题所在。您需要进入服务器并找出当时发生了什么,导致它无法处理 SSH 连接。
答案2
@Kenster 的解释很棒。我想添加一些您可以检查的具体内容。
我的回答不是以云为中心,但它也可以提供一些有关云的想法。
该行debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6
是缺失的服务器响应。
所以这可能意味着服务器无法通过网络将该数据包传送给客户端。
如果您托管 SSH 服务,您可以使用tcpdump -i any host ip_address_here
它来追踪它(在我的情况下它git clone
失败了,我托管 SSH GIT 服务)。
此外,您可以将其简化nc host.domain 22
并在不同的设备(甚至是 SSH 服务器)上运行。它通常会在运行时打印 SSH 服务器版本。
就我的情况而言,它在某些机器上运行良好,但不是全部。
~ server-1 $ nc example.com 22
SSH-2.0-APACHE-SSHD-2.X.X
^C
~ server-2 $ nc example.com 22
^C
~ $
这是网络问题,与配置/过滤有关。