Linux SSH登录慢可能由多种原因引起,以下是一些常见的原因及其解决方法:
常见原因
- DNS反向解析问题:SSH在用户登录时会验证IP,使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配登录的IP是否合法。如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很慢。
- 关闭GSSAPI认证:GSSAPI认证在目标机器无域名解析时会有问题,使用strace查看后发现,ssh在验证完key之后,进行authentication gssapi-with-mic,此时先去连接DNS服务器,在这之后会进行其他操作。
- 命令缓存过大:环境变量中配置了HISTFILE,即会将历史执行命令保存到HISTFILE指定的文件中。且HISTFILESIZE设置的过大,ssh登录时会执行bash命令,bash会读取环境变量,并读取历史执行记录到内存,当文件过大时,读取速度会变慢。
- 启动脚本中增加了延时命令:环境上如果有安装一些第三方包,如abrt-console-notification.这个包提供了/etc/profile.d/abrt-console-notification.sh文件,该脚本内执行了timeout 10s abrt status的命令,abrt status异常时会延迟10s,因此ssh登录也会卡顿10s。
- 开启selinux:当sshd启用PAM验证时,当sshd进程校验完用户名密码,调用PAM模块的接口函数do_pam_session()创建PAM session时,PAM模块中会调用selinux_check_access()来进行安全上下文检查,当开启selinux时,可能存在selinux规则变化导致此处校验失败的情况,耗时较长。
解决方法
- 修改sshd配置:
- 禁用DNS反向解析:在目标服务器上修改sshd服务器端配置,将
UseDNS
的值设为no
,并重启ssh服务。 - 禁用GSSAPI认证:修改sshd服务器端配置,将
GSSAPIAuthentication
的值设为no
,并重启ssh服务。
- 优化启动脚本:检查并注释掉启动脚本中的延时命令,如
timeout
命令。 - 调整SELinux设置:如果确定是SELinux导致的问题,可以考虑调整SELinux的策略或临时关闭SELinux进行测试。
- 检查网络设置:检查本地网络连接是否正常,尝试更换网络环境,如切换到其他WiFi或使用有线连接。
- 使用更快的DNS服务器:检查本地DNS设置,尝试更换DNS服务器,如使用公共DNS(8.8.8.8或8.8.4.4)。
通过上述方法,通常可以有效解决Linux SSH登录慢的问题。如果问题仍然存在,建议进一步分析日志文件以获取更多详细信息。