当我连接到网络上的服务器时,大约需要 10 秒钟才能收到密码提示。当我连接到另一台服务器(例如 GitHub)时,响应非常快。
经过一番研究,似乎服务器响应缓慢的罪魁祸首是反向 DNS 和 GSSAPI 功能。我在服务器上分别禁用了这两项功能,但这两种更改都无法改善情况。
$ ssh -v <hostname>
<a bunch of stuff about reading configs, connecting and reading key files>
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.3
<a long wait - 5-10 seconds>
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5* compat 0x0c000000
<many more messages, get to login very quickly>
使用相同 OpenSSH 5.3 的两台服务器之间的连接也能快速进行。
基于上述情况,我认为存在某种协议协商。我理解正确吗?我可以强制特定客户端或服务器使用某种协议来加快服务器响应时间吗?
答案1
看来我的问题不是由于 SSH,而是由于 tcp_wrappers 规则处理导致的延迟。感谢 @BillThor 的评论,它为我指明了正确的方向。使用 %u 替换(或 user@host 规则)会导致 tcp 包装器尝试向客户端计算机发出 IDENT/auth 请求,以尝试获取连接人员的用户名。在我的例子中,客户端上没有服务器,因此 tcp 包装器等待请求超时,然后才继续允许连接。
当我尝试获取有关服务器端发生的事件的更多详细信息时,我发现问题不在于 SSH。
首先,我使用 登录到服务器ssh -L 8080:localhost:8080 <hostname>
。这将通过 SSH 连接创建一个隧道,将我机器上的端口 8080 转发到服务器上的 8080。
接下来,我以调试模式启动了第二个 SSH 服务器,监听端口 8080:。sudo /usr/sbin/sshd -d -p 8080
登录到我的调试服务器时,一切都很顺利,而且很快!
答案2
正如您所说,通常这种错误是由于 DNS 查找和 GSSAPI 功能造成的。
由于过去遇到过同样的问题,我建议检查语法以禁用这些功能,因为语法可能会因操作系统而异。
例如,LookupClientHostnames=否适用于某些 Solaris 版本。还有/etc/hosts有帮助。