
我正在运行一个脚本,该脚本通过 SSH 向一些生产设备发出远程命令。用户可以使用 RSA 密钥连接到这些设备,大多数情况下都没有问题。偶尔,我会遇到连接超时的情况,大概每 20 次连接就会出现一次。
我使用 SSH2 作为协议,主要是因为我连接的所有机器上都支持 SSH2。这是调试输出的样子,直到连接挂起然后关闭。
[mike@dev ~]$ ssh -v -o "Protocol=2" 10.60.###.### "w"
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 10.60.###.### [10.60.###.###] port 22.
debug1: Connection established.
debug1: identity file /home/mike/.ssh/id_rsa type 1
debug1: identity file /home/mike/.ssh/id_dsa type -1
debug1: loaded 2 keys
debug1: Remote protocol version 1.99, remote software version OpenSSH_3.9p1
debug1: match: OpenSSH_3.9p1 pat OpenSSH_3.*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
Connection closed by 10.60.###.###
连接在此处挂起,然后关闭。
在某些情况下,连接会变得更进一步,但再次挂起。
...
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
Connection closed by 10.60.###.###
当连接中断时,服务器的日志会以如下内容结束:
Jul 23 16:53:07 host02 sshd[4989]: debug1: Client protocol version 2.0; client software version OpenSSH_4.3
Jul 23 16:53:07 host02 sshd[4989]: debug1: match: OpenSSH_4.3 pat OpenSSH*
Jul 23 16:53:07 host02 sshd[4989]: debug1: Enabling compatibility mode for protocol 2.0
Jul 23 16:53:07 host02 sshd[4989]: debug1: Local version string SSH-1.99-OpenSSH_3.9p1
Jul 23 16:53:07 host02 sshd[4990]: debug1: permanently_set_uid: 74/74
Jul 23 16:53:07 host02 sshd[4990]: debug1: list_hostkey_types: ssh-rsa,ssh-dss
Jul 23 16:53:07 host02 sshd[4990]: debug1: SSH2_MSG_KEXINIT sent
Jul 23 16:53:07 host02 sshd[4990]: debug1: SSH2_MSG_KEXINIT received
Jul 23 16:53:07 host02 sshd[4990]: debug1: kex: client->server aes128-cbc hmac-md5 none
Jul 23 16:53:07 host02 sshd[4990]: debug1: kex: server->client aes128-cbc hmac-md5 none
Jul 23 16:53:40 host02 sshd[4990]: debug1: SSH2_MSG_KEX_DH_GEX_REQUEST received
Jul 23 16:53:40 host02 sshd[4990]: debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent
Jul 23 16:53:40 host02 sshd[4990]: debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT
Jul 23 16:53:40 host02 sshd[4990]: Connection closed by ::ffff:192.168.1.203
我发现,在我测试的一台服务器上,如果我改用 SSH1,就不会出现任何连接失败的情况。但我想知道是否可以为 SSH2 修复此问题,而不必在所有生产机器上打开 SSH1。
共尝试连接 100 次...
使用 SSH1:100 次连接成功。 使用 SSH2:约 5 个连接失败。
我是否遗漏了某些(简单)的东西?
答案1
几周前我们终于解决了这个问题,值得继续研究。我们从本地办公室路由器到数据中心的防火墙运行 VPN,两者都是思科的。我们更新了路由器和防火墙上的 IOS,这似乎已经奏效了。
感谢您提交的所有想法/答案。
答案2
这可能是 DNS 查找问题吗?您的客户端 IP 是否已在 DNS 中注册?也许第一次查找时发生超时,然后缓存一段时间。
答案3
查看失败连接的 TCP 数据包。两个日志条目之间的 33 秒可能是由于底层连接丢包或暂时失败造成的。VPN 网关在尝试重新建立隧道时可能会“死机”。在这种情况下,数据包会丢失,而任何 TCP 端点都不会注意到。
只需运行tcpdump -i eth99 -s 0 -w ssh2-problem.pcap port 22
并让连接失败。然后使用Wireshark检查转储文件。显示过滤器tcp.flags.syn == 1 and tcp.flags.ack == 0
仅提供 TCP 流的第一个数据包。然后从上下文菜单中使用“跟踪 TCP 流”,关闭对话框并查看失败的 TCP 流数据包。是否有过多的(>>1)重传?