come connettersi al server mongodb tramite tunnel ssh


17

È stato facile per me collegarmi al mio server mysql remoto su AWS usando un sequelpro , tuttavia sto lottando per fare la stessa cosa con mongodb.

Ho provato a configurare un tunnel ssh dalla riga di comando in questo modo:

ssh -fN -l root -i path/to/id_rsa -L 9999:host.com:27017 host.com

Ho anche provato a sostituire l'host con un indirizzo IP

l'idea è di inoltrare tutte le connessioni mongodb sulla porta 9999 a quella sull'host sulla porta 27101 .. tuttavia quando eseguo il comando:

mongo --host localhost --port 9999

la connessione non riesce, ottengo questo invece:

MongoDB shell version: 2.6.0
connecting to: localhost:9999/test
channel 2: open failed: connect failed: Connection timed out
channel 3: open failed: connect failed: Connection timed out
2014-05-22T14:42:01.372+0300 DBClientCursor::init call() failed
2014-05-22T14:42:01.374+0300 Error: DBClientBase::findN: transport error: localhost:9999 ns: admin.$cmd query: { whatsmyuri: 1 } at src/mongo/shell/mongo.js:148
exception: connect failed

se corro sudo netstat -plntottengo il seguente (che sembra in ordine):

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4242/node           
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1342/httpd2-prefork 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2552/sshd           
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      2505/master         
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      11719/mongod        
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      16561/redis-server  

qualche idea di cosa sto facendo di sbagliato?

aggiornamento: ecco come appare il comando funzionale finale (il credito va a kenster ):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 root@remote.server.com

dove il -fNcomando fa eseguire questo comando in background

Risposte:


23

Le linee "channel 2" e "channel 3" provengono da ssh. L' sshdistanza sul server remoto sta tentando di connettersi alla porta 27017 di host.com per servire una connessione tunnel e viene visualizzato l'errore "timeout connessione".

In altre parole, sshdsul server remoto non è possibile raggiungere l'obiettivo del tunnel. Dato che l'host remoto è anche l'host a cui si presume che tu stia eseguendo il tunneling, è difficile dire quale sia il problema specifico. È possibile che "host.com" si risolva in più di un indirizzo IP. Stai effettuando una connessione SSH a un server nel cluster, quindi come destinazione del tunnel viene scelto un server diverso nel cluster. Potresti provare a cambiare la destinazione del tunnel in "localhost" anziché "host.com":

ssh -fN -l root -i path/to/id_rsa -L 9999:localhost:27017 host.com

Aggiornare:

"-L 9999: localhost: 27017" indica che il sshclient sul server locale è in ascolto delle connessioni sulla porta 9999. Quando ottiene una connessione, esegue il tunneling della connessione sshdall'istanza sul server remoto. L' sshdistanza remota si collega da lì a localhost: 27017. Quindi "localhost" qui è dal punto di vista del server remoto.

Con l'output di netstat, è un po 'più chiaro il motivo per cui non funzionava prima. La parte "127.0.0.1:27017" significa che Mongodb è specificamente associato all'interfaccia localhost (127.0.0.1) sull'host remoto. Non puoi contattare direttamente quell'istanza di mongodb provando a connetterti al normale indirizzo IP dell'host - puoi contattare quell'istanza di mongodb solo attraverso l'indirizzo localhost. E, naturalmente, poiché è localhost, puoi contattare solo se da un client in esecuzione sullo stesso host.

Quindi, il modo in cui lo stai facendo ora - tunnel una connessione al server tramite ssh e quindi connettiti a localhost da lì - è il modo di farlo.


è davvero strano .. il modo in cui usi -Lsembra contraddire la pagina man di ssh: -L [bind_address:]port:host:hostport Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.dice esplicitamente che hostè l'host del server remoto .. lo stai usando per local?
circa

Ho provato lo stesso comando con un indirizzo IP .. ma lo stesso risultato .. tra l'altro ho aggiornato la mia domanda per mostrare il risultato di me che
eseguo

dopo aver letto qui e qui si scopre che la tua strada è la strada giusta. comunque ho una domanda .. nel primo link il ragazzo spiega perché il tuo comando è necessario ->
circa

1
ssh -L 27017: myserver: 27017 user @ myserver Dovrebbe ascoltare sulla porta 27017 su localhost, quindi scavalcare la connessione ssh sul mio server e quindi premere myserver sulla porta 27017. Ora, se myserver è in ascolto solo su localhost, questo non lo farà funziona, perché il nome host potrebbe puntare all'indirizzo IP esterno. In tal caso, prova questo ssh -L 27017: localhost: 27017 user @ myserver
circa

puoi per favore spiegare cosa significa? cosa significa "nome host indica solo un indirizzo IP esterno"?
circa

-1

Ho eseguito alcune configurazioni sul mio Ubuntu 18 Vagrant box per connettere MongoDB in remoto usando la GUI di Robo 3T. Ho spiegato nei seguenti passaggi.

  1. Sul server Ubuntu, per aprire la shell mongo eseguire:
    $ mongo
    
  2. All'interno della shell mongo, digitare il comando seguente per creare un nuovo utente amministratore.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Per impostazione predefinita mongodb è configurato per consentire connessioni solo da localhost (IP 127.0.0.1). Dobbiamo consentire connessioni remote da qualsiasi indirizzo IP. La seguente modifica dovrebbe essere eseguita solo nel server di sviluppo. Aprire il file etc / mongod.conf ed effettuare le seguenti modifiche.

    # network interfaces
        net:
            port: 27017
            bindIp: 0.0.0.0   #default value is 127.0.0.1
    

    Sempre nello stesso file mongod.conf opzione di sicurezza decommenta e aggiungi l' opzione di autorizzazione come mostrato di seguito.

    security:
        authorization: enabled
    
  4. Salvare ed uscire dal file mongod.conf e riavviare il server mongodb.

    $ sudo servcie mongod restart
    
  5. Scarica e installa lo strumento GUI di Robo 3T.

  6. Sulla GUI di Robo 3T, nelle impostazioni di connessione, è necessario apportare alcune modifiche, come mostrato nelle schermate seguenti.

inserisci qui la descrizione dell'immagine

Immettere il nome utente e la password del database di amministrazione mongodb creati in precedenza.

inserisci qui la descrizione dell'immagine

Qui, ho inserito le mie credenziali ssh di Ubuntu 18 Vagrant box.

inserisci qui la descrizione dell'immagine

Salvare le modifiche e premere l' icona Connetti per vedere se la connessione funziona correttamente.

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.