<p>L’erreur SSH peu utile <code>Connection closed by UNKNOWN port 65535</code> peut être signalée par votre client <code>ssh</code> dans plusieurs situations différentes lorsque le <code>sshd</code> distant ne peut pas du tout être atteint en raison de quelque chose qui se passe « au milieu ».</p>
<p>Cela peut être particulièrement difficile à déboguer car <strong>dans certains cas</strong>, le sshd distant n’a aucune idée que quelqu’un a essayé de s’y connecter.</p>
<p>(Aparté : 65535 est un nombre « spécial » pour les informaticiens car c’est <code>216 - 1</code>, alias <code>0xFFFF</code> – le nombre entier non signé maximum sur 16 bits (et aussi le numéro de port maximum))</p>
<h2><a name="p-33016-cas-a-interfrence-avant-sshd-1" class="anchor" href="#p-33016-cas-a-interfrence-avant-sshd-1" aria-label="Heading link"></a>Cas A – Interférence avant <code>sshd</code></h2>
<p>(De la question originale de <span class="mention">@doug</span>) - Dans ce cas, le sshd distant a reçu la connexion entrante et a délégué l’authentification aux bibliothèques Linux pour PAM (Pluggable Authentication Modules). PAM transmet à KRB5 ou SSS et cela échoue. Donc tout ce que le pauvre sshd distant reçoit est un gros <em>NON</em> de PAM. …il n’est jamais entré dans son analyse de protocole « normale » et la vérification d’erreurs qui lui aurait permis de retourner un message d’erreur plus utile.</p>
<p>(Il est <em>possible</em> que d’anciennes options de configuration Kerberos comme gssapiauthentication puissent se comporter de manière similaire)</p>
<p>De même, les tcp_wrappers (avec les fichiers <code>hosts.allow</code> et <code>hosts.deny</code>) sur le serveur peuvent « interférer » avec la connexion avant que sshd ne la voie.</p>
<h2><a name="p-33016-cas-b-pare-feu-2" class="anchor" href="#p-33016-cas-b-pare-feu-2" aria-label="Heading link"></a>Cas B – Pare-feu</h2>
<p>Dans notre cas, nous avons vu cela lorsque les pare-feu réseau empêchaient les connexions depuis les machines de développement/test vers les machines de staging/production.<br>
Selon votre réseau, vous pourriez obtenir plus d’informations de diagnostic avec <code>tcping 22 $remote_hostname</code>, ou (moins utile) : des tests réseau UDP comme <code>ping $remote_hostname</code>, <code>traceroute $remote_hostname</code>, ou les versions IPv6 de ces commandes. Vos ingénieurs réseau locaux peuvent aider à confirmer et corriger.</p>
<p>L’indice dans ce cas est que <code>ssh -vvv $remote_hostname</code> arrive à ce point :</p>
<pre><code class="lang-auto">debug1: identity file /home/ddickinson/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.6
</code></pre>
<p>…pause de 60 secondes (ou le délai configuré), puis :</p>
<pre><code class="lang-auto">kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
</code></pre>
<h2><a name="p-33016-cas-c-proxycommand-3" class="anchor" href="#p-33016-cas-c-proxycommand-3" aria-label="Heading link"></a>Cas C – ProxyCommand</h2>
<p>Certains types de défaillances du <code>ProxyCommand</code> auquel votre <code>ssh</code> local délègue peuvent également échouer de manière peu utile. Vérifiez les options liées à « proxy* » ou « tunnel* » dans la sortie de :</p>
<pre><code class="lang-auto">ssh -G $remote_hostname
</code></pre>
<h2><a name="p-33016-cas-d-controlpath-controlmaster-4" class="anchor" href="#p-33016-cas-d-controlpath-controlmaster-4" aria-label="Heading link"></a>Cas D – <code>ControlPath</code> / <code>ControlMaster</code></h2>
<p>(h/t <span class="mention">@shockburner</span>) Ces options de configuration du client SSH peuvent être merveilleuses quand elles fonctionnent, mais peuvent rendre le débogage plus douloureux quand elles échouent. Vérifiez ces valeurs dans la sortie de :</p>
<pre><code class="lang-auto">ssh -G $remote_hostname
</code></pre>
<p>Si Control Path/Master est configuré, le répertoire existe-t-il ? Est-il accessible en écriture ?</p>
<p>Nettoyage des ControlPaths ouverts :</p>
<pre><code class="lang-auto">ssh -O exit $remote_hostname
</code></pre>
<p>Recherche de ControlPaths orphelins/zombies :</p>
<pre><code class="lang-auto">ps -x -o 'pid,command' | grep -E '\bssh:? ' | grep -v grep
kill -s HUP <process id found above>
</code></pre>
<p>Supprimez tous les fichiers socket orphelins des emplacements ControlPath trouvés ci-dessus.</p>