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 [email protected] exec socat - tcp\:devbox\:22',nofork
termine2:
$ ssh -p 12345 [email protected]
termine1:
[email protected]'s password:
termine2:
[email protected]'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 [email protected] exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
[email protected]'s password:
termine2:
$ ssh -p 12345 [email protected]
[email protected]'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 [email protected]
[email protected]'s password:
termine2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket [email protected] exec socat - tcp\:devbox\:22'
termine3:
$ ssh -p 12345 [email protected]
[email protected]'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 [email protected]
[email protected]'s password:
termine2:
$ 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"\'\'\'
termine3:
$ ssh -p 12345 [email protected]
[email protected]'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 [email protected] "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!