2010-07-22 07:02:00 +0000 2010-07-22 07:02:00 +0000
103
103

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

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

  1. Entre la emisión del comando ssh y la obtención de un prompt de inicio de sesión y
  2. entre la introducción de la frase de contraseña y la carga del shell

Ahora, específicamente estoy mirando los detalles de ssh sólo aquí. Obviamente, la latencia de la red, la velocidad del hardware y los sistemas operativos involucrados, los complejos scripts de inicio de sesión, etc., pueden causar retrasos. Para contextualizar, yo hago ssh a una gran multitud de distribuciones de linux y algunos hosts de Solaris, usando principalmente Ubuntu, CentOS y MacOS X como mis sistemas cliente. Casi todo el tiempo, la configuración del servidor ssh no cambia de la configuración por defecto del sistema operativo.

¿Qué configuraciones del servidor ssh deberían interesarme? ¿Hay parámetros del SO/kernel que se puedan ajustar? ¿Trucos del shell de inicio de sesión? ¿Etc?

Respuestas (22)

130
130
130
2010-07-22 08:38:59 +0000

Prueba a poner UseDNS en no o /etc/sshd_config.

39
39
39
2010-09-22 17:42:34 +0000

Cuando ejecuté ssh -vvv en un servidor con un rendimiento lento similar vi un cuelgue aquí:

debug1: Next authentication method: gssapi-with-mic

Editando el /etc/ssh/ssh_config y comentando ese método de autenticación conseguí que el rendimiento del login volviera a ser normal. Esto es lo que tengo en mi /etc/ssh/ssh_config en el servidor:

GSSAPIAuthentication no

Puedes configurar esto globalmente en el servidor, para que no acepte GSSAPI para autenticarse. Simplemente añade GSSAPIAuthentication no a /etc/ssh/sshd_config en el servidor y reinicia el servicio.

21
21
21
2015-08-14 00:50:20 +0000

En mi caso, el culpable era la resolución de IPv6, que se desconectaba. Lo descubrí haciendo ssh -v, lo que mostró el paso que se estaba colgando.

La solución es ssh con la opción -4:

ssh -4 me@myserver.com

16
16
16
2015-05-21 09:41:03 +0000

Con systemd, el inicio de sesión puede colgar en la comunicación dbus con logind después de algunas actualizaciones, entonces usted necesita para reiniciar logind

systemctl restart systemd-logind

Vi que en debian 8, arch linx, y en una lista de suse

9
9
9
2010-07-22 08:28:05 +0000

Siempre puedes iniciar ssh con la opción -v que muestra lo que se está haciendo en ese momento.

$ ssh -v you@host

Con la información que has dado sólo puedo sugerir algunas configuraciones del lado del cliente:

  • Ya que escribes que estás introduciendo las contraseñas manualmente, te sugeriría que uses la autentificación por clave pública si es posible. Esto lo elimina como un cuello de botella de velocidad.

  • También podrías desactivar el reenvío de X con -x y el reenvío de autenticación con -a (puede que ya estén desactivados por defecto). Especialmente deshabilitar el reenvío de X puede darle una gran mejora de velocidad si su cliente necesita iniciar un servidor X para el comando ssh (por ejemplo, en OS X).

Todo lo demás depende realmente de los tipos de retrasos que experimente dónde y cuándo.

7
7
7
2012-06-29 07:41:22 +0000

Con respecto al punto 2., aquí hay una respuesta que no requiere modificar el servidor ni requiere tener privilegios de root/administración.

Tienes que editar tu archivo “user ssh_config” que es:

vi $HOME/.ssh/config

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

Y añadir:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Puedes hacerlo por cada host si es necesario :) ejemplo:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Asegúrate de que la dirección IP coincide con la IP de tu servidor. Una ventaja genial es que ahora ssh proporcionará autocompletar para este servidor. Así que puedes escribir ssh lin + Tab y debería autocompletar a ssh linux-srv.

4
4
4
2017-06-08 07:57:20 +0000

Compruebe /etc/resolv.conf en el servidor para asegurarse de que el servidor DNS, que aparece en este archivo, funciona bien, y elimine cualquier DNS que no funcione.

A veces es muy útil.

2
2
2
2010-07-22 14:24:59 +0000

Además de los problemas de DNS ya mencionados, si estás entrando por ssh en un servidor con muchos montajes NFS, puede haber un retraso entre la contraseña y el prompt ya que el comando quota comprueba tu uso/cuota en todos los sistemas de archivos que no están montados con el noquota. En los sistemas Solaris, puede ver esto en el /etc/profile por defecto y omitirlo ejecutando touch $HOME/.hushlogin .

1
1
1
2013-05-02 23:01:07 +0000

Si ninguna de las respuestas anteriores funciona y tienes problemas de búsqueda inversa de dns, también puedes comprobar si nscd (demonio de caché del servicio de nombres) está instalado y funcionando.

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

He probado todas las opciones anteriores y el único cambio que funcionó fue iniciar nscd.

También debes verificar el orden para hacer la resolución de la consulta dns en /etc/nsswitch.conf para usar primero el archivo de hosts.

1
1
1
2015-10-13 01:19:43 +0000

Esto es probablemente sólo específico del OpenSSH de Debian/Ubuntu, que incluye el parche user-group-modes.patch escrito por uno de los mantenedores del paquete Debian. Este parche permite que los archivos ~/.ssh tengan el bit de grupo escribible activado (g+w) si sólo 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 comprobación es recorrer cada entrada de passwd mediante getpwent() y comparar el gid de la entrada con el gid del fichero.

En un sistema con muchas entradas y/o autenticación NIS/LDAP lenta, esta comprobación será lenta. nscd no almacena en caché las llamadas a getpwent(), por lo que cada entrada de passwd será leída a través de la red si el servidor no es local. En el sistema en el que encontré esto, añadía unos 4 segundos por cada invocación de ssh o login en el sistema.

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

1
1
1
2018-11-20 19:15:56 +0000

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-sysinfo y compruebe si ese comando tarda mucho en terminar; es la impresión de la 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 paquete landscape-common lo instala. (“Pero espere, hay más…”)

  • *

Inicie un segundo servidor ssh en otro puerto en la máquina que tiene el problema, hágalo en modo debug, que no lo hará fork e imprimirá mensajes de depuración:

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

conéctate a ese servidor desde otra máquina en modo verbose:

ssh -vvv -p 44321 username@server

Mi cliente emite las siguientes líneas justo antes de empezar a dormir:

debug1: Entering interactive session.
debug1: pledge: network

Buscar en Google 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

Me he dado cuenta de que cuando cambio UsePAM yes por UsePAM no se resuelve el problema.

No está relacionado con UseDNS ni con ningún otro ajuste, sólo UsePAM afecta a este problema en mi sistema.

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

Así que, por favor, no consideres esto como una respuesta, sino como un primer paso para empezar a averiguar lo que está mal.

  • *

Así que seguí investigando, y ejecuté sshd con strace (sudo strace /usr/sbin/sshd -ddd -p 44321). Esto dio como resultado 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.d me hizo sospechar, aparentemente el proceso espera el resultado de las cosas que están en /etc/update-motd.d

Así que ejecuté el cd con el /etc/update-motd.d para inhibir a PAM de ejecutar todos los archivos que generan este sudo chmod -x * dinámico, que incluye la carga del sistema y si los paquetes necesitan ser actualizados, y esto resolvió el problema.

Este es un servidor basado en una CPU N3150 “energéticamente eficiente” que tiene mucho trabajo que hacer 24/7, así que creo que recoger todos estos datos motd era demasiado para él.

Puede que empiece a habilitar scripts en esa carpeta de forma selectiva, para ver cuáles son menos dañinos, pero especialmente llamar a Message Of The Day es muy lento, y landscape-sysinfo sí llama a ese comando. Creo que es el que provoca el mayor retraso.

Después de volver a activar la mayoría de los archivos llegué a la conclusión de que50-landscape-sysinfo y 50-landscape-sysinfo eran la causa de mis problemas. 99-esm tardaba unos 5 segundos en ejecutarse y 50-landscape-sysinfo unos 3 segundos. Todos los demás archivos tardaron unos 2 segundos en total.

Ni 99-esm ni 50-landscape-sysinfo son cruciales. 99-esm imprime estadísticas interesantes del sistema (¡y también si tienes poco espacio!), y 50-landscape-sysinfo imprime mensajes relacionados con 99-esm

Finalmente puedes crear un script con Ubuntu Extended Security Maintenance y obtener esa impresión a petición.

1
1
1
2017-07-22 08:21:56 +0000

Probé todas las respuestas pero ninguna de ellas funcionó. finalmente descubrí mi problema:

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

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

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

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

la comenté y el retraso desapareció

1
1
1
2012-04-25 13:37:42 +0000

Funciona 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

1
1
1
2017-03-04 22:38:38 +0000

ssh -vvv la conexión fue muy bien hasta que se colgó el sistema tratando de obtener la 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 no-more-sessions@openssh.com
debug1: Entering interactive session.
... waiting ... waiting ... waiting

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

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

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

1
1
1
2017-07-09 09:12:53 +0000

Podemos encontrarnos con que el método de resolución de nombres preferido no es el archivo de 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 llega al fichero de hosts (opción: files) y luego al DNS (opción: dns), sin embargo podemos encontrarnos con que se ha añadido otro sistema de resolución de nombres que no está operativo y nos está provocando la lentitud al intentar hacer la resolución inversa.

Si el orden de resolución de nombres no es correcto, se puede cambiar en: /etc/nsswitch.conf

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

1
1
1
2018-01-03 15:02:47 +0000

Este hilo ya está proporcionando un montón de soluciones, pero la mía no se da aquí =). Así que aquí está. Mi problema (tomó alrededor de 1 minutos para ssh login en mi frambuesa pi), fue debido a un archivo corrupto .bash_history. Dado que el archivo se lee en el inicio de 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.

1
1
1
2016-12-06 09:24:08 +0000

Para completar todas las respuestas que muestran que las resoluciones de DNS pueden ralentizar el inicio de sesión de ssh, a veces, falta una regla de firewall. Por ejemplo, si usted DROP todos los paquets INPUT por defecto

iptables -t filter -P INPUT DROP

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

iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
1
1
1
2016-10-24 21:49:02 +0000

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

Incluso si tiene UseDNS no en /etc/sshd_config, sshd puede seguir realizando búsquedas DNS inversas si /etc/hosts.deny tiene una entrada como:

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

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

Sería estupendo que alguien supiera cómo hacer que DenyHosts evite poner este tipo de entradas en /etc/hosts.deny.

Aquí hay un enlace, a las DenyHosts FAQ , sobre cómo eliminar las entradas de /etc/hosts.deny - vea ¿Cómo puedo eliminar una dirección IP que DenyHosts bloqueó?

1
1
1
2016-07-13 22:35:37 +0000

Descubrí que reiniciando systemd-logind.service sólo se curaba el problema durante unas horas. Cambiar UsePAM de sí a no en sshd_config ha dado lugar a inicios de sesión rápidos, aunque motd ya no se muestra. ¿Comentarios sobre problemas de seguridad?

0
0
0
2015-05-21 13:01:07 +0000

En mi caso había un problema en mi archivo local /etc/hosts. Así que ssh estaba intentando dos IP diferentes (una incorrecta) que tardaba una eternidad en agotarse.

Usando ssh -v hizo 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.
0
0
0
2014-08-28 11:41:40 +0000

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 de resolv.conf. Resulta que un firewall entre yo y los servidores a los que me estaba conectando por SSH, estaba interfiriendo con las peticiones de DNS, porque no estaban en la forma que el firewall esperaba. Al final, todo lo que necesitaba hacer era añadir esta línea a resolv.conf en los servidores a los que me conectaba por SSH:

options single-request-reopen

0
0
0
2016-12-13 17:07:11 +0000

Sorprendentemente, una actualización de paquete de bind en CentOS 7 rompió named, 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 el 0644. Esto tiene sentido ya que el demonio named pertenece al usuario ‘named’.

Con named fuera de servicio todo era lento, desde los inicios de sesión ssh hasta el servicio de páginas desde el servidor web local, aplicaciones LAMP lentas, etc., probablemente porque todas las peticiones se agotan en el servidor local muerto antes de buscar en un DNS secundario externo que está configurado.