Montage SSHFS automatique et résilient (systemd utilisateur)

Objectif : monter automatiquement des répertoires distants dans $HOME via SSHFS, de façon à ce que :

  • le point de montage soit peuplé dès que la machine distante est joignable ;
  • il reste vide (sans bloquer le système) quand elle ne l’est pas ;
  • le montage se rétablisse seul après une coupure réseau ;
  • la connexion passe automatiquement par un rebond (proxy) hors du réseau du site.

Testé sur Ubuntu 24.04. Aucun droit root n’est nécessaire, hormis l’installation de sshfs.


1. Prérequis

sudo apt install sshfs netcat-openbsd

L’authentification doit être non interactive (clé SSH, sans saisie de mot de passe). Une clé protégée par phrase secrète convient si elle est déverrouillée par l’agent SSH de la session (cas par défaut sous GNOME).

Vérification, pour chaque machine :

ssh -o BatchMode=yes MACHINE true && echo OK

Si la commande échoue (« Permission denied »), le montage automatique ne pourra pas fonctionner.

2. Configuration SSH (~/.ssh/config)

Le nom d’hôte, l’utilisateur et le port sont définis ici, pas dans le service. Le nom d’alias (MACHINE) servira aussi à nommer le point de montage.

Host MACHINE
    HostName ADRESSE_OU_NOM
    Port XXXX
    User UTILISATEUR_DISTANT

Option : rebond automatique hors site

Si la machine n’est joignable directement que depuis le réseau du site, ajoutez un bloc Match après le bloc Host. Il teste en une seconde si le port SSH répond ; sinon, il active le rebond.

Rebond SSH classique :

Match originalhost MACHINE !exec "nc -z -w 1 ADRESSE_INTERNE 22"
    ProxyJump UTILISATEUR@PASSERELLE

Rebond par tunnel TLS (exemple avec openssl s_client) :

Match originalhost MACHINE !exec "nc -z -w 1 ADRESSE_INTERNE 22"
    ProxyCommand openssl s_client -quiet -connect IP_PASSERELLE:PORT -servername NOM_SNI
    ServerAliveInterval 30
    TCPKeepAlive no

Remarques :

  • l’indentation n’a aucun sens pour ssh : Match ouvre toujours un nouveau bloc ;
  • l’adresse interne apparaît deux fois (dans HostName et dans le test nc) : pensez à modifier les deux en cas de changement ;
  • le rebond s’applique aussi aux ssh, scp et rsync manuels.

Vérification (affiche la ProxyCommand uniquement hors site) :

ssh -G MACHINE | grep -iE "proxycommand|proxyjump"

3. Points de montage

Un répertoire par machine, vide, nommé par exemple _MACHINE :

mkdir -p ~/_MACHINE

4. Service systemd modèle

Créer ~/.config/systemd/user/sshfs@.service :

[Unit]
Description=Montage SSHFS de %i

[Service]
ExecStart=/usr/bin/sshfs -f %i: %h/_%i -o BatchMode=yes,ConnectTimeout=5,ServerAliveInterval=15,ServerAliveCountMax=3
ExecStopPost=-/usr/bin/fusermount -uz %h/_%i
Restart=always
RestartSec=30

[Install]
WantedBy=default.target
  • %i : nom de l’instance (l’alias SSH) ; %h : répertoire personnel.
  • -f : sshfs reste au premier plan, ce qui permet à systemd de le surveiller.
  • ServerAliveInterval=15 + ServerAliveCountMax=3 : après ~45 s sans réponse, la connexion est abandonnée au lieu de figer les programmes qui lisent le dossier.
  • ExecStopPost ... fusermount -uz : nettoie un montage resté bloqué (« Transport endpoint is not connected »).
  • Restart=always + RestartSec=30 : nouvelle tentative toutes les 30 s.

5. Activation

systemctl --user daemon-reload
systemctl --user enable --now sshfs@MACHINE1 sshfs@MACHINE2

Les montages démarrent à l’ouverture de session. Pour qu’ils démarrent au boot, sans session ouverte :

loginctl enable-linger $USER

6. Vérification et suivi

ls ~/_MACHINE
systemctl --user status sshfs@MACHINE
journalctl --user -u 'sshfs@*' -n 30 --no-pager

Après toute modification du fichier de service :

systemctl --user daemon-reload
systemctl --user restart sshfs@MACHINE

7. Suppression d’une instance

systemctl --user disable --now sshfs@MACHINE
systemctl --user reset-failed sshfs@MACHINE
rmdir ~/_MACHINE
Défiler vers le haut