ADR-117 — Redirections & multiplexing SSH : -L/-R, ProxyJump/ProxyCommand, direct-streamlocal (Unix) ; -D/ControlMaster différés
Statut : Accepté (2026-07-26, décision BDFL). RFC de direction
(ADR-015).
S’appuie sur ADR-097 (ssh-connection :
canaux, direct-tcpip/tcpip-forward déjà servis), ADR-099
(ergonomie client air-ssh), ADR-093 (transport),
ADR-089 (SecurityManager — politique de
forwarding), ADR-029 (nommage).
Catégorie : Couche 2 (client air-ssh + serveur air-sshd). Vague 2 #5.
Contexte
OpenSSH offre un riche jeu de redirections et de multiplexing. Air en a déjà le
socle serveur ([ADR-097] : canaux direct-tcpip, tcpip-forward), mais l’ergonomie
client (flags) et quelques capacités manquent. Ces fonctionnalités sont pur couche 2 :
elles réutilisent air-socket (TCP et Unix, couche 1) et air-process (spawn, couche 1) —
aucun nouveau manager couche 1.
Directive BDFL (2026-07-26). Retenus en [A] : -L/-R, ProxyJump/ProxyCommand,
direct-streamlocal. Différés actés : -D (SOCKS), ControlMaster/ControlPath.
Décision
1. Redirections de ports TCP -L / -R
Le serveur sait déjà ([ADR-097]) ; le client air-ssh expose les flags et le
listen local :
-L(local → distant) :air-sshécoute en local (air-socket), ouvre un canaldirect-tcpippar connexion acceptée.-R(distant → local) :air-sshdemandetcpip-forwardau serveur ; les connexions entrantes côté serveur reviennent en canaux vers le client.
Politique serveur (AllowTcpForwarding, PermitOpen, GatewayPorts) → SecurityManager
([ADR-089], capacités de config [ADR-118]). Pur couche 2.
2. ProxyJump (-J) / ProxyCommand
Rebond via bastion :
ProxyCommand:air-sshspawn une commande externe (air-process, couche 1) dont le stdio porte le transport.ProxyJump:air-sshétablit une connexionair-sshimbriquée à travers l’hôte intermédiaire (canaldirect-tcpipdu saut → transport de la connexion finale). Chaînable (multi-sauts). Pur couche 2.
3. direct-streamlocal / streamlocal-forward (socket Unix)
Redirection vers/depuis un socket Unix (ex. socket base de données / Docker) : équivalent
-L/-R sur AF_UNIX (air-socket gère déjà Unix). Client et serveur. Priorité
moyenne, mais peu coûteux vu le socle Unix existant.
4. Différés actés
-D(SOCKS5) : petit serveur SOCKS local (couche 2) qui ouvre undirect-tcpippar requête → ADR différé.- Multiplexing
ControlMaster/ControlPath: réutilisation de connexion via un socket Unix de contrôle local (gain de latence/confort) → ADR différé.
Différés = décidés « à faire plus tard », pas « à oublier » : rouverts sur besoin.
Conséquences
Positives.
- Parité de redirection (TCP local/distant, Unix, rebond bastion) sans nouveau manager
couche 1 — tout réutilise
air-socket/air-process. - Socle serveur déjà là ([ADR-097]) : l’essentiel est l’ergonomie client.
- Périmètre borné :
-D/ControlMaster explicitement différés (pas de dérive de scope).
Négatives / coûts assumés.
- Surface de forwarding = surface de sécurité : une redirection mal cadrée expose des
services ⇒ politique
SecurityManager([ADR-089]) + options (PermitOpen,GatewayPorts, [ADR-118]) obligatoires, défaut restrictif. - ProxyJump imbriqué = complexité de gestion d’erreurs/timeout multi-sauts : couverture + tests de chaînage.
- Confort différé (
-D, ControlMaster) : certains workflows l’attendent — repoussé, assumé.
Mise en œuvre (référence, hors décision). Incréments : (a) -L/-R (listen local + canaux)
dans air-ssh ; (b) ProxyCommand (spawn) + ProxyJump (connexion imbriquée) ; (c)
direct-streamlocal/streamlocal-forward (Unix) client+serveur ; (d) -D/ControlMaster =
ADR différés. Politique via [ADR-089]/[ADR-118]. Non engagés par cet ADR.
Alternatives rejetées
Aucune alternative n’a été consignée lors de l’instruction.