Tunnel SSH, port forwarding

J’ai retravailler cet article pour qu’il soit plus lisible et j’ai ajouter des exemples à la fin.

Définition :
Port forwarding, qu’est-ce que c’est ? C’est en gros, dire qu’un port de notre machine = un autre port. Et cet autre port peut-être un port différent sur une machine différente.

Comment ça marche ?
Sous linux, c’est avec la bonne vieille commande ssh.

Exemple :
ssh -Lport:host:autreport [email protected]
Plus concrètement, voici un tunnel :
ssh -L13306:localhost:3306 [email protected]
Cette commande passe bien entendu via le port 22 (ssh), cela signifie qu’on peut se connecter à n’importe quel port d’une machine distante qui n’a que le port 22 d’ouvert (encore faut-il avoir le mot de passe ^^).
(Avec l’option -X, on peut aussi forwarder la sortie du serveur X.)

Ce qui est puissant aussi, lorsq’un tunnel comme ça est en place, c’est qu’on peut ensuite recréer un deuxième tunnel, qui forwarde le port sur lequel on arrive sur un autre port d’une machine distante. Ca s’appelle faire un rebond, et c’est utile lorsqu’une machine n’est joignable que via une autre machine précise. On se connecte sur la machine précise, puis on se connecte à l’autre. Et la magie opère, on a accès « en local » à tous les ports de cette machine distante joignable que depuis une autre machine et dont tous les ports sont fermés sauf le ssh (qui pour des raisons évidentes de sécurité ne sera pas sur le port 22, et sur laquelle tournera un bon vieux fail2ban).
NB : ça fait comme dans les mauvais films de piratages, quand la NSA traque un pirate et remonte à sa connection et là se rend compte que le type n’est pas là mais à fait un rebond, puis un autre, puis un autre…

Hmm… Je ne sais pas si c’est clair, alors je vais essayer de l’expliquer différemment :

Dans un premier temps :
ssh -L13306:localhost:13306 user1@machine1 (là je suis connecté en ssh sur la machine 1, sauf qu’en plus un tunnel existe)
-> mon port 13306 = le port 13306 d’une machine distante 1. C’est à dire que quand une de mes application dialogue avec le port 13306 en local, elle dialogue en réalité avec le port 13306 de la machine 1.

Ensuite (donc depuis machine1) :
ssh -L13306:localhost:3306 user2@machine2
le port 13306 de la machine 1 = le port 3306 de la machine 2 qui n’est accessible que depuis la machine 1.
Ce qui signifie que quand une de mes application dialogue en local avec le port 13306, elle dialogue en fait avec le port 13306 de la machine 1, qui est en réalité (ou en virtualité ?) le port 3306 de la machine 2.

Toujours, pour plus d’info : man ssh. Et aussi faire joujou et bidouiller.

C’est possible aussi de créer un tunnel à l’aide de putty, il faut aller dans dans Connection -> SSH -> Tunnels

Exemples d’application :

Se connecter à une base MySQL distante qui n’écoute qu’en localhost :
ssh 13306:localhost:3306 user@serveur_mysql
Puis sur son client en local, pour se connecter à cette base :
mysql -h localhost -P 13306 -u user -p

Se connecter en Terminal Server sur une machine derrière un pare-feu :
ssh 13389:localhost:3389 user@serveur_TSE
Puis sur son Terminal Server client en local :
localhost : 13389
protocole : RDP

Author: Pierre-Yves Dubreucq

Passioné par les logiciels libres depuis 2001, je suis VP Bare Metal (Dedibox) chez Scaleway. Je tiens ce blog depuis 13 ans avec beaucoup moins d'assiduité malheureusement qu'à ses débuts, mais bon, le temps est une denrée rare.

Share This Post On

9 Comments

  1. Enfin quelqu’un qui m’explique le tunneling ssh de manière à ce que je réussisse à le faire marcher !

    Bravo et MERCI.

    Corentin

    Post a Reply
  2. Hello,
    Comment on coupe un tunnel établi…?

    merci
    A +
    Rémi

    Post a Reply
  3. Hmm yes OK.
    Et pour le garder actif alors ?
    Je voudrais être sûr que mon tunnel reste actif pendant 48 heures, mais si je le lance à partir d’une console SSH à distance, comment être sûr que cette session ne soit pas tuée ?

    Post a Reply
  4. Oui, sinon j’ai trouvé ces paramètres à rajouter à la commande : -f -N
    ça marche aussi nickel 🙂
    Merci bien 😉

    Post a Reply
  5. Enfin le tunneling ssh bien expliqué. Vraiment bien et rien à dire.

    En plus j’aime bien la police Ubuntu.

    @++

    Post a Reply
  6. Bjr,
    peux t’on forwarder un port sans ssh?
    uniquement renvoyer le trafic qui arrive sur le port de la machine linux vers une autre machine. Y a t’il une commande pour faire cela?
    Merci

    Post a Reply

Submit a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *