为什么我的SSH登录速度慢?


95

我在SSH登录中看到延迟。具体来说,我在2个位置看到从瞬时到几秒延迟的范围。

  1. 在发出ssh命令和获得登录提示之间,以及
  2. 在输入密码和加载外壳之间

现在,特别是我仅在这里查看ssh详细信息。显然,网络延迟,所涉及的硬件和OS的速度,复杂的登录脚本等都可能导致延迟。对于上下文,我使用大量Ubuntu和CentOS和MacOS X作为客户端系统,使用大量Linux发行版和一些Solaris主机。几乎所有时间,ssh服务器配置都与操作系统的默认设置保持不变。

我应该对哪些ssh服务器配置感兴趣?是否有可以调整的OS /内核参数?登录shell的技巧?等等?


您在使用本地帐户吗?-有时我发现pam身份验证会增加使用ssh登录的延迟
Sirex

通常是本地帐户。有时是NIS。
彼得·里昂斯

Answers:


122

尝试将设置UseDNSnoin /etc/sshd_config/etc/ssh/sshd_config


7
+1是ssh登录时最常见的延迟原因
matthias krull 2010年

2
“ Solaris 11注意:我在Solaris 11上尝试了UseDNS no设置,它破坏了服务启动。服务不完全是友好的响应。YMMV与其他* Nix变体一起出现,但是UseDNS no似乎不是Solaris 11中的有效选项。 。”
-Keith

3
我对使用IP地址(家庭局域网)登录时表示怀疑,但此解决方案解决了我的问题。为了Google的缘故,尽管延迟是在紧随其后发生的,但与“ key:/home/mylogin/.ssh/id_ecdsa((nil))”消息(运行时ssh -vvv)无关。
Skippy le Grand Gourou 2014年

2
+1使其明确,即文件/etc/ssh/sshd_config!我加入进来/etc/sshd_config,没有发现任何区别!
vyom 2014年

1
@SkippyleGrandGourou:某些Solaris版本使用的是经过修改的OpenSSH,称为SunSSH,它具有一些令人讨厌的不兼容性。Solaris 11.3重新添加了OpenSSH,SunSSH最终将被删除...
Gert van den Berg

37

当我在ssh -vvv性能类似的慢速服务器上运行时,在这里看到一个挂起:

debug1: Next authentication method: gssapi-with-mic

通过编辑/etc/ssh/ssh_config和注释掉该身份验证方法,我使登录性能恢复了正常。这是我在/etc/ssh/ssh_config服务器上拥有的内容:

GSSAPIAuthentication no

您可以在服务器上进行全局设置,因此它不接受GSSAPI进行身份验证。只需添加GSSAPIAuthentication no/etc/ssh/sshd_config服务器上,然后重新启动服务即可。


配置winbind / ad登录后,我发现RHEL5服务器就是这种情况。
乍得

这对我在Ubuntu 14.04服务器上有效。
Penghe Geng

对于CentOS 7,需要同时设置GSSAPIAuthentication noUseDNS no/etc/ssh/sshd_config文件中。
Sunry

19

对我而言,罪魁祸首是IPv6分辨率,它正在超时。(我想是我的主机提供商的DNS设置错误。)我通过这样做发现了这一点ssh -v,表明哪一步挂了。

解决方案是ssh使用以下-4选项:

ssh -4 me@myserver.com


2
我怀疑随着时间的流逝,越来越多的事情(很糟糕)逐渐适应IPV6,我们中越来越多的人会看到这种情况。谢谢!
sage 2016年

1
...并且,如果没有确认此问题的调试消息,此答案将无济于事。
EP

根据我的经验,当SSH在双栈接口上侦听时,这是一个非常普遍的问题,这是我登录时首先要检查的问题,但所花费的时间比预期的多。
Mogget

我们是否有可能修复IPv6而不是默认使用IPv4?
msrd0

这可能是UseDNS无答案有效的原因。使用-vvv仅显示它毫无错误地暂停debug2: resolving "thing.net.au" port 22,但是对于-4则不会发生,这表明它是DNS IPv6问题。
pmc

16

使用systemd,登录可能会在某些升级后与登录的dbus通信挂起,那么您需要重新启动登录的

systemctl restart systemd-logind

