461 votes

Un tunnel SSH via plusieurs sauts

La mise en place d'un tunnel de données via SSH est assez simple :

ssh -D9999 username@example.com

configure le port 9999 sur votre localhost comme un tunnel vers example.com mais j'ai un besoin plus spécifique :

  • Je travaille localement sur localhost
  • host1 est accessible à localhost
  • host2 n'accepte que les connexions provenant de host1
  • Je dois créer un tunnel à partir de localhost a host2

En fait, je veux créer un tunnel SSH "multi-sauts". Comment puis-je le faire ? Idéalement, j'aimerais faire cela sans avoir besoin d'être superutilisateur sur tout des machines.

2 votes

Pour quoi l'avez-vous utilisé ? Je veux l'utiliser pour la procuration de chaussettes. Cela fonctionnera-t-il ?

2 votes

Oui, vous devriez pouvoir utiliser la connexion tunnelée comme un proxy SOCKS, à moins que host2 refuse le transfert

0 votes

J'ai pensé à créer une enveloppe sur SSH qui permettrait de mettre en place ce système en utilisant plusieurs fois ProxyCommand.

16voto

Cheryl Points 119

J'ai fait ce que j'ai pensez à que vous vouliez faire avec

ssh -D 9999 -J host1 host2

On me demande les deux mots de passe, puis je peux utiliser localhost:9999 pour un proxy SOCKS vers host2. C'est ce qui se rapproche le plus, à mon avis, de l'exemple que vous avez montré en premier lieu.

1 votes

Cela a parfaitement fonctionné !

0 votes

N'a pas fonctionné pour trois hôtes

13voto

Stephen Quan Points 456

Ma réponse est en fait la même que toutes les autres réponses ici, mais, je voulais clarifier l'utilité de ~/.ssh/config et ProxyJump.

Imaginons que je doive atteindre une destination en trois sauts et que, pour chaque saut, j'aie besoin d'un nom d'utilisateur, d'un hôte, d'un port et d'une identité spécifiques. En raison des critères d'identité, ceci ne peut être fait qu'avec la fonction ~/.ssh/config fichier de configuration :

Host hop1
    User user1
    HostName host1
    Port 22
    IdentityFile ~/.ssh/pem/identity1.pem

Host hop2
    User user2
    HostName host2
    Port 22
    IdentityFile ~/.ssh/pem/identity2.pem
    ProxyJump hop1

Host hop3
    User user3
    HostName host3
    Port 22
    IdentityFile ~/.ssh/pem/identity3.pem
    ProxyJump hop2

Depuis votre ordinateur, vous pouvez tester chaque saut individuellement, c'est-à-dire

[yourpc] $ ssh hop1 # will go from your PC to host1 in a single step
[host1] $ exit
[yourpc] $ ssh hop2 # will go from your PC to host2 via host1 (i.e. two steps)
[host2] $ exit
[yourpc] $ ssh hop3 # will go from your PC to host3 via host1 and host2 (i.e. three steps)
[host3] $ exit
[yourpc] $ 

Une autre chose cool à propos du ~/.ssh/config est que cela permettra également sftp transferts de fichiers via n'importe quelle série de sauts, par ex.

[yourpc] $ sftp hop1 # for file transfers between your PC and host1
Connected to hop1.
sftp> quit
[yourpc] $ sftp hop2 # for file transfers between your PC and host2
Connected to hop2.
sftp> quit
[yourpc] $ sftp hop3 # for file transfers between your PC and host3
Connected to hop3.
sftp> quit

9voto

silviot Points 331

Cette réponse est similaire à celle de kynan, car elle implique l'utilisation de ProxyCommand. Mais c'est plus pratique à utiliser IMO.

Si netcat est installé sur vos machines hop, vous pouvez ajouter cet extrait à votre ~/.ssh/config :

Host *+*
    ProxyCommand ssh $(echo %h | sed 's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /') nc $(echo %h | sed 's/^.*+//;/:/!s/$/ %p/;s/:/ /')

Puis

ssh -D9999 host1+host2 -l username

fera ce que vous avez demandé.

Je suis venu ici pour chercher l'endroit original où j'ai lu cette astuce. Je posterai un lien quand je l'aurai trouvé.

2 votes

Je crois que c'est l'origine de ce tour : wiki.gentoo.org/wiki/SSH_jump_host

4voto

rasx Points 1858
ssh -L 9999:host2:80 -R 9999:localhost:9999 host1

-L 9999:host2:80

Cela signifie que l'on se lie à localhost:9999 et que tout paquet envoyé à localhost:9999 est transmis à host2:80.

-R 9999:localhost:9999

Signifie que tout paquet reçu par host1:9999 le renvoie à localhost:9999

0 votes

Brillant, la réponse la plus simple est de créer un tunnel pour que vous puissiez accéder à l'application sur l'hôte 2 directement depuis localhost:9999.

0 votes

Après cette réponse, je reçois un channel 3: open failed: administratively prohibited: open failed message d'erreur.

3voto

Vladimir Iashin Points 121

C'est la seule chose qui m'a aidé sur plus de deux hôtes :

ssh -L 6010:localhost:6010 user1@host1 \
-t ssh -L 6010:localhost:6010 user2@host2 \
-t ssh -L 6010:localhost:6010 user3@host3

Il vous demandera trois mots de passe.

Inspiré par cette réponse

0 votes

Ssh -L 33033:localhost:33032 user1@host1 -t ssh -L 33032:localhost:3306 user2@host2

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