← retour aux snippets

ssh: tunnel local sécurisé (port forwarding)

Créer un tunnel SSH fiable pour accéder à un service distant en local.

bash réseau #ssh#tunnel

objectif

Créer un tunnel SSH robuste pour exposer un service distant sur votre machine locale, avec échec rapide et keepalive.

code minimal

# expose le port distant 5432 (db.internal) en local sur 5432
ssh -N -L 5432:db.internal:5432 user@bastion.data.pm \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=60 \
  -o ServerAliveCountMax=3

utilisation

# 1) lancez le tunnel (fenêtre dédiée)
ssh -N -L 5432:db.internal:5432 user@bastion.data.pm \
  -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3

# 2) utilisez le service en local (ex: PostgreSQL)
psql "host=127.0.0.1 port=5432 user=app dbname=prod sslmode=require"

# 3) arrêter le tunnel: Ctrl-C dans la fenêtre

variante(s) utile(s)

# lancer en arrière-plan après authentification
ssh -f -N -L 5432:db.internal:5432 user@bastion.data.pm \
  -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3

# enchaîner via un jump host (ProxyJump) vers une machine interne
ssh -N -L 9200:es.internal:9200 user@internal-host \
  -J user@bastion.data.pm \
  -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3

# tunnel inverse: exposer un port local 3000 vers une machine distante
ssh -N -R 3000:127.0.0.1:3000 user@remote.data.pm \
  -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3

# proxy SOCKS dynamique (navigateur via 127.0.0.1:1080)
ssh -N -D 1080 user@bastion.data.pm \
  -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3

notes

  • par défaut, -L [bind_addr:]port:host:hostport lie le port local sur 127.0.0.1. Évitez 0.0.0.0 sauf besoin explicite.
  • ExitOnForwardFailure=yes fait échouer immédiatement si le bind/connexion échoue.
  • utilisez des keepalives (ServerAliveInterval/CountMax) pour détecter les coupures réseau.
  • ne désactivez pas la vérification d’hôte (StrictHostKeyChecking=no à proscrire). Ajoutez la clé hôte proprement lors de la première connexion.
  • vérifiez que le port local est libre: lsof -i :5432 ou changez-le si nécessaire.