Autossh artisanal

Posted on August 23, 2017

Ma famille est sous GNU/Linux (ouais, pas encore OpenBSD, un jour peut-être). Je veux pouvoir me connecter sur leur ordinateur dès qu’il est connecté au net pour pouvoir les dépanner.

Je pars du principe que ma famille n’a pas de nom de domaine, une IP qui peut changer, et je ne veux pas non plus qu’ils aient à lancer une application. L’idée est d’être autonome, ne pas dépendre d’eux pour le dépannage, et accessoirement qu’ils n’aient pas à apprendre ou faire quoi que ce soit.

Plusieurs solutions sont possibles : VNC (graphique et donc lent car la connexion est mauvaise), des trucs privateurs ressemblant à VNC (ce qui revient au même et en plus c’est pas libre), ou alors un bon vieux SSH qui marche bien.

Va pour SSH ! Il existe d’ailleurs un programme nommé “autossh” mais que je n’utilise pas (j’ai un script perso qui fonctionne bien).

L’idée est de créer un tunnel SSH de chez moi à chez eux sur leur port 22. Leur machine se connecte chez moi, crée le tunnel, ouvre un port sur mon serveur qui pointe vers le port 22 de leur machine. Ce qu’il faut donc faire :

Sur leur machine :

  1. créer un utilisateur _autossh : useradd _autossh
  2. placer le script autossh-connection.sh dans /usr/local/bin/
  3. placer le fichier de configuration dans /home/_autossh/, modifiez la configuration si vous voulez l’utiliser ;)
  4. (optionnel) placer le script autossh-test.sh dans /usr/local/bin/ pour tester la configuration
  5. rendre les scripts exécutables par l’utilisateur _autossh : chown _autossh:_autossh /usr/local/bin/autossh* puis chmod 500 /usr/local/bin/autossh*
  6. créer des clés pour _autossh : su - _autossh ; ssh-keygen -t ed25519

Sur notre serveur :

  1. copier la clé ~/.ssh/id_ed25519.pub de l’utilisateur _autossh de leur machine dans le fichier ~/.ssh/authorized_keys de l’utilisateur acceptant la connexion sur le serveur

Ensuite il faut que _autossh se connecte une fois à notre serveur afin qu’il connaisse la clé d’identification et accepte de s’y connecter automatiquement par après. Et enfin on active notre crontab sur leur machine :

*/5 * * * * bash /usr/local/bin/autossh-connection.sh

Voilà !

Maintenant on veut pouvoir se connecter chez la famille depuis son ordinateur. L’idée est d’avoir une fonction shell qui s’occupe de créer un tunnel vers notre serveur puis nous connecte à leur machine en passant par les 2 tunnels.

Admettons que la machine familliale ouvre le port 6000 sur notre serveur pour le tunnel, nous allons nous y connecter de cette manière :

function connexionParents()
{
    ssh -NTL 6000:localhost:6000 karchnu.fr & # tunnel entre notre ordinateur et notre serveur
    X=$! # sauvegarde du PID du tunnel
    sleep 10 # on attend que le tunnel soit en place...
    ssh -p 6000 root@localhost # connexion à la machine familliale (via les tunnels)
    kill $X # on arrête le tunnel une fois la connexion close
}
Tags: ssh