guest@6admin.io:~$

SSH : ProxyJump et le multi-hop moderne

Il y a quelques années, pour atteindre une machine derrière un bastion, j’écrivais un ProxyCommand avec nc et je l’ai raconté dans SSH: tunneling . OpenSSH 7.3 a rendu tout ça obsolète avec une seule option, -J et c’est l’une de ces petites nouveautés qui changent un geste qu’on fait dix fois par jour.

Le geste de base

ssh -J user@bastion user@cible

bastion sert de rebond, la cible n’est jamais exposée directement et surtout le chiffrement reste de bout en bout entre votre poste et cible. Le bastion ne voit passer que du trafic chiffré qu’il ne peut pas lire, exactement comme avec le vieux ProxyCommand, mais sans invoquer nc ni ouvrir un shell intermédiaire. La différence avec ProxyCommand n’est pas qu’esthétique: -J établit la connexion au suivant depuis le client, pas depuis le bastion, donc aucune clé privée ne transite ni ne séjourne sur le rebond. C’est ce qu’on voulait depuis le début et qu’on bricolait jusque-là avec l’agent forwarding, lequel posait justement le problème inverse en exposant l’agent sur le bastion.

Plusieurs rebonds

La chaîne se prolonge en listant les sauts dans l’ordre:

ssh -J user@bastion1,user@bastion2 user@cible

Chaque rebond relaie vers le suivant et le tunnel chiffré se négocie toujours de bout en bout avec la cible finale.

En configuration, pour ne plus y penser

Le vrai confort est dans ~/.ssh/config, où ProxyJump fige le rebond une fois pour toutes:

Host cible
    HostName 10.0.0.42
    User deploy
    ProxyJump user@bastion

Après quoi un simple ssh cible passe par le bastion sans qu’on ait à y penser et tout ce qui s’appuie sur ssh, scp, rsync, les forwards de ports, hérite du rebond sans configuration supplémentaire.

En pratique

ProxyJump ne fait rien que ProxyCommand ne savait faire, il le fait proprement: une syntaxe courte, une entrée de config lisible et la garantie que la clé ne quitte jamais le poste d’origine. Le vieux ProxyCommand + nc garde son intérêt le jour où nc est le seul outil disponible sur un rebond récalcitrant, mais pour tout le reste, -J est devenu le geste par défaut.

[edit: 2026] L’implémentation Ansible de tout ceci: le rôle ssh .