2015-10-09 13 views
5

Ho un server e un computer remoto. Ora voglio accedere al computer remoto tramite SSH, ma è possibile che sia dietro un NAT. Questa è una delle ragioni per cui voglio una connessione SSH inversa.SSH inverso con golang

L'idea è stabilire una connessione dal computer remoto al server e utilizzare questa connessione per comunicare tramite SSH dal server al computer remoto.

Con OpenSSH questo è abbastanza facile. Dal computer remoto apro il tunnel SSH inverso:

ssh- R 19999:localhost:22 [email protected] 

ora posso usare questo dal lato server con:

ssh localhost -p 19999 

voglio ottenere lo stesso comportamento con un'applicazione andare e in movimento Libreria SSH sul computer remoto. Il server continuerà a utilizzare OpenSSH quindi non dovrebbe essere modificato.

So come connettersi a un computer tramite SSH da go ma come si può ottenere la parte inversa?

func main() { 
    config := &ssh.ClientConfig{ 
     User: "vagrant", 
     Auth: []ssh.AuthMethod{ 
      ssh.Password("vagrant"), 
     }, 
    } 

    conn, err := ssh.Dial("tcp", "192.168.0.10:22", config) 
    if err != nil { 
     panic("Failed to dial: " + err.Error()) 
    } 
} 

risposta

3

Ho trovato una soluzione. OpenSSH restituisce una sessione terminale o l'output di un comando se ne fornite uno. Inoltre consente di autenticare la connessione dal server al client tramite il tunnel aperto.

Per supportare questo comportamento, avevo bisogno di fornire al listener della connessione aperta un implementet del server ssh in modalità remota. Più complicato poi ho pensato ma funziona.

Ho un server di esempio operativo here. Ho solo bisogno di scambiare il listener nel codice di esempio per un listener sulla connessione client.

+0

Ehi, ho provato il tuo server_complex.go, non funziona, ho ricevuto l'errore: 2016/11/21 16:56:04 nuova connessione ssh da 193.40.242.84:53374 (SSH-2.0-Go) 2016/11/21 16:56:04 ha ricevuto la richiesta fuori banda: & {Tipo: tcpip-forward WantReply: true Payload: [0 0 0 7 48 46 48 46 48 46 48 0 0 85 241] ch: mux : 0x105675c0} – Anton

2

si utilizza Client.Listen (o Client.ListenTCP) per impostare il port forwarding sul server.

È quindi possibile accettare le connessioni dal listener restituito proprio come qualsiasi altro listener di rete.