J’adore les tunnels SSH
30-03-2009 par Horacio GonzalezJe ne sais pas si ce petit tutoriel servira à quelqu’un d’autre que moi, car c’est vraiment quelque chose de assez particulier. Mais étant donné que cela m’a fait perdre un peu de temps vendredi dernier, je me suis dit qu’il valait mieux le mettre par écrit. Et quitte à le faire, autant le mettre sur le blog, où ça peut peut-être depanner quelqu’un dans la même situation.
Le problème, à la base, c’est que j’ai tendance à oublier les possibilités offertes par les tunnels SSH. Ou plutôt, j’ai tendance à les considérer plus compliqués qu’ils ne le sont et du coup ne songer à les utiliser qu’en dernier ressort.
Mais à chaque fois que je me décide à les utiliser, je constate que les tunnels SSH en plus d’être très puissants ne sont pas compliqués, il suffit d’avoir les idées claires.
Description du problème
Vendredi dernier j’étais confronté à un problème en apparence simple mais qui m’a pris la tête pendant un moment.
J’avais un gros volume de données (en occurrence un fichier grosfichier.tgz
de plusieurs gigas) à copier entre deux machines distantes. Ces deux machines étaient dans deux VLANs différentes et elles ne se voyaient pas. Appelons sourcetux
à la machine qui a le fichier et cibletux
à la machine sur laquelle on veut le copier.
J’avais sous la main une troisième machine, que nous appellerons passepartouttux
, qui avait accès aux deux machines précédentes, mais où je ne pouvais pas stocker des données (pas de place disque).
Comment faire donc pour transférer mon gros fichier entre les deux machines ?
La solution
La solution la plus simple (et la moins efficiente) aurait été de copier le fichier sur passepartouttux
et de le renvoyer ensuite vers cibletux
. Mais passepartouttux
étant une machine avec un petit disque déjà surchargé, cette solution ne risquait pas de marcher.
Ma première idée était d’utiliser scp
depuis passepartouttux
pour copier de sourcetux
à cibletux
, mais j’ai vite remarqué que cela ne pourrait pas marcher, car il aurait besoin d’établir SSH entre sourcetux
et cibletux
.
J’ai ensuite cherché des possibles alternatives simples, mais aucune ne convenait.
Lorsque j’ai posé la question à mon collègue Fred, il m’a dit sans hésiter d’utiliser des tunnels SSH. Ma première réaction a été plutôt négative, ça me semblait une procédure assez lourde pour une toute petite opération. Mais lorsque j’ai bien réfléchi, je me suis rendu compte de que Fred avait (encore une fois) raison, utiliser des tunnels SSH était non seulement une bonne solution mais aussi une solution simple.
La seule particularité du cas c’est que depuis passepartouttux
on peut se connecter à sourcetux
et à cibletux
, mais depuis sourcetux
et cibletux
on ne peut pas se connecter à aucune des autres deux machines. En conséquence, passepartouttux
devait être à l’origine des deux tunnels.
Des passepartouttux
on ouvre donc un tunnel dont l’entrée est le port 10000 de sourcetux
et la sortie le port 10000 de passepartouttux
:
passepartouttux:~/ ssh -N -R 10000:passepartouttux:10000 sourcetux
Ensuite on ouvre un autre tunnel depuis passepartouttux
, cette fois avec son entrée dans le port 10000 de passepartouttux
et la sortie le port 10000 de cibletux
:
passepartouttux:~/ ssh -N -L 10000:cibletux:10000 cibletux
On vient donc de créer un tunnel virtuel entre le port 10000 de sourcetux
et le port 10000 de cibletux
.
Maintenant il suffit d’aller sur cibletux
et se mettre à l’écoute sur le port 10000, redirigeant la sortie vers un fichier, et d’aller sur sourcetux
pour envoyer le fichier vers son propre port 10000. Pour les deux opérations, la commande magique est netcat, nc
.
Côté récepteur :
cibletux:~/ nc -l 10000 > grosfichier.tgz
Côté émetteur :
sourcetux:~/ nc localhost 10000 < grosfichier.tgz
Et le tour est joué !