Tunnel SSH avec l'option -R
Par Yannick le vendredi, 17 février 2006, 23:27 - Sécu - Lien permanent
Ce billet présente l'utilisation de l'option -R de la commande ssh qui permet par exemple de monter une connexion SSH dans le sens inverse.
Pour illustrer cette option, prenons le cas ou le "support" doit prendre la main en SSH sur la machine du "client"..mais sans que le "client" ne soit contraint d'autoriser dans son FireWall une connexion entrante vers le port SSH de son serveur.
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
- Le petit dessin illustrant la communication de l'exemple ci-dessous:

- Blocage de l'accès en SSH à distance vers "client" (simulation d'un FireWall)
ListenAddress 127.0.0.1 dans le /etc/ssh/sshd_config de "client"
yannick@client:~$ netstat -ant|grep 22
tcp 0 0 127.0.0.1:22 0.0.0.0:* LISTEN
yannick@client:~$
Il est donc impossible à une autre machine distante, de se connecter de manière "normale" sur le port 22 de "client"...
- Rien de spécial pour l'instant sur la machine "support":
yannick@support:~$ netstat -ant |grep 1111
yannick@support:~$
- On fait lançer (par le client) la commande "ssh -R" sur la machine "client":
ssh -R port-distant:HOSTNAME:port-local machine-distante
yannick@client:~$ ssh -R 1111:127.0.0.1:22 support
...on entre le mot de passe de "support"...on est connecté a "support"....
- Sur la machine "support":
... on a désormais le port 1111 d'ouvert:
yannick@support:~$ netstat -ant |grep 1111
tcp 0 0 127.0.0.1:1111 0.0.0.0:* LISTEN
yannick@support:~$
...en se connectant sur le port 1111 de "support" on arrive donc sur le port 22 du "client":
yannick@support:~$ ssh -p1111 127.0.0.1
...demande le mot de passe de "client"...on est connecté sur le ssh de "client"
- Fin:
Il suffira au "client" de faire exit et un CTRL+C pour couper la connexion du "support"
yannick@client:~$ Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.
yannick@support:~$
- La même chose en graphique avec putty:
- Il est à noter qu'il est possible de maintenir le tunnel ouvert même en quittant la session en utilisant screen.

Commentaires
Merci pour ces deux tutos, j'utilisais déjà -L mais -R est très puissant aussi et permet de se connecter à sa machine même lorsqu'elle est derrière un proxy en DHCP :)
Pareil.. des années que j'utilise -L mais j'avais jamais fais gaffe au -R jusqu'a récemment :)
Merci, c'est le meilleur article en français que j'ai trouvé pour résoudre mon problème :)
Tu devrais aussi toucher un mot de l'utilisation de screen pour que le tunnel puisse rester en place après que le client se soit déconnecter... à moins qu'il y ait un meilleur moyen de faire ça.
J'ai cependant une question : est-il possible de créer un script à mettre dans inet.d pour que le tunnel se recréé automatiquement à chaque reboot ou cette opération ne peut être effectuée que manuellement ?
Merci pour les compliments ;)
Bonne idée de faire mention de screen, j'ai rajouté une ligne à la fin du billet.
Pour ce qui est de le mettre au démarrage, le problème est au niveau de la saisie du mot de passe...
Si tu veux que tout soit automatique (sans saisie humaine de mot de passe) (et comme c'est au démarrage on a pas le pass en mémoire dans ssh-agent),
il va falloir utiliser une authentification par clé, et ne pas protéger la clé par un mot de passe (mettre vide au moment de la génération)... (mais dans ce cas, faiblesse au niveau de la sécurité)..
Pour info je l'ai fait, il faut en effet passer par un ssh-keygen pour pouvoir appeler ssh sans saisie interactive, ensuite j'ai oublié screen... Au final j'ai ajouté dans cron.d un script qui verifie regulierement que le tunnel est en place et qui sinon lance un : ssh -n -N -R bindport:host:port user@domain &
Et la ça semble bon :) pour le coup j'ai crée un user bidon tout de même. J'avais songé au début ajouté la création du tunnel dans inet.d mais je suppose que ça n'a pas beaucoup de sens car si c'est le client qui reboot le tunnel doit disparaitre...
Sympa ce tuto,
je me prend un message d'erreur,
voci ma config un server shh sous BSD et un client Putty sous Windows
La connexion ssh se monte sans aucun problème
Putty est lancer avec R1111 127.0.0.1:22
donc le nestat -an |grep 1111 est bien positif, mais quand je aprtir du server
ssh -p 1111 127.0.0.1
j'ai le message suivant
ssh_exchange_identification: Connection closed by remote host
J'ai fais ung ros RTFM, mais si vous avez une idée le problème vient peut de putty car comment puis je lui dire '"listen port 22", c'est le client pas server SSH d'installé
Merci d'avance
ASDP
- Si tu n'as pas de FW entre les 2, est ce qu'une connexion SSH "simple" du putty vers le sshd du BSD monte bien ?
- Est ce que "AllowTcpForwarding" est bien non présent ou a Yes coté sshd_config ?
- Est ce qu'il y aurait pas des trucs qui bloquent dans /etc/hosts.deny ?
- sinon que disent les logs du coté client et serveur SSH ?