Inoltra il traffico SSH attraverso una macchina centrale


110

Il tunneling SSH è molto confuso per me. Mi chiedo se posso farlo in Linux.

Ho 3 macchine ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Quindi posso SSH da A -> B e da B -> C, ma non da A -> C.

C'è un modo per impostare un tunnel SSH da A a B, quindi quando eseguo altri comandi SSH, funzionano solo dalla mia macchina locale A? Sto sostanzialmente cercando di clonare un repository git dal lavoro a casa (e non riesco a installare git sulla macchina B).

Inoltre, una volta installato. Come lo disinserirei anche io?


credo che ci sia una domanda duplicata da qualche parte, ma il mio motore di ricerca è debole oggi.
Quack Quixote



Se stai usando Linux sulla macchina A, usa uno strumento chiamato sshuttle, che ti consente di inoltrare selettivamente tutto il traffico per C attraverso il tunnel A-> B (supponendo che C sia visibile da B).
visita il

Risposte:


128

Inseriscilo nel tuo .ssh/configfile su hostA (vedi man 5 ssh_config per i dettagli):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Ora il seguente comando esegue automaticamente il tunneling attraverso hostB

hostA:~$ ssh hostC

Potresti voler aggiungere opzioni come -oCiphers=arcfoure -oClearAllForwardings=yesvelocizzare le cose, poiché il wrapping sshall'interno sshè più costoso dal punto di vista computazionale e lo sforzo extra e il wrapper non devono essere altrettanto sicuri quando eseguono il tunneling del traffico già crittografato.


Se si utilizza OpenSSH prima della 5.3, l' -Wopzione non è disponibile. In questo caso è possibile implementare quanto sopra usando netcat ( nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

1
È brillante! Grazie. Questo risolve un problema che mi ha mangiato negli ultimi 2 giorni: hostC si trova dietro un firewall e ha dati a cui voglio accedere da hostA, un laptop che può essere in qualsiasi parte del mondo. hostB è anche dietro lo stesso firewall con hostC, ma ha una porta SSH aperta al mondo. Quindi posso ssh da hostC -> hostB. Ho installato un tunnel SSH inverso tra hostC e hostB, quindi posso anche ssh da hostB -> hostC (inoltrato tramite localhost). Con il tuo trucco posso passare da hostA -> hostC! Funziona perfettamente con SCP e Fugu su OSX! Grazie!
AndyL

L' -Wopzione dovrebbe essere utilizzata al posto ncdell'opzione.
vy32,

Quale SSH dovrebbe supportare -W, solo quello su hostA (l'origine) o anche su hostB (la macchina di mezzo)?
gioele,

Per informazioni, se si dispone di più host che è necessario raggiungere tramite lo stesso hostB, è possibile dichiarare più Host hostCrighe sopra ProxyCommandrendendo più semplice l'accesso a più host tramite il server intermedio.
fduff,

7

Modifica: questo è l'approccio sbagliato. Vedi invece la risposta di effimero . Questa risposta funzionerà, ma è potenzialmente meno sicura e sicuramente meno eccezionale.

Sembra che tu voglia una soluzione come la seguente:

ssh -L localhost:22:machinec:22 machineb

Questo ti darà una granata machineb. Lascia stare questo; minimizzare la finestra del terminale.

Ora, ogni volta che si effettua una connessione ssh localhost, si verrà effettivamente connessi machinectramite machineb. Al termine del tunnel, basta chiudere il terminale in cui è stato eseguito il comando sopra.

Nota che avrai bisogno dei privilegi di superutente per eseguire il comando.


+1 Grazie Wesley. Questa è la vera risposta al tunneling SSH. Ecco un articolo a riguardo: securityfocus.com/infocus/1816
Larry K

3
Nel complesso, questo è abbastanza malvagio ... ma ho dovuto farlo con antiche versioni di OpenSSH o altri client SSH. Puoi scegliere una porta alta come 8022: in questo modo non interferisce con nessun servizio ssh su localhost e non richiede l'esecuzione come root. Aggiungi solo -p 8022ai tuoi comandi ssh. Ed è facile da usare con git: usa l'URI ssh://localhost:8022/path/to/repo.git.
effimero

3

Sembra che tu voglia un alias di shell su A che provochi ssh su C

  1. Presumo che su A, puoi digitare ssh me @ b "ssh me @ c hostname" e tornare indietro "C"
  2. Crea un alias sshc che espande sshc foo in ssh me @ b "ssh me @ c foo"
  3. Per la sintassi esatta della creazione dell'alias, consultare superuser.com

1
Potrebbe essere necessario aggiungere -talle opzioni di ssh esterne se si desidera una shell interattiva, dato che sshassume -Tse viene dato un comando.
effimero

1

Per la shell interattiva puoi usare questo semplice comando:

ssh -J <user>@<hostB> <user>@<hostC>

Le opzioni -J sono per il salto .


0

Se il tuo datore di lavoro fornisce una VPN, ti consiglio di usarlo invece.

In questo modo, non dovrai configurare alcuna applicazione appositamente (anche ssh) e potrai vedere qualsiasi macchina dietro il firewall. Inoltre, tutto il tuo traffico sarà crittografato dal software VPN, il che aggiungerà sicurezza a qualsiasi traffico involontariamente o deliberatamente non crittografato.


6
A volte è la VPN che è la ragione per cui abbiamo bisogno di questi trucchi ...
Louis

0

YASS Ancora un'altra soluzione semplice

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Il primo comando apre una connessione ssh a HostB e dice a HostB di inoltrare le connessioni da localhost: 2222 a HostC: 22 .
  • il -fparametro indica a SSH di passare in background una volta stabilita la connessione
  • Il secondo comando apre semplicemente una connessione client a localhost: 2222
  • Le opzioni HostKeyAlias non sono necessarie, ma potrebbero aiutare a prevenire la connessione a host errato
  • Nota: i comandi sleep 10sono necessari per mantenere la connessione fino a quando il secondo comando ssh utilizza la porta inoltrata. Quindi il primo SSH si chiuderà quando il secondo SSH lascerà la porta inoltrata.

ora puoi eseguire successive sessioni ssh:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Variante:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

le successive sessioni ssh potrebbero essere aperte eseguendo:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Il vantaggio principale dell'uso dei parametri -M e -S è che è aperta solo una connessione da HostA a HostC, la sessione successiva non eseguirà nuovamente l'autenticazione e verrà eseguita molto più rapidamente.


0

Caso speciale, piattaforme miste nix:

  hostA (linux) -> HostB (solaris) -> HostC (linux)

Se è necessaria un'applicazione X su hostC e l'hop intermedio si trova sulla scatola di Solaris ... in questo caso ho trovato il netcat (nc) necessario sul ProxyCommand in questo modo:

hostA: ~ $ vi .ssh / config:

Host hostC
    ProxyCommand ssh hostB nc% h% p # dove nc è netcat

Quindi funziona il tunneling automatico:

hostA: ~ $ ssh hostC

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.