Perché il mio accesso SSH è lento?


95

Riscontro ritardi negli accessi SSH. In particolare, ci sono 2 punti in cui vedo un intervallo da ritardi istantanei a più secondi.

  1. Tra emettere il comando ssh e ottenere un prompt di accesso e
  2. tra l'inserimento della passphrase e il caricamento della shell

Ora, in particolare, sto guardando i dettagli ssh solo qui. Ovviamente latenza di rete, velocità dell'hardware e dei sistemi operativi coinvolti, script di accesso complessi, ecc. Possono causare ritardi. Per il contesto ho usato una vasta moltitudine di distribuzioni Linux e alcuni host Solaris usando principalmente Ubuntu, CentOS e MacOS X come sistemi client. Quasi sempre, la configurazione del server ssh è invariata rispetto alle impostazioni predefinite del sistema operativo.

A quali configurazioni di server ssh dovrei essere interessato? Esistono parametri OS / kernel che possono essere regolati? Trucchi della shell di accesso? Eccetera?


stai usando account locali? - a volte trovo che l'autenticazione pam possa aggiungere un ritardo all'accesso con ssh
Sirex,

Di solito conti locali. A volte NIS.
Peter Lyons,

Risposte:


122

Prova a impostare UseDNSsu noin /etc/sshd_configo /etc/ssh/sshd_config.


7
+1 che è la causa più comune di ritardo durante l'accesso a ssh
matthias krull

2
"Nota Solaris 11: ho provato a utilizzare UseDNS su Solaris 11 e non ha funzionato correttamente. Avvio del servizio. Non esattamente una risposta amichevole da parte del servizio. YMMV con altre varianti * Nix ma sembra che UseDNS no non sia un'opzione valida in Solaris 11 ". - commento di Keith Hoffman
Sathyajith Bhat

3
Ero scettico mentre utilizzo per accedere utilizzando l'indirizzo IP (LAN di casa), ma questa soluzione ha risolto il mio problema. Per l'amor di Google, anche se si stava verificando subito dopo, il ritardo non aveva nulla a che fare con il messaggio "key: /home/mylogin/.ssh/id_ecdsa ((nil))" (quando in esecuzione ssh -vvv).
Skippy le Grand Gourou,

2
+1 per renderlo esplicito, il file /etc/ssh/sshd_config! Stavo aggiungendo /etc/sshd_confige non vedevo alcuna differenza !!
vyom,

1
@SkippyleGrandGourou: Alcune versioni di Solaris utilizzavano un OpenSSH modificato, chiamato SunSSH, che presentava alcune fastidiose incompatibilità. Solaris 11.3 aggiunge OpenSSH indietro e SunSSH alla fine verrà rimosso ...
Gert van den Berg

37

Quando ho eseguito ssh -vvvsu un server con prestazioni lente simili ho visto un blocco qui:

debug1: Next authentication method: gssapi-with-mic

Modificando /etc/ssh/ssh_confige commentando quel metodo di autenticazione ho riportato le prestazioni di accesso alla normalità. Ecco cosa ho nel mio /etc/ssh/ssh_configsul server:

GSSAPIAuthentication no

Puoi impostarlo a livello globale sul server, quindi non accetta GSSAPI per l'autenticazione. Basta aggiungere GSSAPIAuthentication noal /etc/ssh/sshd_configsul server e riavviare il servizio.


Ho scoperto che questo è il caso con i miei server RHEL5 una volta configurati gli accessi winbind / annuncio.
Chad,

Questo funziona per me su un server Ubuntu 14.04.
Penghe Geng

Per CentOS 7, è necessario impostare entrambi GSSAPIAuthentication noe UseDNS nonel /etc/ssh/sshd_configfile.
Sunry il

19

Per me, il colpevole era la risoluzione IPv6, stava scadendo. (Immagino che DNS non sia corretto presso il mio provider host, immagino.) L'ho scoperto facendo ssh -v, che ha mostrato quale passaggio era sospeso.

La soluzione è sshcon l' -4opzione:

ssh -4 me@myserver.com


2
Ho il sospetto che sempre più di noi vedranno questo con il passare del tempo e le cose (male e) accolgono lentamente IPV6. Grazie!
salvia il

1
... e questa risposta è particolarmente inutile senza il messaggio di debug che conferma questo è il problema.
EP

È la mia esperienza che questo è un problema molto comune quando SSH è in ascolto su interfacce dualstack e la prima cosa che controllo quando riesco ad accedere, ma richiede più tempo del previsto.
Mogget,

C'è qualche possibilità che possiamo correggere IPv6 piuttosto che passare a IPv4?
msrd0,

