Créer un tunnel SSH au démarrage avec systemd sous Debian

Comment faire pour pouvoir se connecter en SSH sur un PC Linux distant, peu importe la manière dont il est connecté à Internet, et peu importe son adresse IP publique?

L’idée est de faire en sorte que le PC distant établisse automatiquement au démarrage une connexion SSH vers un « serveur » joignable en SSH sur l’internet.  Et dans cette connexion, on encapsulera (tunnel) une connexion SSH du serveur vers le PC distant. C’est cette connexion SSH qui permet l’accès à distance à la machine à contrôler.  De cette manière, le seul prérequis pour la machine à contrôler est d’être connectée à l’internet et de pouvoir ouvrir une connexion TCP sur le port 22 vers l’internet.

Le schéma ci-dessous illustre le principe.

Le but est donc d’avoir un tunnel inverse dans un tunnel classique, le tout pour un certain utilisateur (pas root pour des raisons de sécurité!).

Prérequis

Les prérequis sur la machine distante sont assez limités:

  • être connectée à internet et pouvoir se connecter sur le port 22 à un serveur sur Internet
  • Avoir le paquet autossh installé: sudo apt-get install autossh
  • Avoir SSH installé et autorisé les connexion en SSH.

La machine que l’on utilisera comme serveur doit accepter les connexions sur le port TCP 22 venant de l’internet.  Chez moi, il s’agit de ma machine Linux derrière mon modem câble sur lequel une règle de « port forwarding » est configurée.

Configuration

Clé SSH sans mot de passe

La machine distante se connectera sur le serveur avec une clé SSH sans mot de passe.  Il faut la générer sur la machine distante avec: ssh-keygen -t ed25519. (PS: l’algorithme ED25519 est celui recommandé actuellement en terme de sécurité).

On copie ensuite sur le serveur la clé publique générée et on l’intègre dans le fichier ~/.ssh/authorized_keys de l’utilisateur souhaité.

On peut tester que la connexion fonctionne en initiant manuellement une connexion SSH depuis la machine distante vers le serveur: ssh user@server-ip.

 Création du fichier de démarrage automatique pour systemd

Pour démarrer automatiquement la connexion SSH au démarrage, nous utiliserons systemd pour l’utilisateur courant. Le principe est de créer un fichier décrivant notre service, et de l’activer au démarrage du système.

Créer le fichier ~/.config/systemd/user/autossh.service avec le contenu suivant:

[Unit]
Description=AutoSSH service for port 22 with reverse tunnel
After=network.target

[Service]
Environment="AUTOSSH_GATETIME=0" "AUTOSSH_POLL=30"
ExecStart=/usr/bin/autossh -N -R 30001:localhost:22 -o TCPKeepAlive=yes remote-user@remote-ip

[Install]
WantedBy=default.target

Le numéro de port 30001 ci-dessus peut être changé, si jamais vous avez une contrainte particulière sur le serveur.

Il faut ensuite activer la persistance de systemd pour l’utilisateur courant: sudo loginctl enable-linger <user>.

Enfin, on active le service fraichement créé: systemctl --user enable autossh.service.

Il reste à activer manuellement le service (systemctl --user start autossh.service) ou à redémarrer la machine pour que le tunnel SSH soit créé.

Utilisation

Dès que la machine à contrôler est connectée à Internet, endéans les 30 secondes, elle établit une connexion SSH avec la machine remote-ip. De cette machine, pour accéder à la machine distante, il suffit de taper:

ssh -p 30001 distant-user@localhost

Et voilà 🙂

Ma bibliothèque d’ebook en ligne avec calibre et rsync

Au fil des années, j’ai constitué une petite bibliothèque virtuelle de livres numériques ebooks.  Jusqu’il y a peu, mes livres étaient répartis un peu partout sur mes disques durs, sans moyen simple de les consulter, ni de retrouver facilement les livres traitant d’un sujet en particulier.

Il y a quelques mois, j’ai pris le taureau par les cornes et j’ai enfin mis de l’ordre dans ma collection.  Depuis, elle est bien rangée et consultable facilement, sur mon poste de travail, ou depuis n’importe où via une simple interface web.

Lire la suite »

Configurer rapidement un firewall sous Debian avec ufw

Dans le cadre de l’auto‑hébergement, j’ai tout un tas de services qui tournent sur mon petit serveur à la maison. A priori, je n’ai pas besoin de firewall (pare‑feu) car ce serveur se trouve derrière mon modem-routeur internet qui fait office de pare‑feu.

Cependant, je me suis rendu compte qu’un firewall peut tout de même être utile pour les raisons suivantes: Lire la suite »