Stabilire una connessione SSH tra macchine dietro firewall

Ho due macchine, A e C, ognuna delle quali dietro un firewall in modo da non poter accettare le richieste SSH in arrivo sulla port 22. Ho una terza macchina, B, al di fuori di entrambi i firewall e volevo SSH da A a C utilizzando B. Posso fare quello che penso sia chiamato tunnel SSH da C -> B come così

ssh -fNR 10000:localhost:22 -i key_file_for_B_on_C [email protected] 

Seguendo quello che sembra quasi quello che voglio su questa domanda, provo ora il command:

 ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p [email protected]" -p 10000 B 

Questo non sembra funzionare, ho l'errore:

 channel 0: open failed: connect failed: Connection timed out 

È questo il giusto approccio? Che cosa potrei fare male?

Penso che il problema con il tuo esempio sia l'argomento finale; stai ssh ing a B, quando dovresti elencare la "destinazione finale" , anche se l'host / port port-forwarded, che è port 10000, ma deve essere localhost , non B , poiché B viene risolto dalla prospettiva di A , e la port 10000 su B probabilmente non è aperta all'esterno . Ad esempio, corretto:

 ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p [email protected]" -p 10000 localhost 

Per provarlo a me stesso, ho impostato lo stesso esperimento, anche se leggermente più semplice poiché il mio nome utente è lo stesso su tutti gli host e sto usando l'inoltro degli agenti; notate che il mio hophost (il tuo B ) accetta ssh su una port non standard, 2222.

Su C:

 ssh -fNAR 12345:localhost:22 hophost -p 2222 

Poi su A:

 ssh -A localhost -p 12345 -o "ProxyCommand ssh -A hophost -p 2222 nc %h %p" 

In alternativa, è ansible codificare un gruppo di questo nel tuo .ssh/config su A:

 Host C HostName localhost Port 12345 ForwardAgent yes #ProxyCommand ssh -A hophost -p 2222 nc %h %p ProxyCommand ssh -A hophost -p 2222 -W %h:%p #ProxyCommand $HOME/.ssh/proxy -w 2 -h hophost:2222 %h %p 

Quindi il tuo command su A è semplicemente

 ssh C 

Nota Ho incluso anche due versioni alternative di ProxyCommand . Il primo utilizza nc nel caso in cui la versione ssh è più vecchia di 5.3, quando è stata aggiunta l'opzione -W . L'altro utilizza uno script di proxy che ho usato per lungo tempo per entrambi i hop-attraverso alcuni host (come in questo esempio) e utilizzare corkscrew per uscire da firewall che bloccano ssh output. Potete vedere lo script ssh-proxy sul mio github. Semplifica le voci di ~/.ssh/config quando si desidera utilizzare un proxy per le voci Host * , ma non prometto che funziona sempre in tutte le situazioni, come ho modificato nel tempo come ho bisogno per situazioni diverse, quindi qualsiasi delle opzioni potrebbe essere fragile o addirittura smarrita, ma potrebbe aiutare.