更多: zhilu jiaocheng

解决方案

此问题的受支持且正确的解决方案是使主机名/IP 查找成功。
为此,我们可以:

  • 检查 /etc/resolv.conf 中的配置以了解名称解析和 DNS 服务器配置。
  • 如果未定义,则定义新引入的主机/IP 以包含在 DNS 服务器中
  • 如果有问题或者不值得做 DNS 定义(很可能分配是临时的 - 例如:测试系统、临时虚拟机等)确保主机名/IP 地址对包含在源和目标环境中' /etc/hosts 文件(这样更实用)

情况1

# ssh -vvv 10.10.10.205
... ...
debug1: Next authentication method: gssapi-with-mic
debug3: Trying to reverse map address 10.10.10.205.
debug1: Unspecified GSS failure. Minor code may provide more information
No credentials cache found

在 CentOS/RHEL 系统中,SSH 守护进程默认配置为使用通用安全服务应用程序接口 (GSSAPI) 身份验证。
默认情况下,GSSAPI 会查找(通过 DNS 或者基于 /etc/resolv.conf 的其他方式)请求的 IP。
请注意,即使我们使用 IP 地址,查找也会发生。
这是安全/可靠身份验证所必需的。

如果我们查看 SSH 配置联机帮助页:

# man ssh_config
...
GSSAPIAuthentication
     Specifies whether user authentication based on GSSAPI is allowed. The default is no
...

如果 IP/主机没有出现在 /etc/hosts 或者 DNS 数据库中,查找查询超时,因为它重试,最终它放弃并继续打开连接。
在查找过程中花费的时间(50 秒或者更多),直到显示密码提示。
这种停顿只发生在本地 LAN 上的主机上,不在 DNS 或者 /etc/hosts 文件中。
请注意,身份验证方法是 GSSAPI。

使用ssh登录时需要等待一段时间

使用 SSH 连接到不在 DNS/主机中的主机在连接启动时停顿一段时间

ssh、scp 或者 sftp 到未出现在 DNS 或者 /etc/hosts 文件中的节点进行初始连接的速度很慢。
建立连接后,速度符合预期。
有两种情况需要考虑,见下文。
请注意,在大多数环境中,此问题不会发生,因为 IP 将位于 /etc/hosts 或者 DNS 中。

时间花在解析目标/源主机名的 IP 地址或者查找目标/源 IP 地址的主机名和/或者基于完全相同的数据进行身份验证时花费的时间。
当我们将 -vvv 与 ssh 结合使用时,有两种不同的详细症状,构成两种不同的情况。

解决方法

如果没有适当的 DNS/hosts(或者 /etc/resolv.conf 配置),SSH 连接最初会很慢。
这就是 OEL 的预期方式。
或者,可以通过一些配置更改来解决等待情况。

对于案例 1,GSSAPIAuthentication 可能已被禁用。
尽管这是可能的,但强烈建议不要使用 GSSAPI,因为 GSSAPI 是 SSH 提供的基本安全功能之一。
SSH 不仅使通信内容安全,而且可以确保该目标是预期的目标。
那是因为 GSSAPIAuthentication 在 OEL 中设置为 yes(虽然手册页默认情况下说它是“否”,但它是核心 ssh 包的默认值,而不是特定发行版)。
尽管如此,如果我们完全确定自己处于封闭网络上并且知道自己知道自己在做什么,则可以禁用它:

临时设置只是为了看看它是否在命令行上工作:

# ssh -o "GSSAPIAuthentication no" 10.10.10.205

如果情况 1 是情况,密码提示应立即出现。
要永久设置它(尽管有其他建议),我们可以在客户端上通过以下方式之一将 GSSAPIAuthentication 更改为 no:

  1. 在用户的主目录 ssh 配置文件 (~/.ssh/config ) 中添加以下行:
GSSAPIAuthentication no
  1. 在客户端将其添加到系统SSH配置文件中。
    例如:/etc/ssh/ssh_config 和在服务器端。
    编辑服务器端(即我们要连接的系统,在本例中为 10.10.10.205)配置文件 /etc/ssh/sshd_config 并重新启动 sshd:
# service sshd restart

这可以在已经建立 SSH 连接的情况下完成。

对于案例 2,如果我们以某种方式不能/不想更改 DNS 配置或者 /etc/hosts 文件(尽管有其他建议),我们可以通过禁用为 SSH 协议完成的 DNS 查找来解决这种情况。
你可以通过设置来做到

UseDNS no

在服务器 SSH 配置文件 /etc/ssh/sshd_config

并在服务器上重新启动 sshd

# service sshd restart

这可以在连接处于活动状态时完成。

案例二

# ssh -vvv 10.10.10.12
. . . 
debug1: Offering public key: /root/.ssh/id_dsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
--stalls for 8 seconds-

在这里,远程主机试图在客户端节点 IP 上进行 DNS 查找。
它可能是全新的物理机或者虚拟机安装,未在 /etc/hosts 或者 DNS 中更新,因此会在 DNS 查询超时之前停止。
同样,DNS/hosts 查找完成(基于客户端/服务器上的 /etc/resolv.conf)。

日期:2020-09-17 00:14:01 来源:oir作者:oir