Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 canal direct-tcpip par connexion acceptée.
  • -R (distant → local) : air-ssh demande tcpip-forward au 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-ssh spawn une commande externe (air-process, couche 1) dont le stdio porte le transport.
  • ProxyJump : air-ssh établit une connexion air-ssh imbriquée à travers l’hôte intermédiaire (canal direct-tcpip du 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 un direct-tcpip par 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.