如何解决您的Droplet上的SSH协议问题

该系列中的这一部分涉及协议启动问题。一旦连接成功建立,SSH协议将基于建立信任协议与客户端进行加密连接。在您甚至可以验证您在系统中的身份之前,系统将尝试与客户端建立加密方法。这个范围可能会出现一些独特的问题,本教程将介绍如何识别它们,如何解决这些问题,以及额外的资源给prev

介绍

这是我们的SSH故障排除文章系列的延续

第一篇文章将帮助您确定何时解决问题,而不是迁移或重新部署问题,并为您需要有效地进行故障排除的信息提供资源。 本系列的其他部分包括如何识别和解决特定的SSH错误,并分解您需要调试成功的SSH连接的哪个阶段

一旦连接成功建立,SSH协议将基于建立信任协议与客户端进行加密连接。 在您甚至可以验证您在系统中的身份之前,系统将尝试与您的客户建立加密方法。 这个范围可能会出现一些独特的问题,本教程将介绍如何识别它们,如何解决这些问题,以及其他资源来防止这些问题。

先决条件

要解决SSH问题,您需要确保您的Droplet正常从Web控制台正常响应,并使用正常的网络配置。 您可以通过遵循如何和什么时候解决SSH问题教程来执行此操作

在对SSH进行故障排除之前,您应该始终检查云计算面板,以了解影响您的Droplet的区域,管理程序状态以及通过Web控制台的Droplet状态的持续问题

错误

以下是您可能遇到的常见SSH协议错误。

主机密钥验证问题

当您通过SSH客户端连接到服务器时,服务器尝试使用主机密钥来标识自身。 在主机密钥更改的情况下,您可能会看到如下警告:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
...

在PuTTY,你得到一个同样不祥的警告:

WARNING - POTENTIAL SECURITY BREACH!

The server's host key does not match the one PuTTY has
cached in the registry. This means that either the
Server administrator has changed the host key, or you
...

这个问题的常见原因包括:

  • 从快照或备份重建Droplet
  • 浮动IP移动到另一个Droplet
  • 通过软件包管理器重新安装SSH服务器

要解决这个问题,您可以清除主机密钥

连接已关闭或由对等重置

在某些情况下,在套接字级别建立连接,但在主机密钥验证阶段断开连接。 在PuTTY中,您可能会看到以下错误:

Server Unexpectedly closed network connection

OpenSSH客户端可能会报告:

Connection closed by 111.111.111.111 port 22

可能导致此错误的一些常见问题包括:

  • SSH服务已经崩溃或遇到错误。
  • 由于缺少服务器主机密钥,SSH服务无法初始化连接。

在这种情况下,需要对协议输出进行更全面的检查。 在大多数情况下,您需要通过Web控制台从服务器进行调查。 从那里,您将需要确保该服务当前正在运行绑定到预期的端口

如果服务似乎有效,接下来您应该验证主机密钥是否存在,如果不存在则重新生成

无法与主机谈判

在启动SSH协议时,通过客户机和主机之间协商的密码生成共享密钥。 当有不匹配时,您可能会看到PuTTY中的错误:

Couldn't agree a client-to-server cipher (available: aes128-ctr, aes192-ctr, aes256-ctr)

OpenSSH客户可能会报告:

Unable to negotiate with 111.111.111.111: no matching key exchange method found.
Their offer: diffie-hellman-group1-sha1

可能导致此错误的一些常见问题包括:

  • 您有一个现代的OpenSSH客户端实现和一个不支持与客户端通用密码的旧主机。
  • 您已经自定义您的SSH客户端密码列表,仅允许服务器不支持的选择。

要解决此问题,您需要在SSH客户端自定义支持的密码

解决方案

以下是常见SSH协议错误的一些故障排除方法和解决方案。

从已知主机清除主机密钥

主机密钥通常存储在OpenSSH客户端实现中的~/.ssh/known_hosts文件中。 PuTTY通常将这些存储在Windows注册表( HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys )中。

在PuTTY中,您可以使用对话框选择允许连接并更新注册表。 或者,您可以手动删除该条目。

在OpenSSH客户端上,您可以在~/.ssh/known_hosts文件中找到主机条目,并手动删除它。 另一个选择是使用ssh-keygen命令:

ssh-keygen -R your_server_ip

这将尝试访问并清除known_hosts文件中匹配的主机条目:

# Host 111.111.111.111 found: line 2
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old

然后,您可以尝试正常重新连接到服务器。

检查并重新生成SSH主机密钥

如果您的SSH主机没有自己的私钥来生成共享密钥,则连接将被中止。 要检查它是否这样做,请在/etc/ssh目录中查找一组名为sshd_host_ * _key的文件, sshd_host_ * _key包含相应的.pub文件。

如果没有找到,您需要重新生成它们。 您可以使用ssh-keygen作为rootsudo来执行此操作:

ssh-keygen -A

输出将报告所采取的操作,包括生成的密钥列表:

ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519

然后,您可以尝试正常重新连接到服务器。

自定义支持的SSH密码

当您需要支持已弃用的密码(如SHA1)时,您可以自定义客户机上支持的SSH密码。 这不是一个很常见的问题。 通常情况下,当您使用较新的SSH客户端连接到尚未禁用较弱密码的旧SSH服务器时。

在OpenSSH中,您可以使用命令行上的KexAlgorithms选项来配置SHA1:

openssh -oKexAlgorithms=+diffie-hellman-group1-sha1 root@your_server_ip

PuTTY应该已经在Connection > SSH > Kex 配置中包含了Diffie-Hellman组1选项。

结论

如果您需要进一步帮助您的Droplet建立一个成功的协议,您可以与我们的支持团队打开一张票 确保包括:

  • 用于连接的用户名,主机和端口
  • 您希望使用的身份验证机制
  • 全部输出的错误链接到错误阶段,包括SSH客户端的详细输出
  • 目前为止您从故障排除收集的所有信息
  • 在引用这篇文章时,你不清楚什么

包括所有上述诊断信息,并澄清您在尝试连接时遇到问题的位置,可以帮助我们快速加快您在需要时遇到问题的速度。