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
2 juillet 2008
Enfin quelqu’un qui m’explique le tunneling ssh de manière à ce que je réussisse à le faire marcher !
Bravo et MERCI.
Corentin
5 juillet 2010
Hello,
Comment on coupe un tunnel établi…?
merci
A +
Rémi
5 juillet 2010
CTRL+C ? ou ps | grep ssh
Et killer le bon numéro de process ?
5 juillet 2010
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 ?
5 juillet 2010
Je lancerais la commande avec nohup en tache de fond pour ma part 😉
5 juillet 2010
Oui, sinon j’ai trouvé ces paramètres à rajouter à la commande : -f -N
ça marche aussi nickel 🙂
Merci bien 😉
5 juillet 2010
De rien, je ne t’ai pas été d’une grande aide 😉
Mais merci d’avoir posté l’info ici 😉
4 avril 2011
Enfin le tunneling ssh bien expliqué. Vraiment bien et rien à dire.
En plus j’aime bien la police Ubuntu.
@++
12 novembre 2012
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