J’adore les tunnels SSH

Cyber LiB

Je 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).

Le problème

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.

Les tunnels

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
La solution

Et le tour est joué !

Tags: , ,

9 commentaires à “J’adore les tunnels SSH”

  1. Guillaume Says:

    Je peux presque dire que je sais c’est quoi un tunel SSH puisqu’un de mes collègue en a fait un pour me permettre de faire des requêtes SQL sur le serveur du laboratoire !!! J’ai accès à mes listes de protéines de n’importe où grâce à ce tunnel !

    maintenant je leur connait une 2e utilisation !

  2. Steven Says:

    Vas juste voir l’équipe réseau 😉

    T’aurais pu faire un scp aussi dans ton tunnel, mais quitte à avoir ouvert une session sur cibletux, autant faire un netcat oui.

    Dans le cas de données confidentielles, ça veut dire qu’elles sont compromisent à la sortie du tunnel sur passepartout.

    Alternative : tu pouvais faire un POST à travers le proxy et récupérer via un port d’écoute web atteignable par le proxy sur la cible 😉 ou encore tunneler sur le dns…

  3. LostInBrittany Says:

    @Steven

    C’était vendredi soir et l’équipe réseau était déjà parti, espèce de feignant 😉

    Les données n’étaient pas vraiment confidentielles, sinon j’aurais ajouté du chiffré le fichier avant de l’envoyer.

    L’idée du POST à travers le proxy ne m’avait pas traversé l’esprit, mais c’est vraiment sympa et pas difficile à mettre en ouevre… Il faudra que je garde ça sur le coude pour une prochaine fois !

    Pour le tunnel sur le DNS, là il faudra que tu me racontes plus, j’ai envie de savoir…

    @Guillaume :

    Et il y a plein d’autres utilisations, toutes très pratiques 🙂

  4. Eric Says:

    Ca me rappelle des souvenirs tous ces nums de machines qui finissent en “tux “….

  5. Mathias Says:

    Sauf que le temps du transfert la sécurité est compromise…

    Il aurait mieux valu établir un tunnel de sourcetux vers cibletux:22 et en utilisant un agent SSH sur passepartouttux se connecter en -A sur sourcetux et faire un scp ou un rsync vers cibletux.

  6. LostInBrittany Says:

    Mais étant donné que sourcetux ne voyait ni cibletux ni passepartouttux, comment j’aurais pu faire le tunnel de sourcetux à cibletux 22 ?

  7. Ray Dacteur Says:

    C’est beau, y a pas à dire.

  8. Mathias Says:

    RTFM 😉

    ssh -R 2222:cibletux:22 sourcetux

  9. LostInBrittany Says:

    D’oh !

Leave a Reply