Questo è probabilmente il motivo per cui UseDNS nessuna risposta funziona. l'utilizzo di -vvv mostra solo la pausa debug2: resolving "thing.net.au" port 22senza errori, ma ciò non accade con -4, indicando che si tratta di un problema DNS IPv6.
pmc

16

Con systemd, l'accesso potrebbe bloccarsi sulla comunicazione dbus con logind dopo alcuni aggiornamenti, quindi è necessario riavviare logind

systemctl restart systemd-logind

L'ho visto su debian 8, arch linx e su un elenco di suse


1
Oh wow, ora quello era il colpevole! Grazie mille!
Mahatmanich,

Stessa cosa per me. Ci è voluto un po 'per escludere prima tutti i possibili problemi DNS e SSH. Nota: se il problema riguarda anche il sudo lento, provare prima.
Michael,

Ho appena completato alcuni aggiornamenti sul posto da RHEL6 a RHEL7 e ho notato questo problema. Questa risposta ha anche risolto il mio problema.
user53029

grazie mille, funziona come un fascino.
Nam Nam

9

Puoi sempre iniziare sshcon l' -vopzione che mostra cosa si sta facendo al momento.

$ ssh -v you@host

Con le informazioni fornite, posso solo suggerire alcune configurazioni lato client:

  • Dato che scrivi che stai inserendo le password manualmente, ti suggerisco di utilizzare l'autenticazione con chiave pubblica, se possibile. Questo ti rimuove come un collo di bottiglia della velocità.

  • Puoi anche disabilitare X-forwarding con -xe forwarding di autenticazione con -a(questi potrebbero essere già disabilitati di default). In particolare, disabilitare l'X-forwarding può darti un grande miglioramento della velocità se il tuo client deve avviare un X-server per il sshcomando (ad es. Sotto OS X).

Tutto il resto dipende davvero da quali tipi di ritardi si verificano dove e quando.


Un buon suggerimento sulla verbosità, puoi anche aumentarlo avendo più v. Fino a 3 IIRC.
vtest,

7

Per quanto riguarda il punto 2., ecco una risposta che non richiede la modifica del server né i privilegi di amministratore / root.

Devi modificare il tuo file "user ssh_config" che è:

vi $HOME/.ssh/config

(Nota: è necessario creare la directory $ HOME / .ssh se non esiste)

E aggiungi:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

È possibile farlo su base host se richiesto :) esempio:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Assicurarsi che l'indirizzo IP corrisponda all'IP del server. Un grande vantaggio è che ora ssh fornirà il completamento automatico per questo server. Quindi puoi digitare ssh lin+ Tabe dovrebbe essere completato automaticamente ssh linux-srv.


4

Verificare /etc/resolv.confsul server per assicurarsi che il server DNS, elencato in questo file, funzioni correttamente ed eliminare qualsiasi DNS non funzionante.

A volte è molto utile.


2

Oltre ai problemi DNS già menzionati, se stai inserendo un server con molti montaggi NFS, potrebbe esserci un ritardo tra password e prompt poiché il quotacomando controlla il tuo utilizzo / quota su tutti i filesystem non montati con noquota. Sui sistemi Solaris, è possibile visualizzarlo come predefinito /etc/profilee saltare eseguendolo touch $HOME/.hushlogin .


1

Funziona bene.

# 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 non funziona con OpenIndiana !!!

Leggi "man sshd_config" per tutte le opzioni

"LookupClientHostnames no" se il tuo server non è in grado di risolvere


1

Se nessuna delle risposte precedenti funziona e stai riscontrando problemi di ricerca inversa DNS, puoi anche verificare se nscd(daemon cache del servizio nomi) è installato e in esecuzione.

Se questo è il problema è perché non hai cache dns e ogni volta che richiedi un nome host che non si trova sul tuo file host, invii la domanda al tuo server dei nomi invece di cercare nella cache

Ho provato tutte le opzioni di cui sopra e l'unica modifica che ha funzionato è stata l'avvio nscd.

È inoltre necessario verificare l'ordine in cui effettuare la risoluzione della query DNS /etc/nsswitch.confper utilizzare prima il file hosts.


1

Questo è probabilmente specifico solo per Debian / Ubuntu OpenSSH, che include user-group-modes.patch scritto da uno dei manutentori del pacchetto Debian. Questa patch consente ai file ~ / .ssh di impostare il bit scrivibile di gruppo impostato (g + w) se esiste un solo utente con lo stesso gid del file. La funzione secure_permissions () della patch esegue questo controllo. Una delle fasi del controllo consiste nel passare attraverso ciascuna voce passwd usando getpwent () e confrontare il gid della voce con il gid del file.

Su un sistema con molte voci e / o autenticazione NIS / LDAP lenta, questo controllo sarà lento. nscd non memorizza nella cache le chiamate getpwent (), quindi ogni voce passwd verrà letta sulla rete se il server non è locale. Sul sistema ho trovato questo, ha aggiunto circa 4 secondi per ogni invocazione di ssh o login nel sistema.

La correzione è rimuovere il bit scrivibile su tutti i file in ~ / .ssh facendo chmod g-w ~/.ssh/*.


1

Ho scoperto che il riavvio di systemd-logind.service ha risolto il problema solo per alcune ore. La modifica di UsePAM da yes a no in sshd_config ha comportato accessi rapidi, sebbene motd non sia più visualizzato. Commenti su problemi di sicurezza?


Avevo seguito OGNI altro suggerimento qui, e questa è l'unica cosa che ha risolto il problema sul mio server di abilitazione Samba4 ... GRAZIE!
Deven Phillips,

ATTENZIONE: "UsePAM no" non è supportato in Red Hat Enterprise Linux e può causare diversi problemi.
bbaassssiiee,

1

Per completare tutte le risposte che mostrano che le risoluzioni DNS possono rallentare il login ssh, a volte mancano le regole del firewall. Ad esempio, se si GOCCIA tutti i pawn INPUT per impostazione predefinita

iptables -t filter -P INPUT DROP

quindi dovrai accettare INPUT per la porta ssh e la richiesta 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 la connessione è andata benissimo fino a quando non si è bloccato sul sistema cercando di ottenere il terminale per almeno 20 secondi:

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

Dopo aver fatto un systemctl restart systemd-logind sul server ho avuto di nuovo la connessione istantanea!

Questo era su debian8 ! Quindi il problema era systemd qui!

Nota: Bastien Durel ha già fornito una risposta a questo problema, tuttavia non dispone delle informazioni di debug. Spero che questo sia utile a qualcuno.


Ho avuto lo stesso problema con "Immissione sessione interattiva" appeso a RHEL7 (CentOS 7) e risolto commentando session [default=1] pam_lastlog.so nowtmp showfailedin /etc/pam.d/postlogin. Apparentemente l'aggiornamento del file lastlog è stato incredibilmente lento sul mio OpenVZ VPS basato su container.
Justin ᚅᚔᚈᚄᚒᚔ

1

Recentemente ho trovato un'altra causa di accessi ssh lenti.

Anche se avete UseDNS noa /etc/sshd_config, sshd può ancora eseguire ricerche DNS inverse, se /etc/hosts.denyha una voce simile:

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

Ciò potrebbe accadere se DenyHosts è installato nel tuo sistema.

Sarebbe bello se qualcuno sapesse come impedire a DenyHosts di inserire questo tipo di accesso /etc/hosts.deny.

Ecco un link, alle FAQ di DenyHosts , su come rimuovere le voci da /etc/hosts.deny- vedi Come posso rimuovere un indirizzo IP che DenyHosts ha bloccato?


1

È possibile che il metodo di risoluzione dei nomi preferito non sia il file host e quindi DNS.

Ad esempio, questa sarebbe la solita configurazione:

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

In primo luogo, viene raggiunto il file hosts (opzione: file) e quindi DNS (opzione: dns), tuttavia possiamo scoprire che è stato aggiunto un altro sistema di risoluzione dei nomi che non è operativo e ci sta causando la lentezza nel tentativo di eseguire la risoluzione inversa.

Se l'ordine di risoluzione dei nomi non è corretto, puoi modificarlo in: /etc/nsswitch.conf

Estratto da: http://www.sysadmit.com/2017/07/linux-ssh-login-lento.html


1

Ho provato tutte le risposte ma nessuna ha funzionato. finalmente scopro il mio problema:

prima corro in sudo tail -f /var/log/auth.log modo da poter vedere il registro di ssh e poi in un'altra sessione eseguita ssh 172.16.111.166e ho notato che era in attesa

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

dopo la ricerca ho trovato questa riga in / etc / ssd / ssh_config

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

L'ho commentato e il ritardo è andato


1

Nota: questo è iniziato come un tutorial "Come eseguire il debug", ma alla fine è stata la soluzione che mi ha aiutato su un server Ubuntu 16.04 LTS.

TLDR : esegui landscape-sysinfoe controlla se quel comando impiega molto tempo per terminare; è la stampa delle informazioni di sistema su un nuovo login SSH. Si noti che questo comando non è disponibile su tutti i sistemi, il landscape-commonpacchetto lo installa. ("Ma aspetta, c'è di più ...")


Avviare un secondo server SSH su un'altra porta sulla macchina che presenta il problema, farlo in modalità debug, che non lo farà fork e stamperà i messaggi di debug:

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

connettersi a quel server da un'altra macchina in modalità dettagliata:

ssh -vvv -p 44321 username@server

Il mio client genera le seguenti righe subito prima di iniziare a dormire:

debug1: Entering interactive session.
debug1: pledge: network

Googling che non è davvero utile, ma i log del server sono migliori:

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

Ho notato che quando cambio UsePAM yesa UsePAM noquesto problema viene risolto.

Non correlato UseDNSo qualsiasi altra impostazione, UsePAMriguarda solo questo problema sul mio sistema.

Non ho nessuna idea perché, e non sto lasciando anche UsePAMa no, perché non so che gli effetti collaterali sono, ma questo mi permette di continuare a indagare.

Quindi, per favore, non considerare questa come una risposta, ma un primo passo per iniziare a scoprire cosa c'è che non va.


Quindi ho continuato a indagare e ho corso sshdcon strace( sudo strace /usr/sbin/sshd -ddd -p 44321). Ciò ha prodotto quanto segue:

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

La linea /etc/update-motd.dmi ha reso sospettoso, apparentemente il processo attende il risultato delle cose che si trovano/etc/update-motd.d

Quindi ho cdinserito /etc/update-motd.de eseguito un sudo chmod -x *comando per impedire a PAM di eseguire tutti i file che generano questa dinamica Message Of The Day, che include il caricamento del sistema e se i pacchetti devono essere aggiornati, e questo ha risolto il problema.

Questo è un server basato su una CPU N3150 "ad alta efficienza energetica" che ha molto lavoro da fare 24 ore su 24, 7 giorni su 7, quindi penso che raccogliere tutti questi dati motd sia stato troppo per questo.

Potrei iniziare ad abilitare gli script in quella cartella in modo selettivo, per vedere quali sono meno dannosi, ma specialmente la chiamata landscape-sysinfoè molto lenta e 50-landscape-sysinfochiama quel comando. Penso che sia quello che causa il ritardo maggiore.

Dopo riattivazione maggior parte dei file sono arrivato alla conclusione che 50-landscape-sysinfoe 99-esmerano la causa per i miei guai. 50-landscape-sysinfoci sono voluti circa 5 secondi per l'esecuzione e 99-esmcirca 3 secondi. Tutti i file rimanenti circa 2 secondi complessivamente.

50-landscape-sysinfoe 99-esmsono cruciali. 50-landscape-sysinfostampa statistiche di sistema interessanti (e anche se hai poco spazio!) e 99-esmstampa messaggi relativi aUbuntu Extended Security Maintenance

Finalmente puoi creare uno script con echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.she ottenere quella stampa su richiesta.


1

Questo thread sta già fornendo un mucchio di soluzioni ma il mio non è indicato qui =). Quindi eccolo qui. Il mio problema (ho impiegato circa 1 minuto per accedere a ssh nel mio raspberry pi), era dovuto a un file .bash_history danneggiato. Poiché il file viene letto all'accesso, ciò causava il ritardo dell'accesso. Una volta rimosso il file, il tempo di accesso è tornato alla normalità, come istantaneo.

Spero che questo possa aiutare altre persone.


0

Per me avevo bisogno di GSSAPI e non volevo disattivare le ricerche DNS inverse. Non mi è sembrata una buona idea, quindi ho controllato la pagina principale di resolv.conf. Si scopre che un firewall tra me e i server a cui ero SSH stava interferendo con le richieste DNS, perché non erano nella forma prevista dal firewall. Alla fine, tutto quello che dovevo fare era aggiungere questa riga a resolv.conf sui server a cui ero SSHing:

options single-request-reopen


0

Sorprendentemente, un aggiornamento del pacchetto di bind su CentOS 7 ha rotto il nome, indicando ora nel registro che /etc/named.conf aveva un problema con le autorizzazioni. Ha funzionato bene per mesi con 0640. Ora vuole 0644. Questo ha senso perché il demone nominato appartiene all'utente 'nominato'.

Con il nome giù tutto era lento, dagli accessi ssh alla pubblicazione di pagine dal server Web locale, app LAMP lente, ecc. Molto probabilmente perché ogni richiesta sarebbe scaduta sul server locale morto prima di cercare un DNS secondario esterno configurato.


0

Per me c'era un problema nel mio /etc/hostsfile locale . Quindi sshstava provando due IP diversi (uno sbagliato) che impiegava un'eternità a scadere.

Utilizzando ha ssh -vfatto il trucco qui:

$ 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.

Il /etc/hostsserver?
Daniel F,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.