93 votes

Qu'est-ce qui cause l'erreur SSH : kex_exchange_identification: Connection closed by remote host ?

J'ai mis en place un serveur SSH en ligne accessible publiquement par n'importe qui. En conséquence, je reçois beaucoup de connexions à partir d'adresses IP du monde entier. Bizarrement, aucune d'entre elles ne tente effectivement de s'authentifier pour ouvrir une session. Je peux moi-même me connecter et m'authentifier sans aucun problème.

De temps en temps, je reçois l' erreur : kex_exchange_identification: Connection closed by remote host dans les journaux du serveur. Quelle en est la cause ?

Voici 30 minutes de journaux SSH (les adresses IP publiques ont été masquées) :

# journalctl SYSLOG_IDENTIFIER=sshd -S "03:30:00" -U "04:00:00"
-- Les journaux commencent le ven. 2020-01-31 09:26:25 UTC, se terminent le lun. 2020-04-20 08:01:15 UTC. --
20 avr 03:39:48 myhostname sshd[18438]: Connexion depuis x.x.x.207 port 39332 sur 10.0.0.11 port 22 rdomain ""
20 avr 03:39:48 myhostname sshd[18439]: Connexion depuis x.x.x.207 port 39334 sur 10.0.0.11 port 22 rdomain ""
20 avr 03:39:48 myhostname sshd[18438]: Connexion fermée par x.x.x.207 port 39332 [preauth]
20 avr 03:39:48 myhostname sshd[18439]: Connexion fermée par x.x.x.207 port 39334 [preauth]
20 avr 03:59:36 myhostname sshd[22186]: Connexion depuis x.x.x.83 port 34876 sur 10.0.0.11 port 22 rdomain ""
20 avr 03:59:36 myhostname sshd[22186]: error: kex_exchange_identification: Connection closed by remote host

Et voici ma configuration SSH :

# ssh -V
OpenSSH_8.2p1, OpenSSL 1.1.1d  10 Sep 2019
# cat /etc/ssh/sshd_config 
UsePAM yes
AddressFamily any
Port 22
X11Forwarding no
PermitRootLogin prohibit-password
GatewayPorts no
PasswordAuthentication no
ChallengeResponseAuthentication no
PrintMotd no # traité par pam_motd
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 /etc/ssh/authorized_keys.d/%u
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
LogLevel VERBOSE
UseDNS no
AllowUsers root
AuthenticationMethods publickey
MaxStartups 3:100:60

Après avoir cherché sur le web, j'ai vu des références à MaxStartups indiquant que cela pourrait être la raison de cette erreur mais après avoir changé la valeur par défaut comme indiqué dans mon sshd_config et en essayant plus de 3 connexions, le serveur indique clairement le problème

20 avr 07:26:59 myhostname sshd[31468]: abandon de la connexion #3 depuis [x.x.x.226]:54986 sur [10.0.0.11]:22 après MaxStartups

Alors, quelle est la cause de l' erreur : kex_exchange_identification: Connection closed by remote host ?

39voto

Will Munn Points 121

Curieusement, aucun n'essaie en réalité de s'authentifier pour ouvrir une session.

Certains spiders et services comme Shodan scannent les adresses ipv4 publiques pour trouver des services ouverts, par exemple des maîtres de salt, des serveurs ftp, des RDP, et également des services SSH. Ces spiders se connectent généralement aux services sans effectuer d'étapes d'authentification valides.

J'obtiens l'erreur : kex_exchange_identification: Connexion fermée par l'hôte distant dans les journaux du serveur. Quelle en est la cause ?

Je n'ai pas trouvé de réponses concluantes à ce sujet, donc... il est temps d'aller consulter la source.

Dans le code source d'OpenSSH, kex_exchange_identification est une fonction pour échanger l'identification du serveur et du client (évidemment), et l'erreur spécifiée se produit si la connexion socket entre le serveur OpenSSH et le client est interrompue (voir EPIPE), c'est-à-dire si le client a déjà fermé sa connexion.

2 votes

Lié à ceci : J'ai récemment installé ntopng et la découverte de réseau était activée. Cela a provoqué l'apparition de ces messages

1 votes

J'avais mon masque de sous-réseau comme 255.255.255.255 et j'ai besoin qu'il soit 255.255.255.0, deux jours sur ça ughh

12voto

Dave Rix Points 285

J'ai juste eu ce problème exact, et la cause était que j'avais une traduction de port se produisant en interne vers le répartiteur de charge, ce qui signifie que mes connexions ssh atteignaient l'hôte sur le port 80 au lieu du port 22.

L'hôte résiliait alors correctement les connexions, et le message d'erreur retourné à mon terminal était le suivant;

