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:hostportlie le port local sur 127.0.0.1. Évitez 0.0.0.0 sauf besoin explicite. ExitOnForwardFailure=yesfait é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 :5432ou changez-le si nécessaire.