Question Transférer le trafic SSH via une machine intermédiaire


Le tunnel SSH est très déroutant pour moi. Je me demande si je peux le faire sous Linux.

J'ai 3 machines ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Donc, je peux SSH de A -> B et de B -> C, mais pas de A -> C.

Existe-t-il un moyen de configurer un tunnel SSH de A à B, alors quand je lance d'autres commandes SSH, elles fonctionnent simplement à partir de mon ordinateur local A? J'essaie essentiellement de cloner un repo git du travail à la maison (et je ne peux pas installer git sur la machine B).

Aussi, une fois l'installation .. Comment pourrais-je le désinstaller aussi?


102
2018-02-11 03:58


origine


Je crois qu'il y a une question en double quelque part, mais mon moteur de recherche est faible aujourd'hui. - quack quixote
ce serait le mien: superuser.com/questions/96489/ssh-tunnel-via-multiple-hops - Mala


Réponses:


Placez ceci dans votre .ssh/config fichier sur hostA (voir man 5 ssh_config pour plus de détails):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Maintenant, la commande suivante passera automatiquement à travers l’hôte

hostA:~$ ssh hostC

Vous aimerez peut-être ajouter des options comme -oCiphers=arcfour et -oClearAllForwardings=yes pour accélérer les choses, depuis l'emballage ssh à l'intérieur ssh C’est plus coûteux en termes de calcul et l’effort supplémentaire, et le wrapper n’a pas besoin d’être aussi sécurisé quand il tunnelise du trafic déjà chiffré.


Si vous utilisez OpenSSH avant la version 5.3, le -W l'option n'est pas disponible. Dans ce cas, vous pouvez implémenter ce qui précède en utilisant netcat (nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

119
2018-02-11 04:11



C'est génial! Je vous remercie. Cela résout un problème qui me préoccupe depuis 2 jours: hostC se trouve derrière un pare-feu et dispose de données auxquelles je souhaite accéder depuis hostA, un ordinateur portable pouvant être n'importe où dans le monde. hostB se trouve également derrière le même pare-feu avec hostC, mais son port SSH est ouvert sur le monde. Ainsi je peux ssh de hostC -> hostB. J'ai configuré un tunnel SSH inversé entre hostC et hostB, donc je peux aussi ssh depuis hostB -> hostC (transféré via localhost). Avec votre astuce, je peux aller de hostA -> hostC! Il fonctionne parfaitement avec SCP & Fugu sur OSX! Je vous remercie! - AndyL
le -W l'option devrait être utilisée à la place de la nc option. - vy32
Quel SSH devrait supporter -W, seulement celui sur hostA (l'origine) ou aussi celui sur hostB (la machine du milieu)? - gioele
Pour plus d'informations, si vous avez plusieurs hôtes, vous devez les atteindre via le même hostB, il est possible de déclarer multiples Host hostC des lignes au dessus du ProxyCommand Il est donc très facile d’accéder à plusieurs hôtes via le serveur intermédiaire. - fduff


Edit: Ceci est la mauvaise approche. Voir réponse éphémère au lieu. Cette réponse fonctionnera, mais est potentiellement moins sûre et certainement moins géniale.

On dirait que vous voulez une solution comme celle-ci:

ssh -L localhost:22:machinec:22 machineb

Cela va vous faire une coquille machineb. Laisse ça tranquille minimiser la fenêtre du terminal.

Maintenant, chaque fois que vous faites une connexion ssh à localhost, vous serez effectivement connecté à machinec par machineb. Lorsque vous avez terminé avec le tunnel, fermez simplement le terminal dans lequel vous avez exécuté la commande ci-dessus.

Notez que vous aurez besoin des privilèges du superutilisateur pour exécuter la commande.


6
2018-02-11 04:11



+1 Merci Wesley. C'est la vraie réponse de tunneling ssh. Voici un article à ce sujet: securityfocus.com/infocus/1816 - Larry K
Dans l'ensemble, c'est assez diabolique ... mais j'ai dû le faire avec d'anciennes versions d'OpenSSH ou d'autres clients ssh. Vous pouvez choisir un port haut comme 8022: de cette façon, il n'interfère avec aucun service ssh sur localhost et n'exige pas d'être exécuté en tant que root. Ajoutez simplement -p 8022 à vos commandes ssh. Et c'est facile avec git: utilisez l'URI ssh://localhost:8022/path/to/repo.git. - ephemient


On dirait que vous voulez un alias de shell sur A qui provoque l'apparition de ssh sur C

  1. Je suppose que sur A, vous pouvez taper ssh me @ b "ssh me @ c hostname" et récupérer "C"
  2. Faire un alias sshc qui développe sshc foo en ssh me @ b "ssh me @ c foo"
  3. Pour la syntaxe exacte de la création de l'alias, consultez superuser.com

3
2018-02-11 04:04



Vous devrez peut-être ajouter -t aux options externes de ssh si vous voulez un shell interactif, depuis ssh assume -T si on lui donne une commande. - ephemient


Si votre employeur fournit un VPN, je vous recommande plutôt de l'utiliser.

De cette façon, vous ne devrez configurer aucune application (même ssh), et vous pourrez voir n'importe quelle machine derrière le pare-feu. De plus, tout votre trafic sera crypté par le logiciel VPN, ce qui ajoutera de la sécurité à tout trafic non crypté par inadvertance ou délibérément.


0
2018-02-11 20:14



Parfois, c'est le VPN qui est la raison pour laquelle nous avons besoin de ces astuces ... - Louis


YASS encore une autre solution simple

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • La première commande ouvre une connexion ssh à HostB et de dire HostB transférer des connexions de localhost: 2222 à HostC: 22.
  • la -f paramètre dire à SSH d'aller en arrière-plan une fois la connexion établie
  • La deuxième commande ouvre simplement une connexion client à localhost: 2222
  • Option HostKeyAlias ne sont pas nécessaires, mais peuvent empêcher la connexion à un hôte incorrect
  • Nota: commande sleep 10 sont nécessaires pour maintenir la connexion jusqu'à ce que la deuxième commande ssh utilise le port transféré. Alors d'abord ssh se fermera quand seconde ssh laisser le port transféré.

vous pouvez maintenant exécuter les sessions ssh suivantes:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Une variante:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Les sessions ssh suivantes pourraient être ouvertes en exécutant:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Le principal avantage de l'utilisation de -M et -S param est qu'une seule connexion est ouverte de HostA à HostC, la session suivante ne s'authentifiera plus et s'exécutera beaucoup plus rapidement.


0
2017-11-10 15:35