问题

几天前,我在管道上遇到了一个奇怪的问题,我看到了一个奇怪的错误日志,对我来说没有任何意义:

Connection closed by UNKNOWN port 65535

因此,我决定为每个 ssh 命令启用所有 3 个级别的详细日志

目的服务器没有直接访问公网,所以需要使用ProxyJump来访问目的服务器。

 script:
    - ssh -vvvJ jumpbox@$JUMPBOX_IP bahfo2683@$DEST_IP "echo 'hello'"

我发现管道卡在了 Kex 算法:

debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 96
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: chan_shutdown_write: channel 0: (i0 o1 sock -1 wfd 5 efd -1 [closed])
debug2: channel 0: output drain -> closed
debug1: channel 0: FORCE input drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug3: send packet: type 96
debug2: channel 0: input drain -> closed
Connection closed by UNKNOWN port 65535

解决方案

经过几次头痛的搜索,我找到了解决方案🎉 在这篇文章中,他们描述了我遇到的确切问题,解决方案是在目标服务器的/etc/ssh/ssh_config中添加 Kex 算法。

所以我在 Jumpbox 和目标服务器上都在Host *下方添加了KexAlgorithms curve25519-sha256,ecdh-sha2-nistp521:

Host *
    KexAlgorithms curve25519-sha256,ecdh-sha2-nistp521

我也添加了curve25519-sha256,因为我看到在管道中 ssh 客户端选择了这个算法。

我再次运行管道,但你猜怎么着?它没有用!所以,我来测试一些东西,首先,我删除了 Jumpbox 服务器上的 Kex 算法,然后尝试从 Jumpbox 连接到目标服务器,我看到了connection time out!所以我想到在管道中同样的事情发生。我需要在管道以及两台服务器上设置 Kex 算法。

我编辑了我的.gitlab-ci.yml文件并在 ssh 之前添加了- sed -i -e "s/Host \*/&\nKexAlgorithms curve25519-sha256,ecdh-sha2-nistp521/g"行:

before_script:
    - apk add openssh-client rsync
    - sed -i -e "s/Host \*/&\nKexAlgorithms curve25519-sha256,ecdh-sha2-nistp521/g"  /etc/ssh/ssh_config

使用sed -i -e "s/Host \*/&\nKexAlgorithms curve25519-sha256,ecdh-sha2-nistp521/g" /etc/ssh/ssh_config我将 Kex 算法添加到 ssh_config 文件并再次尝试。

这次管道成功运行,我的应用程序部署在目标服务器上。

图像.png

结论

这是 ssh 的罕见情况,但如果您看到此错误,请记住:

Connection closed by UNKNOWN port 65535

首先尝试两件事:

  • 为调试级别 1,2 和 3 启用详细日志 -vvv

  • 检查 ssh 在哪一步卡住并用谷歌搜索!

如果管道卡在SSH2_MSG_KEX_ECDH_REPLY,那么您应该在服务器的.gitlab-ci.yml/etc/ssh/ssh_config上设置 Kex 算法。

您发现其中大多数是 Mac 问题,但我的情况是 Kex 算法。

如果您正在阅读本文,我希望本文能帮助您解决 SSH 问题。

谢谢你,编码愉快!

Logo

更多推荐