在debian 8,arch linx和suse列表上看到了


1
哦,哇,这才是罪魁祸首!谢谢一群!
mahatmanich

我也是。花了一段时间先排除所有可能的DNS和SSH问题。注意:如果此问题也适用于慢速sudo,请首先尝试执行此操作。
迈克尔(Michael)

我刚刚完成了一些从RHEL6到RHEL7的就地升级,并注意到了这个问题。这个答案也解决了我的问题。
user53029

非常感谢,它就像是一种魅力。
博南

9

您始终可以从显示当前正在执行的操作ssh-v选项开始。

$ ssh -v you@host

根据您提供的信息,我只能建议一些客户端配置:

  • 由于您是在手动输入密码,因此建议您尽可能使用公钥身份验证。这消除了您的速度瓶颈。

  • 您还可以使用禁用X转发-x和进行身份验证转发-a(默认情况下可能已禁用这些功能)。如果客户端需要为ssh命令启动X服务器(例如在OS X下),则特别禁用X转发可以大大提高速度。

其他所有事情实际上都取决于您在何时何地遇到什么样的延迟。


有关详细程度的好提示,也可以通过增加v来增加它。最多3个IIRC。
vtest 2010年

7

关于2.点,这是不需要修改服务器或不需要具有root / administrative特权的答案。

您需要编辑“用户ssh_config”文件,该文件为:

vi $HOME/.ssh/config

(注意:如果目录$ HOME / .ssh不存在,则必须创建该目录)

并添加:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

您可以根据需要按主机进行此操作:)例如:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

确保IP地址与您的服务器IP相匹配。一个很酷的优点是,现在ssh将为该服务器提供自动完成功能。因此,您可以输入ssh lin+ Tab,并且应该自动完成ssh linux-srv



2

除了已经提到的DNS问题之外,如果您将ssh放入具有许多NFS挂载的服务器中,则密码和提示之间可能会有延迟,因为该quota命令会在未使用挂载的所有文件系统上检查您的使用情况/配额noquota。在Solaris系统上,您可以在默认情况下看到它,/etc/profile并通过运行跳过它touch $HOME/.hushlogin


1

干得好

# uname -a
SunOS oi-san-01 5.11 oi_151a3 i86pc i386 i86pc Solaris
# ssh -V
Sun_SSH_1.5, SSH protocols 1.5/2.0, OpenSSL 0x009080ff
# echo "GSSAPIAuthentication no" >> /etc/ssh/sshd_config
# echo "LookupClientHostnames no" >> /etc/ssh/sshd_config
# svcadm restart ssh

UseDNS no不适用于OpenIndiana!

阅读“ man sshd_config”以获取所有选项

如果您的服务器无法解析,则为“ LookupClientHostnames no”


1

如果以上答案均无效,并且您遇到dns反向查找问题,则还可以检查nscd(name service cache daemon)是否已安装并正在运行。

如果这是问题所在,那是因为您没有dns缓存,并且每次查询不在主机文件中的主机名时,都会将问题发送到名称服务器,而不是在缓存中查找

我尝试了上述所有选项,唯一可行的更改是start nscd

您还应该验证命令以使DNS查询解析/etc/nsswitch.conf首先使用主机文件。


1

这可能仅特定于Debian / Ubuntu OpenSSH,其中包括由Debian软件包维护者之一编写的user-group-modes.patch。如果只有一个用户的gid与文件的gid相同,则此修补程序允许〜/ .ssh文件将组可写位设置为(g + w)。修补程序的secure_permissions()函数将执行此检查。检查的阶段之一是使用getpwent()浏览每个passwd条目,并将条目的gid与文件的gid进行比较。

在具有许多条目和/或较慢的NIS / LDAP身份验证的系统上,此检查将很慢。nscd不会缓存getpwent()调用,因此,如果服务器不是本地服务器,则将通过网络读取每个passwd条目。在我发现的系统上,每次调用ssh或登录系统大约要花4秒的时间。