~/Documents/Projects$ ssh -vvvvA dave@xx.xx.xx.250
OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Lecture de la configuration /Users/dave/.ssh/config
debug1: Lecture de la configuration /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config ligne 47: Application des options pour *
debug2: resolve_canonicalize: nom d'hôte xx.xx.xx.250 est une adresse
debug2: ssh_connect_direct
debug1: Connexion à xx.xx.xx.250 [xx.xx.xx.250] port 22.
debug1: Connexion établie.
debug1: fichier d'identité /Users/dave/.ssh/id_rsa type 0
debug1: fichier d'identité /Users/dave/.ssh/id_rsa-cert type -1
debug1: fichier d'identité /Users/dave/.ssh/id_dsa type -1
debug1: fichier d'identité /Users/dave/.ssh/id_dsa-cert type -1
debug1: fichier d'identité /Users/dave/.ssh/id_ecdsa type -1
debug1: fichier d'identité /Users/dave/.ssh/id_ecdsa-cert type -1
debug1: fichier d'identité /Users/dave/.ssh/id_ed25519 type -1
debug1: fichier d'identité /Users/dave/.ssh/id_ed25519-cert type -1
debug1: fichier d'identité /Users/dave/.ssh/id_xmss type -1
debug1: fichier d'identité /Users/dave/.ssh/id_xmss-cert type -1
debug1: Chaîne de version locale SSH-2.0-OpenSSH_8.1
debug1: kex_exchange_identification: ligne de bannière 0: HTTP/1.1 400 Bad Request
debug1: kex_exchange_identification: ligne de bannière 1: Serveur: nginx/1.14.0 (Ubuntu)
debug1: kex_exchange_identification: ligne de bannière 2: Date: Fri, 20 Nov 2020 09:30:23 GMT
debug1: kex_exchange_identification: ligne de bannière 3: Content-Type: text/html
debug1: kex_exchange_identification: ligne de bannière 4: Content-Length: 182
debug1: kex_exchange_identification: ligne de bannière 5: Connection: close
debug1: kex_exchange_identification: ligne de bannière 6:
debug1: kex_exchange_identification: ligne de bannière 7: 
debug1: kex_exchange_identification: ligne de bannière 8: 400 Bad Request
debug1: kex_exchange_identification: ligne de bannière 9: 
debug1: kex_exchange_identification: ligne de bannière 10: 400 Bad Request
debug1: kex_exchange_identification: ligne de bannière 11: nginx/1.14.0 (Ubuntu)
debug1: kex_exchange_identification: ligne de bannière 12: 
debug1: kex_exchange_identification: ligne de bannière 13: 
kex_exchange_identification: Connexion fermée par l'hôte distant

J'ai corrigé la traduction interne du port, et maintenant le problème a disparu.

1 votes

Similaire pour moi. Le port 80 est occupé par httpd, et le serveur SSH ne signale pas d'erreur.

0 votes

Cela m'a aidé. Dans mon cas, j'avais un conteneur docker configuré pour rediriger le port 2222 vers l'hôte... mais j'exécutais par accident sshd dans le conteneur sur le port par défaut. Donc Docker disait "oui, je suis là mais rien ne se passe là-bas dans le conteneur". Il n'y avait pas de sshd en écoute sur le port 2222.

1 votes

Comment réparez-vous la traduction de port interne ? Pourriez-vous fournir quelques détails ou références

1voto

Doopz Points 111

J'ai résolu mon problème avec 'kex_exchange_identification: Connection closed by remote host' quand j'ai remarqué que j'essayais de me connecter en utilisant l'IP du serveur alors que je devrais utiliser l'IP privée.

Ma configuration est peut-être très différente de la vôtre, mais je tenais à partager ma découverte.

EDIT:

Avec certains fournisseurs d'hébergement, vous aurez deux IPs, une publique et une privée, c'est la privée que vous devriez utiliser dans ce cas.

Vous le savez ou non, je comprends que cela ne s'appliquera pas à tout le monde, c'est pourquoi je dis que cela peut être une configuration différente.

Aucune autre réponse n'a fonctionné pour moi, jusqu'à ce que j'utilise la clé privée.

0voto

Shay Points 1

Dans mon cas, j'ai utilisé des entrées manuelles /etc/hosts et j'ai utilisé un bastion comme proxy. Le bastion n'avait pas les mêmes entrées /etc/hosts, donc il a refusé le tunnel.

0voto

FrederikB Points 1

J'ai remarqué que cela m'était arrivé (dans le fichier auth.log) après avoir installé et configuré fail2ban aujourd'hui. Cela pourrait donc en être la raison.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X