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 user@autre.machine.ext
Plus concrètement, voici un tunnel :
ssh -L13306:localhost:3306 user@192.168.0.5
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

Articles Relatifs :


rdefaux