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 [email protected] (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 [email protected]
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 [email protected]_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 [email protected]_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 responsable d'Odiso (hébergeur web spécialiste des infrastructures haute disponibilité e-commerce et en gestion de pics de trafic & webperf) je tiens ce blog depuis 9 ans avec beaucoup moins d'assiduité malheureusement qu'à ses débuts, car j'écris aussi sur MonSiteEstLent.com blog d'Odiso dédié à la webperf

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 de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.