¿Por qué mi inicio de sesión SSH es lento?

95

Estoy viendo retrasos en los inicios de sesión de SSH. Específicamente, hay 2 puntos donde veo un rango de retrasos instantáneos a varios segundos.

  1. Entre emitir el comando ssh y obtener una solicitud de inicio de sesión y
  2. entre ingresar la frase de contraseña y tener la carga de shell

Ahora, específicamente estoy viendo detalles ssh solo aquí. Obviamente, la latencia de la red, la velocidad del hardware y los sistemas operativos involucrados, los scripts de inicio de sesión complejos, etc. pueden causar demoras. Para el contexto, utilizo una gran cantidad de distribuciones de Linux y algunos hosts Solaris que utilizan principalmente Ubuntu, CentOS y MacOS X como mis sistemas cliente. Casi todo el tiempo, la configuración del servidor ssh no cambia desde la configuración predeterminada del sistema operativo.

¿En qué configuraciones de servidor ssh debería interesarme? ¿Hay parámetros del sistema operativo / kernel que se pueden ajustar? ¿Trucos de inicio de sesión? Etc?

Peter Lyons
fuente
¿Estás usando cuentas locales? - a veces encuentro que la autenticación de pam puede agregar un retraso al iniciar sesión con ssh
Sirex
Por lo general, cuentas locales. A veces NIS.
Peter Lyons

Respuestas:

122

Prueba a poner UseDNSa noen /etc/sshd_configo /etc/ssh/sshd_config.

Paul R
fuente
77
+1 es la causa más común de demora al iniciar sesión en ssh
matthias krull
2
"Nota de Solaris 11: probé la configuración UseDNS no en Solaris 11 y corrompió el inicio del servicio. No es exactamente una respuesta amigable del servicio. YMMV con otras variantes * Nix pero parece que UseDNS no puede no ser una opción válida en Solaris 11 ". - comentario de Keith Hoffman
Sathyajith Bhat
3
Era escéptico cuando uso para iniciar sesión con la dirección IP (LAN local), pero esta solución solucionó mi problema. Por el bien de Google, aunque ocurrió justo después, el retraso no tuvo nada que ver con el mensaje "key: /home/mylogin/.ssh/id_ecdsa ((nil))" (cuando se ejecuta ssh -vvv).
Skippy le Grand Gourou
2
¡+1 por hacerlo explícito, el archivo /etc/ssh/sshd_config! ¡Estaba agregando /etc/sshd_configy no veía ninguna diferencia!
vyom
1
@SkippyleGrandGourou: Algunas versiones de Solaris estaban usando un OpenSSH modificado, llamado SunSSH, que tenía algunas incompatibilidades molestas. Solaris 11.3 agrega OpenSSH nuevamente y SunSSH eventualmente será eliminado ...
Gert van den Berg
37

Cuando ejecuté ssh -vvven un servidor con un rendimiento lento similar, vi un bloqueo aquí:

debug1: Next authentication method: gssapi-with-mic

Al editar /etc/ssh/ssh_configy comentar ese método de autenticación, el rendimiento de inicio de sesión volvió a la normalidad. Esto es lo que tengo en mi /etc/ssh/ssh_configen el servidor:

GSSAPIAuthentication no

Puede configurarlo globalmente en el servidor, por lo que no acepta GSSAPI para autenticar. Simplemente agregue GSSAPIAuthentication noal /etc/ssh/sshd_configservidor y reinicie el servicio.

Joshua
fuente
Descubrí que este es el caso con mis servidores RHEL5 una vez que se configuraron los inicios de sesión de winbind / ad.
Chad
Esto funciona para mí en un servidor Ubuntu 14.04.
Penghe Geng
Para CentOS 7, necesita configurar ambos GSSAPIAuthentication noy UseDNS noen el /etc/ssh/sshd_configarchivo.
Sunry
19

Para mí, el culpable fue la resolución IPv6, estaba agotando el tiempo de espera. (Supongo que la configuración de DNS incorrecta en mi proveedor de host). Descubrí esto haciendo ssh -v, lo que mostró qué paso estaba colgando.

La solución es sshcon la -4opción:

ssh -4 [email protected]

Antonio
fuente
2
Sospecho que más y más de nosotros veremos esto a medida que pase el tiempo y las cosas (mal y) acomoden lentamente IPV6. ¡Gracias!
sabio
1
... y esta respuesta es particularmente inútil sin el mensaje de depuración que confirma que este es el problema.
EP
Según mi experiencia, este es un problema muy común cuando SSH está escuchando en las interfaces de doble pila y lo primero que compruebo cuando puedo iniciar sesión, pero lleva más tiempo del esperado.
Mogget
¿Hay alguna posibilidad de que podamos arreglar IPv6 en lugar de usar IPv4?
msrd0
Esta es probablemente la razón por la que UseDNS sin respuesta funciona. El uso de -vvv solo muestra una pausa debug2: resolving "thing.net.au" port 22sin error, pero esto no sucede con -4, lo que indica que es un problema de DNS IPv6.
pmc
16

Con systemd, el inicio de sesión puede bloquearse en la comunicación dbus con logind después de algunas actualizaciones, luego debe reiniciar logind

systemctl restart systemd-logind

Lo vi en Debian 8, Arch Linx y en una lista Suse

Bastien Durel
fuente
1
Oh wow, ¡ahora ese era el culpable! ¡Gracias un montón!
mahatmanich
Lo mismo para mi. Tomó un tiempo para descartar todos los posibles problemas de DNS y SSH primero. Nota: Si el problema también se aplica al sudo lento, intente esto primero.
Michael
Acabo de terminar algunas actualizaciones in situ de RHEL6 a RHEL7 y noté este problema. Esta respuesta también solucionó mi problema.
user53029
muchas gracias, funciona de maravilla.
Bảo Nam
9

Siempre puede comenzar sshcon la -vopción que muestra lo que se está haciendo en este momento.

$ ssh -v you@host

Con la información que proporcionó, solo puedo sugerir algunas configuraciones del lado del cliente:

  • Como escribe que está ingresando contraseñas manualmente, le sugiero que use la autenticación de clave pública si es posible. Esto lo elimina como un cuello de botella de velocidad.

  • También puede deshabilitar el reenvío de X con -xy el reenvío de autenticación con -a(estos pueden estar deshabilitados de forma predeterminada). Deshabilitar especialmente el reenvío X puede proporcionarle una gran mejora de velocidad si su cliente necesita iniciar un servidor X para el sshcomando (por ejemplo, bajo OS X).

Todo lo demás realmente depende de qué tipo de retrasos experimente dónde y cuándo.

Benjamin Bannier
fuente
Una buena pista sobre la verbosidad, también puede aumentarla al tener más v. Hasta 3 IIRC.
vtest
7

Con respecto al punto 2., aquí hay una respuesta que no requiere modificar el servidor ni tener privilegios administrativos / raíz.

Necesita editar su archivo "user ssh_config" que es:

vi $HOME/.ssh/config

(Nota: tendría que crear el directorio $ HOME / .ssh si no existe)

Y añadir:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Puede hacerlo por host si es necesario :) ejemplo:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Asegúrese de que la dirección IP coincida con la IP de su servidor. Una gran ventaja es que ahora ssh proporcionará autocompletado para este servidor. Por lo tanto, puede escribir ssh lin+ Taby se debe completar automáticamente ssh linux-srv.

Huygens
fuente
4

Verifique /etc/resolv.confen el servidor para asegurarse de que el servidor DNS, que figura en este archivo, funcione correctamente y elimine cualquier DNS que no funcione.

A veces es muy útil.

Elena Timoshkina
fuente
2

Además de los problemas de DNS ya mencionados, si está ingresando a un servidor con muchos montajes NFS, entonces puede haber un retraso entre la contraseña y la solicitud a medida que el quotacomando verifica su uso / cuota en todos los sistemas de archivos que no están montados con el noquota. En los sistemas Solaris, puede ver esto por defecto /etc/profiley omitirlo ejecutando touch $HOME/.hushlogin .

alanc
fuente
1

Trabaja bien.

# 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, no funciona con OpenIndiana !!!

Lea "man sshd_config" para todas las opciones

"LookupClientHostnames no" si su servidor no puede resolver

Hugues
fuente
1

Si ninguna de las respuestas anteriores funciona y se enfrenta a problemas de búsqueda inversa de DNS, también puede verificar si nscd(servicio de nombres cache daemon) está instalado y ejecutándose.

Si este es el problema, es porque no tiene caché dns, y cada vez que solicita un nombre de host que no está en su archivo host, envía la pregunta a su servidor de nombres en lugar de buscar en su caché

Probé todas las opciones anteriores y el único cambio que funcionó fue comenzar nscd.

También debe verificar el orden para hacer una resolución de consulta dns /etc/nsswitch.confpara usar primero el archivo hosts.

altmas5
fuente
1

Probablemente esto solo sea específico para Debian / Ubuntu OpenSSH, que incluye el user-group-modes.patch escrito por uno de los mantenedores de paquetes de Debian. Este parche permite que los archivos ~ / .ssh tengan configurado el bit de escritura del grupo (g + w) si solo hay un usuario con el mismo gid que el del archivo. La función secure_permissions () del parche hace esta comprobación. Una de las fases de la verificación es pasar por cada entrada passwd usando getpwent () y comparar el gid de la entrada con el gid del archivo.

En un sistema con muchas entradas y / o autenticación lenta NIS / LDAP, esta verificación será lenta. nscd no almacena en caché las llamadas getpwent (), por lo que cada entrada passwd se leerá en la red si el servidor no es local. En el sistema encontré esto, agregaba aproximadamente 4 segundos por cada invocación de ssh o inicio de sesión en el sistema.

La solución es eliminar el bit de escritura en todos los archivos en ~ / .ssh haciendo chmod g-w ~/.ssh/*.

jamesy
fuente
1

Descubrí que reiniciar systemd-logind.service solo solucionó el problema durante unas horas. Cambiar UsePAM de yes a no en sshd_config ha resultado en inicios de sesión rápidos, aunque motd ya no se muestra. ¿Comentarios sobre problemas de seguridad?

Chris Blake
fuente
Había examinado CUALQUIER otra sugerencia aquí, y esto es lo único que solucionó el problema en mi servidor habilitado Samba4 ... ¡GRACIAS!
Deven Phillips
ADVERTENCIA: 'UsePAM no' no es compatible con Red Hat Enterprise Linux y puede causar varios problemas.
bbaassssiiee
1

Para completar todas las respuestas que muestran que las resoluciones DNS pueden ralentizar su inicio de sesión ssh, a veces, faltan reglas de firewall. Por ejemplo, si DEJAS todos los paquetes de ENTRADA por defecto

iptables -t filter -P INPUT DROP

entonces tendrá que aceptar INPUT para el puerto ssh y la solicitud DNS

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

ssh -vvv la conexión fue realmente buena hasta que se colgó en el sistema tratando de obtener el terminal durante al menos 20 segundos:

debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
... waiting ... waiting ... waiting

¡Después de hacer un systemctl restart systemd-logind en el servidor tuve conexión instantánea otra vez!

Esto fue en debian8 ! ¡Así que systemd era el problema aquí!

Nota: Bastien Durel ya dio una respuesta para este problema, sin embargo, carece de la información de depuración. Espero que esto sea útil para alguien.

mahatmanich
fuente
Tuve el mismo problema con "Entrar en sesión interactiva" colgado en RHEL7 (CentOS 7) y lo resolví comentando session [default=1] pam_lastlog.so nowtmp showfaileden /etc/pam.d/postlogin. Aparentemente, actualizar el archivo lastlog fue increíblemente lento en mi OpenVZ VPS basado en contenedor.
Justin ᚅᚔᚈᚄᚒᚔ
1

Recientemente he encontrado otra causa de inicios de sesión ssh lentos.

Incluso si usted tiene UseDNS noen /etc/sshd_config, sshd todavía puede realizar búsquedas DNS inversas si /etc/hosts.denytiene una entrada como:

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

Eso podría suceder si tiene DenyHosts instalado en su sistema.

Sería genial si alguien supiera cómo hacer que DenyHosts evite ingresar este tipo de entrada /etc/hosts.deny.

Aquí hay un enlace a las Preguntas frecuentes de DenyHosts sobre cómo eliminar entradas /etc/hosts.deny: consulte ¿Cómo puedo eliminar una dirección IP que DenyHosts bloqueó?

Marcelo Roberto Jiménez
fuente
1

Podemos encontrar que el método de resolución de nombre preferido no es el archivo host y luego el DNS.

Por ejemplo, esta sería la configuración habitual:

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

Primero, se alcanza el archivo de hosts (opción: archivos) y luego DNS (opción: dns), sin embargo, podemos encontrar que se ha agregado otro sistema de resolución de nombres que no está operativo y nos está causando la lentitud al tratar de hacer la resolución inversa.

Si el orden de resolución de nombre no es correcto, puede cambiarlo en: /etc/nsswitch.conf

Extraído de: http://www.sysadmit.com/2017/07/linux-ssh-login-lento.html

Hans Gruber
fuente
1

Intenté todas las respuestas pero ninguna funcionó. finalmente descubro mi problema:

primero ejecuto sudo tail -f /var/log/auth.log para poder ver el registro de ssh y luego en otra sesión ejecuté ssh 172.16.111.166y noté que esperaba

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

después de buscar, ubiqué esta línea en / etc / ssd / ssh_config

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

Lo comenté y la demora se fue

HamedH
fuente
1

Nota: Esto comenzó como un tutorial de "Cómo depurar", pero terminó siendo la solución que me ayudó en un servidor Ubuntu 16.04 LTS.

TLDR : Ejecute landscape-sysinfoy compruebe si ese comando tarda mucho en finalizar; es la impresión de información del sistema en un nuevo inicio de sesión SSH. Tenga en cuenta que este comando no está disponible en todos los sistemas, el landscape-commonpaquete lo instala. ("Pero espera hay mas...")


Inicie un segundo servidor ssh en otro puerto de la máquina que tenga el problema, hágalo en modo de depuración, lo que no hará que se bifurque e imprima mensajes de depuración:

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

conectarse a ese servidor desde otra máquina en modo detallado:

ssh -vvv -p 44321 username@server

Mi cliente muestra las siguientes líneas justo antes de comenzar a dormir:

debug1: Entering interactive session.
debug1: pledge: network

Buscar en Google eso no es realmente útil, pero los registros del servidor son mejores:

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

Noté que cuando cambio UsePAM yesa UsePAM noeste problema se resuelve.

No relacionado con UseDNSninguna otra configuración, solo UsePAMafecta este problema en mi sistema.

No tengo idea de por qué, y tampoco me voy UsePAMa noir porque no sé cuáles son los efectos secundarios, pero esto me permite seguir investigando.

Por lo tanto, no considere que esto sea una respuesta, sino un primer paso para comenzar a descubrir qué está mal.


Entonces continué investigando y corrí sshdcon strace( sudo strace /usr/sbin/sshd -ddd -p 44321). Esto produjo lo siguiente:

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 línea /etc/update-motd.dme hizo sospechar, aparentemente el proceso espera el resultado de las cosas que están en/etc/update-motd.d

Así que cd'd en /etc/update-motd.dy pasó un sudo chmod -x *fin de inhibir PAM para ejecutar todos los archivos que generan esta dinámica Message Of The Day, que incluye la carga del sistema y si los paquetes deben ser actualizados, y esto resuelve el problema.

Este es un servidor basado en una CPU N3150 "energéticamente eficiente" que tiene mucho trabajo que hacer las 24 horas del día, los 7 días de la semana, por lo que creo que recopilar todos estos datos motd fue demasiado.

Puedo comenzar a habilitar scripts en esa carpeta de forma selectiva, para ver cuáles son menos dañinos, pero especialmente las llamadas landscape-sysinfoson muy lentas y 50-landscape-sysinfollaman a ese comando. Creo que es el que causa el mayor retraso.

Después de volver a habilitar la mayor parte de los archivos que llegué a la conclusión de que 50-landscape-sysinfoy 99-esmfueron la causa de mis problemas. 50-landscape-sysinfotardó unos 5 segundos en ejecutarse y 99-esmunos 3 segundos. Todos los archivos restantes alrededor de 2 segundos en total.

Ninguno de los dos 50-landscape-sysinfoy 99-esmson cruciales. 50-landscape-sysinfoimprime estadísticas interesantes del sistema (¡y también si tiene poco espacio!) e 99-esmimprime mensajes relacionados conUbuntu Extended Security Maintenance

Finalmente, puede crear un script echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.shy obtener esa impresión a pedido.

Daniel F
fuente
1

Este hilo ya está proporcionando un montón de soluciones, pero el mío no se da aquí =). Asi que aqui esta. Mi problema (tardó aproximadamente 1 minuto en iniciar sesión en ssh en mi Raspberry Pi) se debió a un archivo .bash_history dañado. Dado que el archivo se lee al iniciar sesión, esto estaba causando el retraso de inicio de sesión. Una vez que eliminé el archivo, el tiempo de inicio de sesión volvió a la normalidad, como instantáneo.

Espero que esto ayude a otras personas.

usuario3320224
fuente
0

Para mí necesitaba GSSAPI, y no quería desactivar las búsquedas inversas de DNS. Eso no parecía una buena idea, así que revisé la página principal para resolv.conf. Resulta que un firewall entre mí y los servidores a los que estaba enviando SSH estaba interfiriendo con las solicitudes de DNS, porque no estaban en una forma que el firewall esperaba. Al final, todo lo que tenía que hacer era agregar esta línea a resolv.conf en los servidores en los que estaba SSHing:

options single-request-reopen

Sapan Ganguly
fuente
0

Sorprendentemente, una actualización de paquete de enlace en CentOS 7 se rompió con el nombre, ahora indicando en el registro que /etc/named.conf tenía un problema de permisos. Había funcionado bien durante meses con 0640. Ahora quiere 0644. Esto tiene sentido ya que el demonio nombrado pertenece al usuario 'nombrado'.

Con el nombre anulado, todo fue lento, desde los inicios de sesión ssh hasta el servicio de la página desde el servidor web local, las aplicaciones LAMP lentas, etc.

David Ramirez
fuente
0

Para mí hubo un problema en mi /etc/hostsarchivo local . Así que sshestaba probando dos IP diferentes (una incorrecta) que tardó una eternidad en expirar.

Usando ssh -vhizo el truco aquí:

$ 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.
malat
fuente
El /etc/hostsdel servidor?
Daniel F