一、前言
有时候我们会发现ssh连接很慢,甚至某些客户端如果超时时间比较短的话会直接连不上。比如我们发现在欧拉系统下,我们监控程序的埋点操作总是失败(埋点的本质操作就是把监控程序Prometheus的exporter通过sftp传输到目标服务器,并且通过远程ssh解压部署),通过日志回溯我们可以发现ssh连接的过程中出现了问题,提示“认证失败”。
上面的问题,在我确定了连接信息和连接链路正常的情况下,我观察到一个现象,即在连接检测的过程中返回时间很长。这个事情启发我,可能是ssh建立连接过程太长超时导致的。
根据实践,一般影响ssh登录速度比较严重的因素主要有两个,DNS解析和GSSAPI认证
。这里涉及一些ssh认证的小知识:
关于DNS解析:UseDNS特性是SSH服务的安全增强特性,有些国产操作系统默认开启。开启后,服务端会先根据客户端IP进行DNS PTR反向查询,得到客户端主机名。再根据得到的客户端主机名进行DNS正向A记录查询,最后比对得到的IP与原始IP是否一致,用于防止客户端欺骗。
通常情况下,客户端使用的是动态IP,没有相应的PTR记录(或者直接使用IP连接,DNS也无法解析到PTR)。所以,该特性开启后,不仅无法用于信息比对,反而由于相关查询操作增加了操作延迟,最终导致客户端连接速度变慢。
关于GSSAPI:一般 SSH 依次进行的认证方法的是 publickey, gssapi-keyex, gssapi-with-mic, password, 这个可以通过ssh -v
开启 debug 模式在连接日志看到。很多情况下用户只使用 password 认证方式,但前面 3 个认证过程系统还是会尝试,这就浪费时间了,也就造成 SSH 登录慢。
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。 其最主要也是著名的实现是基于 Kerberos 的,一般说到 GSSAPI 都暗指 Kerberos 实现。 首先是Kerberos认证过程比较复杂,需要客户端和服务端之间多次交互来验证身份,所以认证会比较慢一些。其次是不同的SSH客户端实现GSSAPI支持的程度不同,有些客户端的GSSAPI实现不太优化,连接速度会比较慢。如果叠加上面第一个原因,那将惨不忍睹。
二、解决方式
我们可以直接关闭这两个设置配置如下:
|
|