解决方法是通过执行删除〜/ .ssh中所有文件上的可写位chmod g-w ~/.ssh/*


1

我发现重新启动systemd-logind.service仅能解决该问题几个小时。在sshd_config中将UsePAM从yes更改为no将导致快速登录,尽管不再显示motd。有关安全问题的评论?


我在这里经历了其他所有建议,这是唯一在我的Samba4支持服务器上解决此问题的方法……谢谢!
迪文·菲利普斯

警告:Red Hat Enterprise Linux中不支持“ UsePAM no”,这可能会导致一些问题。
bbaassssiiee

1

要完成所有表明DNS解析会减慢ssh登录速度的答案,有时会缺少防火墙规则。例如,如果您默认删除所有INPUT拼花

iptables -t filter -P INPUT DROP

那么您将必须接受ssh端口和DNS请求的输入

iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

1

ssh -vvv 连接真的很好,直到它挂在系统上以尝试使终端至少20秒:

debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
... waiting ... waiting ... waiting

systemctl restart systemd-logind 服务器上做完一个之后我又有了即时连接!

这是在debian8上!因此,systemd是这里的问题!

注意: Bastien Durel已经为这个问题提供了答案,但是它缺少调试信息。我希望这对某人有帮助。


我曾与“进入互动环节”挂在RHEL7同一个问题(CentOS的7),并通过注释掉解决它session [default=1] pam_lastlog.so nowtmp showfailed/etc/pam.d/postlogin。在基于容器的OpenVZ VPS上,显然更新lastlog文件的速度非常慢。
贾斯汀·

1

我最近发现了ssh登录缓慢的另一个原因。

即使您输入UseDNS no/etc/sshd_config,sshd仍然可以执行反向DNS查找,即使/etc/hosts.deny输入如下:

nnn-nnn-nnn-nnn.rev.some.domain.com

如果您在系统中安装了DenyHosts,则可能会发生这种情况。

如果有人知道如何使DenyHosts避免将此类条目放入,那就太好了/etc/hosts.deny

这是DenyHosts常见问题解答的链接,该链接说明了如何从其中删除条目/etc/hosts.deny-请参阅如何删除DenyHosts阻止的IP地址?


1

我们可能会发现首选的名称解析方法不是主机文件,而是DNS。

例如,这将是通常的配置:

[root@LINUX1 ~]# cat /etc/nsswitch.conf|grep hosts
#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

首先,到达主机文件(选项:文件),然后到达DNS(选项:dns),但是我们发现已经添加了另一个无法运行的名称解析系统,这导致我们尝试进行反向解析的速度很慢。

如果名称解析顺序不正确,则可以在以下位置进行更改: /etc/nsswitch.conf

摘自:http : //www.sysadmit.com/2017/07/linux-ssh-login-lento.html


1

我尝试了所有答案,但没有一个起作用。最终我发现了我的问题:

首先我运行,sudo tail -f /var/log/auth.log 所以我可以看到ssh的日志,然后在另一个会话中运行ssh 172.16.111.166并注意到等待

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

搜索后,我在/ etc / ssd / ssh_config中找到了这一行

ProxyCommand /usr/bin/sss_ssh_knownhostsproxy -p %p %h

我评论了,延迟消失了


1

注意:本教程起初是“如何调试”的教程,但最终成为在Ubuntu 16.04 LTS服务器上对我有帮助的解决方案。

TLDR:运行landscape-sysinfo并检查该命令是否需要很长时间才能完成;这是新SSH登录名上的系统信息打印输出。请注意,该命令并非在所有系统上都可用,landscape-common软件包会安装它。(“等等,还有更多……”)


在有问题的计算机上的另一个端口上启动第二个ssh服务器,以调试模式进行操作,这不会使其分叉,并且会打印出调试消息:

sudo /usr/sbin/sshd -ddd -p 44321

以详细模式从另一台计算机连接到该服务器:

ssh -vvv -p 44321 username@server

我的客户在开始睡觉之前就输出以下行:

debug1: Entering interactive session.
debug1: pledge: network

谷歌搜索并没有真正的帮助,但是服务器日志更好:

debug3: mm_send_keystate: Finished sending state [preauth]
debug1: monitor_read_log: child log fd closed
debug1: PAM: establishing credentials
debug3: PAM: opening session
---- Pauses here ----
debug3: PAM: sshpam_store_conv called with 1 messages
User child is on pid 28051

我注意到,当我改变UsePAM yesUsePAM no那么这个问题解决了。

不相关UseDNS或任何其他设置,仅UsePAM会影响我的系统上的此问题。

我不知道为什么,我也不会离开UsePAMno,因为我不知道哪个副作用,但是这让我继续调查。

因此,请不要以为这是答案,而是开始找出问题所在的第一步。


所以,我继续调查,跑sshdstracesudo strace /usr/sbin/sshd -ddd -p 44321)。这产生了以下内容:

sendto(4, "<87>Nov 20 20:35:21 sshd[2234]: "..., 110, MSG_NOSIGNAL, NULL, 0) = 110
close(5)                                = 0
stat("/etc/update-motd.d", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
umask(022)                              = 02
rt_sigaction(SIGINT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7ffde6152d2c) = 2385
wait4(2385, # BLOCKS RIGHT HERE, BEFORE THE REST IS PRINTED OUT # [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2385

该行/etc/update-motd.d让我感到怀疑,显然,该过程正在等待所包含内容的结果。/etc/update-motd.d

因此,我cd进入/etc/update-motd.d并运行了一个sudo chmod -x *命令,以禁止PAM运行所有生成此dynamic的文件Message Of The Day,其中包括系统负载以及是否需要升级软件包,从而解决了该问题。

这是一台基于“节能” N3150 CPU的服务器,它有很多工作要做24/7,所以我认为收集所有这些motd数据实在太繁琐了。

我可能会开始有选择地启用该文件夹中的脚本,以查看有害程度较小的脚本,但是特别地调用landscape-sysinfo非常慢,并且50-landscape-sysinfo确实会调用该命令。我认为这是造成最大拖延的原因。

重新启用大多数的文件,我得出的结论是, 50-landscape-sysinfo99-esm是我的烦恼的原因。50-landscape-sysinfo执行大约需要5秒钟,99-esm大约3秒钟。所有剩余的文件总共约2秒。

无论是50-landscape-sysinfo99-esm是至关重要的。50-landscape-sysinfo打印出有趣的系统统计信息(如果空间不足,也可以99-esm打印!),并打印出与Ubuntu Extended Security Maintenance

最后,您可以使用创建脚本echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.sh并根据要求获取该打印输出。


1

这个线程已经提供了很多解决方案,但是这里没有给出我的=)。就是这样 我的问题(花了大约1分钟的时间ssh登录到我的树莓派)是由于损坏的.bash_history文件所致。由于文件是在登录时读取的,因此导致登录延迟。删除文件后,登录时间恢复到正常状态,就像瞬间一样。

希望这会对其他人有所帮助。


0

对我来说,我需要GSSAPI,并且我不想关闭反向DNS查找。这似乎不是一个好主意,所以我检查了主页resolv.conf。事实证明,我与通过SSH进行连接的服务器之间的防火墙正在干扰DNS请求,因为它们的格式不是防火墙所期望的。最后,我要做的就是将这行添加到我要SSH连接到的服务器上的resolv.conf中:

options single-request-reopen


0

值得注意的是,CentOS 7上的bind软件包更新中断了命名,现在在日志中指出/etc/named.conf存在权限问题。它在0640上运行了好几个月,现在它需要0644。这很有意义,因为命名守护进程属于“命名”用户。

命名失败后,从ssh登录到本地Web服务器的页面服务,缓慢的LAMP应用等的所有工作都很缓慢,这很可能是因为在查找配置的外部,辅助DNS之前,每个请求都会在失效的本地服务器上超时。


0

对我来说,我的本地/etc/hosts文件中有一个问题。因此ssh尝试使用两个永久超时的不同IP(一个错误)。

使用ssh -v这里的技巧:

$ ssh -vvv remotesrv
OpenSSH_6.7p1 Debian-5, OpenSSL 1.0.1k 8 Jan 2015
debug1: Reading configuration data /home/mathieu/.ssh/config
debug1: /home/mathieu/.ssh/config line 60: Applying options for remotesrv
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to remotesrv [192.168.0.10] port 22.
debug1: connect to address 192.168.0.10 port 22: Connection timed out
debug1: Connecting to remotesrv [192.168.0.26] port 22.
debug1: Connection established.

/etc/hosts服务器?
Daniel F
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.