最近发现通过ssh连接服务器非常缓慢,要等上近30秒才能连上,对于追求效率的人而言,这是不能忍的。于是进入分析模式,首先要排查是不是网路的问题:
PING 172.18.50.184 (172.18.50.184) 56(84) bytes of data.
64 bytes from 172.18.50.184: icmp_seq=1 ttl=64 time=0.732 ms
64 bytes from 172.18.50.184: icmp_seq=2 ttl=64 time=1.08 ms
64 bytes from 172.18.50.184: icmp_seq=3 ttl=64 time=0.603 ms
从ping出来的结果来看,网络很正常,没有丢包的问题。既然不是网络问题,那么是什么原因导致connect缓慢呢?
ssh的连接过程是这样的:
读取本地的公钥,包括
id_rsa,id_rsa-cert
等发起连接服务器
根据sshd返回的信息判断可以通过哪些方式授权认证
逐一尝试认证,如果无法认证成功则提示失败
既然网络没有问题,那么就是在验证那里出来问题,输入以下指令:ssh -v lingxuan@172.18.50.184
发现支持公钥和gssapi认证Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
GSSAPI:Generic Security Services Application Program Interface,GSSAPI本身是一套API,由IETF标准化。其最主要也是著名的实现是基于Kerberos的。一般说到GSSAPI都暗指Kerberos实现。详细可以查阅:https://en.wikipedia.org/wiki...
一般而言我们都不用gssapi认证,所以把它禁用掉吧。
可以通过两种方式:
ssh -o GSSAPIAuthentication=no lingxuan@172.18.50.184
或者直接到服务器的/etc/ssh/sshd_config
中设置GSSAPIAuthentication=no
,不要忘记重启sshd服务哦。
但是遗憾的是即使禁用了gssapi认证还是很慢,看来也不是认证的问题,那么究竟是什么问题呢???
毫无头绪的情况下只能使用神器strace ( 详细使用可以参考:http://linuxtools-rst.readthe... )来定位问题了。
首先在服务端找到sshd的PID
ps -ef | grep sshd
PID是7794
然后输入
strace -ff -p 7794
然后在客户端连接,此时服务端上回打印出连接时服务端的全部过程,发现在一个connect耗了很长时间,而连接的是DNS服务器:172.10.50.2,似乎找到问题所在了,ping 172.10.50.2
居然ping不通,说明这个DNS服务已经挂了,修改DNS服务器后问题解决。
sudo vim /etc/resolv.conf
如果不想修改DNS服务器,那么可以直接在sshd上禁用DNS查询:
useDNS=no
以上就是解决问题的全过程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。