Aller au contenu

Tunnel SSH Inversé — Sync VPS→PC avec IP Dynamique

Contexte

Le script sync_to_pc.sh du workflow shared/references/hermes-workflow-developpement permet au VPS de synchroniser le code directement sur le PC local via SSH. Mais le PC est derrière un routeur avec une IP publique dynamique — le VPS ne peut pas initier une connexion vers le PC de façon fiable.

Solution retenue : tunnel SSH inversé via autossh. Le PC initie lui-même le tunnel vers le VPS au démarrage, créant un point d'entrée stable côté VPS (localhost:2222).


Principe

PC (IP inconnue, derrière NAT)
    ↓ ssh -R 2222:localhost:22 kanmaber@178.105.46.57
VPS (IP fixe)
    ← tunnel ouvert
    ↓ ssh -p 2222 kanmaber@localhost   (pour atteindre le PC)

Le PC crée le tunnel au démarrage → le VPS peut ensuite s'y connecter via localhost:2222. L'IP publique du PC n'intervient jamais.


Utilisation manuelle (sans service systemd)

Pour ouvrir le tunnel ponctuellement, sans automatisation, lancer cette commande dans un terminal WSL et la laisser tourner :

autossh -M 0 -N \
  -o "ServerAliveInterval=30" \
  -o "ServerAliveCountMax=3" \
  -R 2222:localhost:22 \
  -i ~/.ssh/kanmaber_hetzner \
  kanmaber@178.105.46.57

Prérequis à faire une seule fois avant la première utilisation :

# 1. SSH server dans WSL
sudo apt install openssh-server -y
sudo service ssh start

# 2. Clé publique du VPS autorisée sur le PC
ssh -i ~/.ssh/kanmaber_hetzner kanmaber@178.105.46.57 "cat ~/.ssh/id_ed25519.pub"
echo "COLLE_LA_CLE_ICI" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Depuis le VPS, tester la connexion retour :

ssh -p 2222 kanmaber@localhost

Le tunnel tombe dès que le terminal WSL est fermé. Pour une version permanente, utiliser le service systemd (voir section "Mise en place" ci-dessous).


Mise en place

Étape 1 — SSH server sur WSL

sudo apt install openssh-server -y
sudo service ssh start
sudo service ssh status

Étape 2 — Autoriser la clé SSH du VPS sur le PC

# Récupérer la clé publique du VPS
ssh -i ~/.ssh/kanmaber_hetzner kanmaber@178.105.46.57 "cat ~/.ssh/id_ed25519.pub"
# Ajouter dans WSL
echo "CLE_PUBLIQUE_VPS" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Étape 3 — Installer autossh

sudo apt install autossh -y

Étape 4 — Service systemd (tunnel au démarrage WSL)

sudo tee /etc/systemd/system/reverse-tunnel.service << 'EOF'
[Unit]
Description=Reverse SSH Tunnel vers VPS
After=network.target

[Service]
User=kanmaber
ExecStart=/usr/bin/autossh -M 0 -N \
  -o "ServerAliveInterval=30" \
  -o "ServerAliveCountMax=3" \
  -o "ExitOnForwardFailure=yes" \
  -R 2222:localhost:22 \
  -i /home/kanmaber/.ssh/kanmaber_hetzner \
  kanmaber@178.105.46.57
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable reverse-tunnel
sudo systemctl start reverse-tunnel

Étape 5 — Mettre à jour sync_to_pc.sh sur le VPS

PC_USER="kanmaber"
PC_HOST="localhost"
PC_SSH_PORT="2222"
PC_PROJECT_DIR="/home/kanmaber/projets/PsychoEnLigneV2"

Modifier la commande SSH dans le script :

ssh -p "$PC_SSH_PORT" "$PC_USER@$PC_HOST" "cd $PC_PROJECT_DIR && git pull origin main"


Comportement selon l'état du PC

Situation Comportement
PC allumé Tunnel actif → VPS sync via localhost:2222 directement
PC éteint Tunnel absent → VPS pousse sur GitHub, flag .sync_pending créé
PC se rallume autossh rétablit le tunnel → cron détecte .sync_pending → sync auto

Décision / Conclusion

L'IP dynamique rend impossible toute connexion directe VPS→PC. Le tunnel SSH inversé est la solution retenue car : - Ne nécessite aucune configuration routeur (pas de port forwarding) - Fonctionne derrière n'importe quel NAT - autossh maintient le tunnel en vie automatiquement - Compatible avec le mécanisme de flag .sync_pending de sync_to_pc.sh

À faire

  • [ ] Installer openssh-server dans WSL
  • [ ] Récupérer la clé publique du VPS et l'ajouter dans ~/.ssh/authorized_keys
  • [ ] Installer autossh + créer le service systemd reverse-tunnel.service
  • [ ] Mettre à jour sync_to_pc.sh sur le VPS : PC_HOST=localhost, PC_SSH_PORT=2222
  • [ ] Configurer le cron VPS pour sync_to_pc.sh (toutes les 30 min)
  • [ ] Tester le tunnel : ssh -p 2222 kanmaber@localhost depuis le VPS

Liens connexes