Solange man socat
ausführen kann lokal und unter gateway
(oder auch nur bash
und cat
auf gateway
, siehe letztes Beispiel!) und darf nicht Verwenden Sie ein pty, um 8 Bit sauber zu sein. Es ist möglich, einen Tunnel über ssh einzurichten. Hier sind 4 Beispiele, die die vorherigen verbessern:
Einfaches Beispiel, das einmal funktioniert
(Ein Fork würde eine SSH-Verbindung pro Tunnel erfordern, nicht gut). Der :
entkommen müssen damit socat den exec-Befehl akzeptiert:
term1:
$ socat tcp-listen:12345,reuseaddr exec:'ssh [email protected] exec socat - tcp\:devbox\:22',nofork
term2:
$ ssh -p 12345 [email protected]
term1:
[email protected]'s password:
term2:
[email protected]'s password:
Das Umkehren der ersten und zweiten Adresse macht den Socket sofort verfügbar
socat
muss verantwortlich bleiben, also kein nofork
:
term1:
$ socat exec:'ssh [email protected] exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
[email protected]'s password:
term2:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Mit ControlMaster
ssh
ermöglicht das Forken, während nur eine einzige ssh-Verbindung zum Gateway verwendet wird, wodurch ein Verhalten ähnlich der üblichen Portweiterleitung erreicht wird:
term1:
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
term2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket [email protected] exec socat - tcp\:devbox\:22'
term3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Mit nur bash
und cat
erhältlich unter gateway
Durch die Verwendung von bash
's eingebaute TCP-Umleitung und zwei Halbduplex-cat
Befehle (für ein Vollduplex-Ergebnis) braucht man nicht einmal einen entfernten socat
oder netcat
. Der Umgang mit mehreren Schichten verschachtelter und maskierter Anführungszeichen war etwas umständlich und kann vielleicht besser gemacht oder durch die Verwendung eines entfernten bash
vereinfacht werden Skript. Es muss darauf geachtet werden, dass der gegabelte cat
vorhanden ist nur für die Ausgabe:
term1 (keine Änderung):
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
term2:
$ 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"\'\'\'
term3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
ProxyJump durch Bash ersetzen
Die Idee oben ist gut! Hier ist meine generische ssh_config-Version bei ProxyJump funktioniert nicht weil AllowTcpForwarding auf no gesetzt und meine Standard-Shell ist BASH:
ProxyCommand=ssh -T [email protected] "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T Pseudoterminalzuordnung deaktivieren
- exe Es wird kein neuer Prozess (bash) erstellt
- 3 ist einfach eine Umleitung zu einem verfügbaren Dateideskriptor
- /dev/tcp/... fordert bash auf, den entsprechenden TCP-Socket zu öffnen.
- %h und %p wird von Ihrem OpenSSH-Client als devbox ausgewertet und 22
- 2<&- schließt STDERR (man könnte es auch nach /dev/null umleiten)
- Katze <&3 & liest den ausgewählten Dateideskriptor 3 im Hintergrund
- Katze>&3 wird unseren Dateideskriptor in den Vordergrund schreiben
- töte $! tötet die "lesende" Katze <&3 Befehl, der im Hintergrund ausgeführt wird, wenn Sie die Verbindung schließen/unterbrechen. Sonst würde es weiterlaufen.
Es könnte ProxyJump für mich in Situationen ersetzen, in denen es auf dem Jump-Server deaktiviert war, aber ich wollte wirklich nicht meinen privaten Schlüssel dorthin weiterleiten oder irgendwelche Passwörter ohne eine zusätzliche Verschlüsselungsebene eingeben. Andere SSH_AUTH_SOCK als Root zu benutzen oder Terminal-Sessions komplett mit Tastenanschlägen aufzuzeichnen sind beides reale Dinge.
Aber stellen Sie bitte immer sicher, dass Sie keine Richtlinien verletzen, die für Sie gelten!