Double tunnel SSH
Imaginons le scénario suivant: Vous êtes derrière un firewall et vous voulez permettre à un utilisateur externe de prendre le contrôle ou de visualiser votre écran avec VNC. Malheureusement, vous n'avez pas accès à ce firewall, et vous ne pouvez donc pas forwarder un port vers le port 5900 de votre machine.
Heureusement, vous possédez un compte sur un serveur se trouvant sur Internet. Vous pouvez utiliser ce serveur comme serveur relais en créant un tunnel inversé grâce à ssh de la façon suivante:
ssh -R 1234:localhost:5900 utilisateur@serveur.sur.le.net
Ainsi, les personnes se connectant au port 1234 du serveur.sur.le.net seront redirigées vers le port 5900 de votre machine. Cette astuce ne fonctionne que si l'option GatewayPorts est activée sur le serveur SSH du serveur.sur.le.net. Cette option autorise le serveur SSH à ouvrir le port 1234 sur toutes les interfaces du système. Si cette option n'est pas activée, utiliser le paramètre -g ou spécifier une interface dans la commande (ssh -g -R 123.234.123.234:1234:localhost:5900 utilisateur@serveur.sur.le.net) ne servira à rien car l'option -g ne fonctionne que pour les tunnels établis avec l'option -L.
Pour résoudre ce problème, il est possible d'établir un second tunnel passant par le premier tunnel:
Lancer cette commande sur le poste local:
ssh -R 1235:localhost:22 utilisateur@serveur.sur.le.net
Puis lancer cette commande sur serveur.sur.le.net:
ssh -g -L 1234:localhost:5900 utilisateur@localhost -p 1235
Ainsi, un second tunnel passant par le premier tunnel permet de rediriger le port 1234 sur le serveur public vers le port 5900 du poste local. Afin d'éviter d'encrypter les communications deux fois, le deuxième tunnel peut être établi avec l'option -c none pour désactiver l'encryption:
poste_local $ ssh -R 1235:localhost:22 utilisateur@serveur.sur.le.net utilisateur@serveur.sur.le.net $ ssh -c none -g -L 1234:localhost:5900 utilisateur@localhost -p 1235