122 votes

Transférer le trafic SSH à travers une machine intermédiaire

Le tunneling SSH est très confus 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.

Je peux donc 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, de sorte que lorsque je lance d'autres commandes SSH, elles ne fonctionnent qu'à partir de ma machine locale A ? J'essaie essentiellement de cloner un dépôt git du travail à la maison (et je ne peux pas installer git sur la machine B).

Aussi, une fois installé Comment pourrais-je le dérégler aussi ?

141voto

posipiet Points 371

Placez ceci dans votre .ssh/config sur l'hôte A (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 va automatiquement créer un tunnel à travers l'hôte B.

hostA:~$ ssh hostC

Vous pouvez ajouter des options comme -oCiphers=arcfour y -oClearAllForwardings=yes pour accélérer les choses, puisque l'emballage ssh à l'intérieur de ssh est plus coûteux en termes de calcul et d'effort supplémentaire, et le wrapper n'a pas besoin d'être aussi sécurisé lorsqu'il tunnelise un trafic déjà crypté.


Si vous utilisez un OpenSSH antérieur à la version 5.3, l'option -W n'est pas disponible. Dans ce cas, vous pouvez mettre en œuvre ce qui précède en utilisant netcat ( nc ) :

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

7voto

DonX Points 133

Edit : C'est la mauvaise approche. Voir Réponse de l'éphémère à la place. Cette réponse fonctionnera, mais elle est potentiellement moins sûre et certainement moins géniale.

On dirait que vous voulez une solution comme la suivante :

ssh -L localhost:22:machinec:22 machineb

Cela vous donnera un Shell sur machineb . Ne touchez à rien ; réduisez la fenêtre du terminal.

Maintenant, chaque fois que vous faites une connexion ssh à localhost vous serez en fait connecté à machinec par le biais de 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 de superutilisateur pour exécuter la commande.

6voto

gavit Points 189

Pour le Shell interactif, vous pouvez utiliser cette commande simple :

ssh -J <user>@<hostB> <user>@<hostC>

L'option -J sert à saut .

3voto

FunkTheMonk Points 101

Il semble que vous vouliez un alias 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 obtenir "C" en retour.
  2. Créer 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.

2voto

Peque Points 901

Alternativement, puisque OpenSSH 7.3 introduit un ProxyJump directive :

Host final
  ProxyJump intermediate

En exemple :

Host intermediate
  Hostname 10.0.0.42
  User root
Host final
  Hostname final.destination.com
  User foo
  ProxyJump intermediate

Puis ssh final va sauter à travers la machine intermédiaire.

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