Finché si può eseguire socat localmente e su gateway (o anche solo bash e cat su gateway , vedi l'ultimo esempio!) ed è consentito non usa un pty per essere pulito a 8 bit, è possibile stabilire un tunnel attraverso ssh. Ecco 4 esempi, migliorativi rispetto al precedente:
Esempio di base che funziona una volta
(averlo fork richiederebbe una connessione ssh per tunnel, non va bene). Dover sfuggire al : affinché socat accetti il comando exec:
termine1:
$ socat tcp-listen:12345,reuseaddr exec:'ssh example@unixlinux.online exec socat - tcp\:devbox\:22',nofork
termine2:
$ ssh -p 12345 example@unixlinux.online
termine1:
example@unixlinux.online's password:
termine2:
example@unixlinux.online's password:
L'inversione del primo e del secondo indirizzo rende il socket immediatamente disponibile
socat deve rimanere al comando, quindi niente nofork :
termine1:
$ socat exec:'ssh example@unixlinux.online exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
example@unixlinux.online's password:
termine2:
$ ssh -p 12345 example@unixlinux.online
example@unixlinux.online's password:
Utilizzando un ControlMaster sst
consente il fork mentre si utilizza una sola connessione ssh al gateway, dando così un comportamento simile al solito port forwarding:
termine1:
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket example@unixlinux.online
example@unixlinux.online's password:
termine2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket example@unixlinux.online exec socat - tcp\:devbox\:22'
termine3:
$ ssh -p 12345 example@unixlinux.online
example@unixlinux.online's password:
Avere solo bash e cat disponibile su gateway
Usando bash e due cat half-duplex comandi (per un risultato full-duplex) non è nemmeno necessario un socat remoto o netcat . La gestione di più strati di virgolette nidificate e sfuggite è stata un po' scomoda e forse può essere fatta meglio, o semplificata con l'uso di un bash remoto copione. Bisogna fare attenzione ad avere il biforcuto cat solo per l'output:
term1 (nessuna modifica):
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket example@unixlinux.online
example@unixlinux.online's password:
termine2:
$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket example@unixlinux.online '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
termine3:
$ ssh -p 12345 example@unixlinux.online
example@unixlinux.online's password:
Sostituisci ProxyJump con Bash
L'idea sopra è buona! Ecco la mia versione generica di ssh_config quando ProxyJump non funziona perché AllowTcpForwarding impostato su no e la mia shell predefinita è BASH:
ProxyCommand=ssh -T example@unixlinux.online "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T Disabilita l'allocazione pseudo-terminale
- exec Non verrà creato alcun nuovo processo (bash)
- 3<> è semplicemente il reindirizzamento a un descrittore di file disponibile
- /dev/tcp/... chiederà a bash di aprire il socket TCP corrispondente.
- %h e %p verrà valutato dal tuo client OpenSSH come devbox e 22
- 2<&- chiuderà lo STDERR (potresti anche reindirizzarlo a /dev/null)
- gatto <&3 & leggerà il descrittore di file selezionato 3 in background
- gatto>&3 scriverà il nostro descrittore di file in primo piano
- uccidi $! ucciderà il gatto <&3 "che legge". comando in esecuzione in background quando chiudi/interrompi la connessione. Altrimenti continuerebbe a funzionare.
Potrebbe sostituire ProxyJump per me in situazioni in cui era disabilitato sul jump server, ma non volevo davvero inoltrare lì la mia chiave privata o inserire password senza un ulteriore livello di crittografia. Usare altri SSH_AUTH_SOCK come root o registrare le sessioni del terminale completamente con le sequenze di tasti sono entrambe cose reali.
Ma per favore, assicurati sempre di non violare le norme che ti riguardano!