2 votes

Problème de renversement de tunnel SSH Apple

J'ai essayé de mettre en place un tunnel SSH inversé de l'extérieur de mon réseau vers chez moi, mais je n'ai pas avancé. Ma configuration est entièrement Apple : deux Mac derrière un Airport Extreme, l'un à x.x.x.20 écoutant sur le port 22 et l'autre à x.x.x.30 écoutant sur le port 10,022. J'ai configuré le NAT sur l'AP pour rediriger les ports externes 22 vers x.x.x.20 et 10,022 vers x.x.x.30. Je veux que le tunnel fonctionne jusqu'à x.x.x.20:10022.

J'ai utilisé cette commande depuis un appareil Apple à l'extérieur de mon réseau domestique : ssh -v -f -N -R 22:localhost:10022 homeuser@myhomedoman.com ainsi que ssh -v -f -N -R 10022:localhost:22 homeuser@myhomedoman.com mais de toute façon, les journaux sur la machine écoutant x.x.x.20:22 montrent que le trafic lui est dirigé et la machine écoutant x.x.x.30:10022 ne montre pas d'enregistrement dans le fichier secure.log. J'ai même essayé ssh -v -f -N -R 10022:localhost:10022 homeuser@myhomedoman.com et le trafic atteint toujours la machine écoutant x.x.x.20:22.

La chose étrange est que lorsque j'exécute ssh -p 10022 homeuser@myhomedoman.com, il se connecte parfaitement à la machine écoutant x.x.x.30:10022. J'ai vérifié toutes les règles NAT dans l'Airport et il n'y a qu'une seule règle couvrant le port 10022, donc ce n'est pas un problème de NAT en ce qui concerne la configuration de l'AP.

Soit je fais quelque chose de vraiment mal, soit il y a un bogue dans l'implémentation par Apple des tunnels SSH inversés, soit l'Airport fait quelque chose d'étrange avec le trafic. Est-ce que quelqu'un d'autre a rencontré ce problème ou trouvé une solution de contournement ?

Le guide que je suis pour faire fonctionner le tunnel inversé se trouve sur http://www.vdomck.org/2005/11/reversing-ssh-connection.html

Merci d'avance!

2voto

jaume Points 13186

Pour éviter toute confusion, je vais appeler:

  • x.x.x.20 -> local1
  • x.x.x.30 -> local2
  • Appareil Apple en dehors de votre réseau domestique -> remote1

Vous dites:

J'ai configuré le NAT sur l'AP pour rediriger les ports externes 22 vers x.x.x.20 et 10022 vers x.x.x.30.

ce que j'interprète ainsi:

                 ________                 +-----------------+         +-----------+
                /        \ -  port 22 ----|-----------------|------>  | local1:22 |                                  
+---------+    (          )               |                 |         +-----------+
| remote1 | -  ( Internet )               | Airport Express |                                     
+---------+    (          )               |                 |         +--------------+
                \________/ -  port 10022 -|-----------------|------>  | local2:10022 |  
                                          +-----------------+         +--------------+

C'est-à-dire que local2 est accessible sur [adresse IP publique de l'Airport Extreme]:10022.

Cependant, les commandes ssh que vous exécutez dans votre question utilisent le port SSH par défaut (c'est-à-dire 22/tcp) et se connectent à local1:22 (plus précisément: elles se connectent à [adresse IP publique de l'Airport Extreme]:22, qui transfère la connexion vers local1:22).

Vous devez modifier la commande ssh que vous exécutez sur remote1 comme ceci (remarquez l'option -p 10022):

remote1$ ssh -p 10022 -f -N -R 2222:localhost:22 [nom d'utilisateur sur local2]@[adresse IP publique de l'Airport Extreme]

-p 10022 indique à ssh sur quel port se connecter, tandis que 2222:localhost:10022 indique à ssh d'allouer un socket sur local2 pour écouter le port 2222 et renvoyer tout paquet envoyé à ce port au port 22 sur remote1:

 +------------+                         +----------------------+
 |            |                         |                      |
 | remote1:xx | -- SSH (port 10022)-->  | local2:10022 (SSH)   |
 |            |                         |                      |
 | remote1:22 | <--- SSH tunnel ------  | local2:2222 (alloc'd |
 |            |                         |              par ssh) |
 +------------+                         +----------------------+

Maintenant, vous pouvez accéder à remote1 depuis local2 comme suit:

 local2$ ssh -p 2222 utilisateuràdistance@localhost

(Vous utilisez -f dans votre commande qui envoie ssh en arrière-plan. Le processus sshd qui se lie au port 2222 et s'exécute sur local2 continuera à s'exécuter même si vous arrêtez la connexion distante dans les Préférences Système:

Description de l'image ici

Pour l'arrêter, listez-le:

local2$ lsof -i | grep 2222
local2$ sshd   855 jaume   14u  IPv6 0x4857f   0t0  TCP localhost:2222 (LISTEN)

et tuez-le avec kill :

local2$ tuer 855

où PID est la deuxième valeur dans la ligne de sortie de lsof.)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X