web-dev-qa-db-fra.com

Trafic SSH direct via une machine du milieu

La tunnelisation SSH m’embrouille énormément. 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 afin que, lorsque j'exécute d'autres commandes SSH, elles fonctionnent uniquement à partir de la 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).

En outre, une fois l'installation .. Comment puis-je le désactiver aussi?

109
PKKid

Placez ceci dans votre fichier .ssh/config 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 va automatiquement tunneler à travers hostB

hostA:~$ ssh hostC

Vous voudrez peut-être ajouter des options telles que -oCiphers=arcfour et -oClearAllForwardings=yes pour accélérer les choses, étant donné que l'encapsulation de ssh dans ssh est plus onéreuse en termes de calcul et que l'effort supplémentaire requis pour l'encapsuleur n'a pas besoin d'être aussi sécurisé lorsqu'il tunnelise du trafic déjà crypté.


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

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

Edit: C'est la mauvaise approche. Voir à la place la réponse de éphémient . Cette réponse fonctionnera, mais est potentiellement moins sécurisée et certainement moins impressionnante.

Il semble que vous souhaitiez une solution semblable à celle-ci:

ssh -L localhost:22:machinec:22 machineb

Cela vous donnera un Shell sur machineb. Laisse ça tranquille; minimiser la fenêtre du terminal.

Maintenant, chaque fois que vous établissez une connexion ssh avec localhost, vous serez réellement connecté à machinec à 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.

6
Wesley

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

  1. Je suppose que sur A, vous pouvez taper ssh moi @ b "ssh moi @ c nomhôte" et récupérer "C"
  2. Créez un alias sshc qui étend sshc foo en ssh me @ b "ssh me @ c foo"
  3. Pour connaître la syntaxe exacte de création de l’alias, consultez superuser.com.
3
Larry K

Pour Shell interactif, vous pouvez utiliser cette commande simple:

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

Les options -J sont pour sauter .

1
ssasa

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 dit HostB pour transférer les connexions de localhost: 2222 à HostC: 22 .
  • le paramètre -f indique à SSH de passer en arrière-plan une fois la connexion établie
  • La deuxième commande ouvre simplement une connexion client à localhost: 2222
  • Option HostKeyAlias ​​ n'est pas obligatoire, mais peut aider à empêcher la connexion à un hôte incorrect.
  • Note: La commande sleep 10 est nécessaire pour maintenir la connexion jusqu'à ce que la seconde commande ssh utilise le port transféré. Ensuite, le premier ssh sera fermé lorsque le second ssh quittera 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 peuvent être ouvertes en exécutant:

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

Le principal avantage de l'utilisation des paramètres -M et -S est qu'une seule connexion est ouverte d'HostA à HostC. La session suivante ne s'authentifiera pas et ne sera pas exécutée beaucoup plus rapidement.

0
F. Hauri

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

De cette façon, vous n’aurez à configurer aucune application spécialement (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 renforcera la sécurité de tout trafic accidentellement ou délibérément non crypté.

0
Andrew Wagner

Cas particulier, plates-formes nix mixtes:

hostA (linux) -> HostB (solaris) -> HostC (linux)

Si besoin d'une application X sur hostC, et que le saut intermédiaire est sur la boîte Solaris ... dans ce cas, j'ai trouvé le netcat (nc) nécessaire sur la commande de proxy comme suit:

hostA: ~ $ vi .ssh/config:

 Hôte hostC 
 ProxyCommand ssh hostB nc% h% p # où nc est netcat 

Puis le tunneling automatique fonctionne:

hostA: ~ $ ssh hostC

0
nsysdcw