通过隧道的 SSH 连接无法协商错误

通过隧道的 SSH 连接无法协商错误

我正在使用 SSH 隧道建立与设备的 SSH 连接,我正在使用以下命令创建隧道:

ssh -L 本地主机:44445:XXXX:XXXX[电子邮件保护]

但是当我尝试使用以下方式通过隧道进行 ssh 时:

ssh root@localhost:44445 
Unable to negotiate with 127.0.0.1 port 44445: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

但是,如果我将同一台机器移到设备所在的同一网络中,并尝试直接连接到该设备 - 因此无需使用 SSH 隧道 - 连接就会成功。

当通过隧道运行 SSH 客户端时,我可以使用以下选项进行连接,但我需要能够在没有该选项的情况下进行连接。

-o KexAlgorithms=+diffie-hellman-group14-sha1

有趣的是,我可以使用 ProxyJump 选项进行连接 - 虽然工作正常,但这不是我想要的,因为我需要使用第三方应用程序使用的隧道。

ssh -J [email protected] [email protected]

答案1

您的其他机器很可能安装了旧版本的 OpenSSH 客户端,该客户端尚未默认拒绝使用旧的 DH 算法(“可接受”算法列表会随着时间而改变),或者安装了完全不同的 SSH 客户端(例如,PuTTY 在这方面要求不那么严格)。

如果你只是需要连接而不修改命令,然后你可以将相同的 SSH 选项添加到你的~/.ssh/config。事实上,你甚至可以在那里定义整个隧道:

  1. 〜/.ssh /配置
    托管我的设备 JumpHost 我的隧道 主机名 yyyy 港口zzz Kex算法+diffie-hellman-group14-sha1 主机 mytunnel 主机名 xxxx root 用户
  2. $ ssh 我的设备

如果该选项不行,请使用其他 SSH 客户端,例如 PuTTY:

  • $ plink root@localhost -P 44445

如果你需要在不修改 SSH 客户端的情况下进行连接,那么唯一现实的选择就是升级 SSH 服务器以便它支持更新的算法。

答案2

我同意@u1686_grawity:但问题可能与隧道机建立的 SSH 有关,而不是与最终设备有关。重写一下你的命令

ssh -L localhost:44445:<finalDeviceIP>:<port> root@<tunnelMachineIP>

你说

如果我将同一台机器移到设备所在的同一网络中,并尝试直接连接到该设备(因此无需使用 SSH 隧道),则连接成功

因此,到 的 ssh 连接<finalDeviceIP>工作正常。但是,当您通过时,<tunnelMachineIP>您会收到错误,因为(可能)该机器的 ssh 版本太旧。
在隧道连接中,第一个 ssh 会话是与 建立的<tunnelMachineIP>,然后,正如您所说,它将包装和解包要与 建立的第二个 ssh 会话的有效负载<finalDeviceIP>
正如@u1686_grawity 所建议的,您应该更新 ssh 服务器<tunnelMachineIP>。或者您可以在客户端的 ssh 配置文件中设置隧道(即使您可能应该将选项移到部分KexAlgorithms +diffie-hellman-group14-sha1Host mytunnel)。

相关内容