Tant qu'on peut exécuter socat
localement et sur gateway
(ou même juste bash
et cat
le gateway
, voir le dernier exemple !) et est autorisé à ne pas utilisez un pty pour être 8 bits propre, il est possible d'établir un tunnel via ssh. Voici 4 exemples, améliorant le précédent :
Exemple de base fonctionnant une fois
(l'avoir fork nécessiterait une connexion ssh par tunnel, pas bon). Devoir échapper au :
pour que socat accepte la commande exec :
terme1 :
$ socat tcp-listen:12345,reuseaddr exec:'ssh [email protected] exec socat - tcp\:devbox\:22',nofork
terme2 :
$ ssh -p 12345 [email protected]
terme1 :
[email protected]'s password:
terme2 :
[email protected]'s password:
Inverser les première et deuxième adresses rend le socket immédiatement disponible
socat
doit rester en charge, donc pas de nofork
:
terme1 :
$ socat exec:'ssh [email protected] exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
[email protected]'s password:
terme2 :
$ ssh -p 12345 [email protected]
[email protected]'s password:
Utiliser un ControlMaster
chut
permet de bifurquer en n'utilisant qu'une seule connexion ssh à la passerelle, donnant ainsi un comportement similaire à la redirection de port habituelle :
terme1 :
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
terme2 :
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket [email protected] exec socat - tcp\:devbox\:22'
terme3 :
$ ssh -p 12345 [email protected]
[email protected]'s password:
N'ayant que bash
et cat
disponible sur gateway
En utilisant bash
la redirection tcp intégrée de et deux cat
semi-duplex commandes (pour un résultat full-duplex) on n'a même pas besoin d'une télécommande socat
ou netcat
. La gestion de plusieurs couches de guillemets imbriqués et échappés était un peu délicate et peut peut-être être mieux faite, ou simplifiée par l'utilisation d'un bash
distant scénario. Il faut prendre soin d'avoir le cat
fourchu pour la sortie uniquement :
terme1 (pas de changement) :
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
terme2 :
$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket [email protected] '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
terme3 :
$ ssh -p 12345 [email protected]
[email protected]'s password:
Remplacer ProxyJump par Bash
L'idée ci-dessus est bonne ! Voici ma version générique de ssh_config lorsque ProxyJump ne fonctionne pas parce que AllowTcpForwarding défini sur no et mon shell par défaut est BASH :
ProxyCommand=ssh -T [email protected] "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T Désactiver l'allocation de pseudo-terminal
- exécution Aucun nouveau processus (bash) ne sera créé
- 3<> est simplement une redirection vers un descripteur de fichier disponible
- /dev/tcp/... demandera à bash d'ouvrir le socket TCP correspondant.
- %h et %p sera évalué par votre client OpenSSH en tant que devbox et 22
- 2<&- fermera le STDERR (vous pouvez aussi le rediriger vers /dev/null)
- chat <&3 & lira le descripteur de fichier sélectionné 3 en arrière-plan
- chat>&3 écrira notre descripteur de fichier au premier plan
- tuez $ ! tuera le chat <&3 "lecteur" commande s'exécutant en arrière-plan lorsque vous fermez/interrompez la connexion. Sinon, il continuerait à fonctionner.
Cela pourrait remplacer ProxyJump pour moi dans les situations où il était désactivé sur le serveur de saut, mais je ne voulais vraiment pas y transférer ma clé privée ou entrer des mots de passe sans un niveau de cryptage supplémentaire. Utiliser d'autres SSH_AUTH_SOCK en tant que root ou enregistrer complètement des sessions de terminal avec des frappes au clavier sont deux choses réelles.
Mais s'il vous plaît, assurez-vous toujours de ne pas enfreindre les politiques qui s'appliquent à vous !