Ubuntu Server 14.04 - Comment réparer à distance le “tuyau cassé” openssh?

1

Je viens de configurer un serveur Ubuntu et de le configurer via SSH en utilisant openssh sur le serveur. J'ai dû redémarrer et je ne peux pas me connecter via SSH à cause d'une Write failed: Broken pipeerreur.

En ce qui concerne mes recherches ( https://wiki.archlinux.org/index.php/SFTP_chroot - Dépannage, première entrée), il s’agit d’un problème de propriété avec ChrootDirectory. Je me suis probablement trompé lors de la configuration du serveur Web Apache.

Quoi qu'il en soit, je ne peux plus me connecter via SSH avec mon nom d'utilisateur. Malheureusement, je n'ai qu'un utilisateur, je ne peux donc pas en utiliser un autre. Existe-t-il un moyen pour moi de corriger la propriété ou les paramètres openssh sans accès physique au serveur? Merci!

Essayer de se connecter avec les options de débogage montre:

ssh -v [email protected]
OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 123.123.123.123 [123.123.123.123] port 22.
debug1: Connection established.
debug1: identity file /home/username/.ssh/id_rsa type -1
debug1: identity file /home/username/.ssh/id_rsa-cert type -1
debug1: identity file /home/username/.ssh/id_dsa type -1
debug1: identity file /home/username/.ssh/id_dsa-cert type -1
debug1: identity file /home/username/.ssh/id_ecdsa type -1
debug1: identity file /home/username/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/username/.ssh/id_ed25519 type -1
debug1: identity file /home/username/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.4
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.4 pat OpenSSH_6.6.1* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr [email protected] none
debug1: kex: client->server aes128-ctr [email protected] none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA ...
debug1: Host '123.123.123.123' is known and matches the ECDSA host key.
debug1: Found key in /home/username/.ssh/known_hosts:7
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/username/.ssh/id_rsa
debug1: Trying private key: /home/username/.ssh/id_dsa
debug1: Trying private key: /home/username/.ssh/id_ecdsa
debug1: Trying private key: /home/username/.ssh/id_ed25519
debug1: Next authentication method: password
[email protected]'s password: 
debug1: Authentication succeeded (password).
Authenticated to 123.123.123.123 ([123.123.123.123]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
Write failed: Broken pipe
Dominic
la source

Réponses:

0

Dans mon cas, la cause s'est avérée être une interaction entre un VPN et un modem DSL dodgy avec un transfert de port SSH externe.

Scénario

Installer:

  • 192.168.0.0/24 est le réseau local
  • 192.168.1.0/24 est le réseau client VPN
  • serveur1 (192.168.0.3) est le serveur VPN
  • Le modem DSL (192.168.0.10) est le routeur par défaut pour tous les hôtes.
  • Le modem DSL a un itinéraire statique qui envoie le trafic VPN (c'est-à-dire destiné au 192.168.1.0/24) au serveur 1.
  • Dans la configuration du modem DSL, le port TCP 22 est transféré au serveur1.
  • Dans la configuration du modem DSL, le port VPN est transféré au serveur1.
  • server2 (192.168.0.223) est le serveur sur lequel j'essaie de SSH

Le symptôme était que, lors de l'établissement de la connexion, le côté client disait toujours "Échec de l'écriture: canal cassé" après la vérification du mot de passe ou de la clé. Cela s'est produit juste après l' debug1: Sending command: ...étape. J'ai activé la journalisation détaillée sur le serveur, et il est indiqué que le client a envoyé une réinitialisation TCP.

Une analyse

J'ai testé avec Wireshark et j'ai trouvé ceci cette séquence s'est produite:

 23.002349   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=643508643 TSER=0 WS=8
 23.080714  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1369 TSV=1628354 TSER=643508643 WS=7
 23.080743   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=643508663 TSER=1628354
 23.399242  192.168.0.223 -> 192.168.1.6   SSH Server Protocol: SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u1\r
 23.399267   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1 Ack=40 Win=5888 Len=0 TSV=643508742 TSER=1628434
 23.399606   192.168.1.6 -> 192.168.0.223  SSH Client Protocol: SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze8\r
 23.479613  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=40 Ack=42 Win=29056 Len=0 TSV=1628454 TSER=643508742
 23.479638   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Key Exchange Init
 23.488855  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Key Exchange Init
 23.528382   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=890 Ack=960 Win=8960 Len=0 TSV=643508775 TSER=1628455
 23.607196  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=960 Ack=890 Win=31872 Len=0 TSV=1628486 TSER=643508762
 23.607218   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Diffie-Hellman GEX Request
 23.714323  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Diffie-Hellman Key Exchange Reply
 23.714367   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=914 Ack=1240 Win=10752 Len=0 TSV=643508821 TSER=1628512
 23.732326   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Diffie-Hellman GEX Init
 23.837671  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Diffie-Hellman GEX Reply
 23.876369   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1186 Ack=2088 Win=13568 L
 23.934571   192.168.1.6 -> 192.168.0.223  SSHv2 Client: New Keys
 24.052445  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2088 Ack=1202 Win=33664 Len=0 TSV=1628598 TSER=643508876
 24.052465   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=52
 24.130296  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2088 Ack=1254 Win=33664 Len=0 TSV=1628617 TSER=643508906
 24.131032  192.168.0.223 -> 192.168.1.6   SSHv2 Encrypted response packet len=52
[...]
 29.775083   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=136
 29.897679  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2728 Ack=2586 Win=39936 Len=0 TSV=1630059 TSER=643510336
 30.986259  192.168.0.223 -> 192.168.1.6   SSHv2 Encrypted response packet len=52
 30.986704   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=136
 31.066976  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2780 Ack=2722 Win=41600 Len=0 TSV=1630351 TSER=643510639
 31.068851   192.168.0.10 -> 192.168.1.6   SSH Encrypted response packet len=88
 31.068874   192.168.1.6 -> 192.168.0.10   TCP 56677 > ssh [RST] Seq=1 Win=0 Len=0
 61.015948   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=68
 61.094573  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [RST] Seq=2780 Win=0 Len=0

Ce qui se passe ici, c'est que tout (certains détails omis) va bien jusqu'à la deuxième marque 31.066976 (où server2 envoie un ACK pour une requête). Mais ensuite, le paquet suivant (à 31.068851) provient de THE DSL MODEM, ce qui oblige bien sûr mon ordinateur portable à lui envoyer un protocole TCP RST (réinitialisation de la connexion) lui indiquant qu’il utilise une ancienne connexion ou autre. (Je sais que cela était lié, car le RST est envoyé depuis le port 56677.)

MAIS, le modem DSL semble renvoyer cette réinitialisation au serveur1, qui tue bien sûr la connexion SSH réelle. Ainsi, après un délai d'attente de 30 secondes (à 61.015948), mon ordinateur portable tente d'envoyer une autre demande n'ayant aucune réponse sur la connexion TCP réelle à la demande à 30.986704. Naturellement, server1 lui envoie ensuite un TCP RST car il avait déjà abandonné cette connexion. D'où l' Write failed: Broken pipeerreur sur mon ordinateur portable.

Conclusion

Le modem DSL voit la moitié de la connexion, c’est-à-dire les paquets de réponse du serveur2 et les transmet au serveur1 sous forme de trafic VPN. Mais au moins certains de ces paquets sont interprétés d'une certaine manière par le modem DSL, car ils envoient des réponses aléatoires (à l'aide de SSHv1 en passant). Notez que le modem DSL ne peut pas voir le paquet à 30.986704, car cela sort du tunnel sur le serveur1 et est envoyé via le réseau local au serveur2. Donc, je ne suis pas vraiment sûr de ce qui se passe.

solution de contournement

J'ai ajouté une route statique sur server2 pour 192.168.1.0/24 avec la passerelle 192.168.0.3 (server1), ce qui évite le trafic de réponse pour les clients VPN passant par le modem DSL. Problème résolu.

PS - Pour les débutants en TCP, n'oubliez pas que des messages ACK distincts ne sont envoyés que s'il n'y a pas de données de réponse disponibles à envoyer dans un intervalle défini; s'il existe, l'indicateur ACK est simplement défini sur ce message de données.

Alastair Irvine
la source