合 Linux中使用ssh连接服务器很慢的几种情况
情况1:GSSAPI问题
现象
在局域网内,能ping通目标机器,并且时延是微秒级。
用ssh连局域网内其他linux机器,会等待10-30秒才有提示输入密码。严重影响工作效率。
分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | [oracle@mis ~]$ ssh root@192.168.242.24 -v OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Applying options for * debug1: Connecting to 192.168.242.24 [192.168.242.24] port 22. debug1: Connection established. debug1: identity file /home/oracle/.ssh/identity type -1 debug1: identity file /home/oracle/.ssh/id_rsa type 1 debug1: identity file /home/oracle/.ssh/id_dsa type -1 debug1: loaded 3 keys debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4 debug1: match: OpenSSH_7.4 pat OpenSSH* debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_4.3 debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-sha1 none debug1: kex: client->server aes128-ctr hmac-sha1 none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<2048<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug1: Host '192.168.242.24' is known and matches the RSA host key. debug1: Found key in /home/oracle/.ssh/known_hosts:3 debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Next authentication method: gssapi-with-mic debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found debug1: Next authentication method: publickey debug1: Trying private key: /home/oracle/.ssh/identity debug1: Offering public key: /home/oracle/.ssh/id_rsa debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Trying private key: /home/oracle/.ssh/id_dsa debug1: Next authentication method: password root@192.168.242.24's password: |
正是从gssapi-with-mic这一行开始,开始耗时间。
GSSAPI ( Generic Security Services Application Programming Interface) 是一套类似Kerberos 5 的通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。但该接口在目标机器无域名解析时会有问题。GSSAPI本身是一套API,由IETF标准化。其最主要也是著名的实现是基于Kerberos的。一般说到GSSAPI都暗指Kerberos实现。
UseDNS:是OpenSSH服务器上的一个DNS查找选项,而且默认还是打开的,在打开的状态下,每当客户端尝试连接OpenSSH服务器的时候,服务端就自动根据用户客户端的IP进行DNS PTR反向查询(IP反向解析才会有记录),查询出IP对应的Hostname,之后在根据客户端的Hostname进行DNS正向A记录查询。通过这个查询,验证IP是否和连接的客户端IP一致。但绝大部分我们的机器是动态获取IP的,也就是说,这个选项对于这种情况根本就没用——即使是普通静态IP服务器,只要没有做IP反向解析,也难以适用。如果你符合这些情况,建议关闭UseDNS以提高SSH远程登录时候的认证速度。
解决
除了常见的useDNS配置可能导致ssh登陆慢之外,还有一个配置GSSAPIAuthentication也会导致登陆慢,该配置项的含义是允许GSSAPI认证,属于ssh协议的一种认证方式。ssh协议有多种认证方式,平时常用的有密码认证、公钥认证等,但ssh协议支持的远不止这两种,那么至于一次ssh登陆到底用哪种认证方式是怎么决定的呢?这个取决于ssh的客户端和服务端的协商的结果,ssh服务端决定了支持哪些登陆方式。在登陆过程中经常协商之后有个认证的顺序,然后依次选择认证方式,直到认证成功(登录方式可以通过ssh命令行中可以通过增加 -vvv
选项来打印整个登陆的过程的debug日志),我们不需要关心GSSAPI认证到底是什么鬼,只需关心为什么允许了GSSAPI认证就会导致ssh登陆慢呢?从debug信息很难看出来,还是通过抓包来看。通过抓包,同样也发现有大量的DNS反向域名解析的报文,但这次需要解析的是服务端的IP,同样由于客户端侧配置的DNS服务器不可达,导致超时重试多次。结合ssh登陆的过程日志,不难发现这写DNS反向域名解析的报文是GSSAPI认证需要的。
那么解决该问题就比较简单了,下面任何一种都可:
- ssh 客户端配置(
/etc/ssh/ssh_config
)将GSSAPIAuthentication
设为 no - ssh 服务端配置(
/etc/ssh/sshd_config
)将GSSAPIAuthentication
设为 no - ssh 客户端正确配置 DNS 服务器(
/etc/resolv.conf
) - ssh 客户端 hosts 文件(
/etc/hosts
)增加服务端的IP、主机名对应关系
方式一:
修改本地机器的hosts文件,将目标机器的IP和域名加上去。或者让本机的DNS 服务器能解析目标地址。
1 2 3 | vi /etc/hosts 192.168.242.24 ourdev |
其格式是“目标机器IP 目标机器名称”这种方法促效。没有延迟就连上了。不过如果给每台都加一个域名解析,挺辛苦的。但在windows下用putty或secure-crt时可以采用这种方法。
方式二:
修改本机的客户端配置文件ssh_config,注意,不是sshd_config,修改“GSSAPIAuthentication yes”为“GSSAPIAuthentication no”,如下:
1 | sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/ssh_config |
再连目标机器,速度就飞快了。
另外,若不能修改参数,则可以直接使用如下命令连接:
1 | ssh -o GSSAPIAuthentication=no ssh root@192.168.242.24 |
或者:
1 2 3 | cat >>~/.ssh/config<<EOF GSSAPIAuthentication no EOF |
如果你是在Windows下使用PuTTY这样的客户端工具,就不使用上面这个方法了,PuTTY下可以尝试在连接之前进行设置:
PuTTY Configuration -> Connection -> SSH -> Auth -> GSSAPI -> (取消勾选)Attempt GSSAPI authentication(SSH-2 only)
情况2:DNS问题
现象: