El mensaje
Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Disconnected from 203.0.113.10 port 22
En el servidor, el registro dice:
maximum authentication attempts exceeded for user from 203.0.113.20 port 47120 ssh2 [preauth]
A menudo nunca te llegaron a pedir una contraseña. En nuestra prueba, una cuenta con una contraseña válida falló con este mensaje antes de cualquier prompt, porque las claves gastaron antes todos los intentos.
Comprueba la causa
Cuenta las claves de tu agente:
ssh-add -l
Después mira qué se ofrece realmente:
ssh -v user@server 2>&1 | grep -E 'Offering|Too many'
debug1: Offering public key: key1 ED25519 SHA256:...
debug1: Offering public key: key2 ED25519 SHA256:...
debug1: Offering public key: key3 ED25519 SHA256:...
debug1: Offering public key: key4 ED25519 SHA256:...
debug1: Offering public key: key5 ED25519 SHA256:...
debug1: Offering public key: key6 ED25519 SHA256:...
Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Cada clave que el servidor no acepta cuenta como un fallo, y el límite es MaxAuthTries, 6 por defecto. En nuestra prueba la sexta clave todavía tuvo su turno: con la clave correcta en sexto lugar el acceso funcionó, y con seis claves incorrectas por delante falló. Un servidor con un límite más bajo falla antes.
La solución: dile a ssh qué clave usar
Para un intento:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_server user@server
Para dejarlo fijo, añade esto a ~/.ssh/config:
Host server
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_ed25519_server
IdentitiesOnly yes
-i solo no basta. Lo probamos: sin IdentitiesOnly, las claves del agente seguían yendo primero y volvía el mismo error. IdentitiesOnly yes es lo que limita ssh a las claves que nombraste.
Hay más ajustes por host en estos ejemplos de archivo ssh config.
Si la clave existe solo en el agente
IdentityFile puede apuntar al archivo de la clave pública. ssh usa entonces ese archivo para elegir la clave, y el agente hace la firma:
Host server
IdentityFile ~/.ssh/id_ed25519_server.pub
IdentitiesOnly yes
Si entras con contraseña
Aquí las claves solo estorban, así que desactívalas para este acceso:
ssh -o PubkeyAuthentication=no user@server
En un archivo de configuración, es PubkeyAuthentication no en el bloque del host.
Otras opciones
Guarda menos claves en el agente
ssh-add -l # list
ssh-add -d ~/.ssh/old_key # remove one
ssh-add -D # remove all
Esto quita claves solo del agente y deja los archivos en paz. Si usas una clave distinta para cada servidor, la lista crece rápido, así que la configuración de arriba es la respuesta duradera.
Saltarte el agente en un host
Host server
IdentityAgent none
IdentityFile ~/.ssh/id_ed25519_server
Esto también funciona, pero tendrás que escribir la frase de contraseña de la clave cada vez, si la tiene.
Definir IdentitiesOnly para todos los hosts
Puedes poner IdentitiesOnly yes bajo Host *. Si un host no tiene IdentityFile, ssh prueba los archivos por defecto como ~/.ssh/id_ed25519 e ignora las demás claves del agente. Así que los hosts que dependían de una de esas otras claves necesitan su propia línea IdentityFile.
No subas MaxAuthTries por esto
Puedes subir el límite en un servidor que controlas, pero la causa está en el cliente. Todos los demás servidores a los que te conectes mantienen su límite, y un límite más alto da a cualquiera que esté adivinando más intentos por conexión.
Los fallos repetidos pueden hacer que te bloqueen
Si el servidor ejecuta fail2ban, cada desconexión como esta puede contar contra tu dirección. En nuestra prueba, una desconexión así añadió un fallo a la jail sshd. Si el error pasa a ser Connection refused tras unos pocos intentos, puede que te hayan bloqueado. Mira fail2ban para SSH.
Preguntas
¿Cuál es el valor por defecto de MaxAuthTries?
6. Cada clave que el servidor rechaza cuenta como un intento, así que un agente con muchas claves puede agotarlos antes de llegar a la correcta.
¿Por qué ssh -i no lo arregla?
Sin IdentitiesOnly yes, ssh sigue ofreciendo las claves del agente antes que la indicada con -i.
¿Cómo veo qué claves ofrece ssh?
Ejecuta ssh -v user@server y busca las líneas Offering public key.
Fuentes
- ssh_config(5), IdentitiesOnly e IdentityFile
- sshd_config(5), MaxAuthTries
- ssh-add(1), manual de OpenBSD