cómo conectarse al servidor mongodb a través del túnel ssh

17

Me fue fácil conectarme a mi servidor mysql remoto en AWS usando un sequelpro , sin embargo, estoy luchando para hacer lo mismo con mongodb.

Intenté configurar un túnel ssh a través de la línea de comando de esta manera:

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

También lo intenté reemplazando el host con una dirección IP

la idea es reenviar todas las conexiones mongodb en el puerto 9999 a la del host en el puerto 27101 .. sin embargo, cuando ejecuto el comando:

mongo --host localhost --port 9999

la conexión falla, obtengo esto en su lugar:

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

si corro sudo netstat -plntme sale lo siguiente (que parece en orden):

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  

alguna idea de lo que estoy haciendo mal?

actualización: así es como se ve el comando funcional final (el crédito va a kenster ):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 [email protected]

donde el -fNcomando hace que este comando se ejecute en segundo plano

abbood
fuente

Respuestas:

23

Las líneas "canal 2" y "canal 3" son de ssh. La sshdinstancia en el servidor remoto está intentando conectarse al puerto 27017 de host.com para dar servicio a una conexión de túnel, y está recibiendo un error de "tiempo de espera de conexión agotado".

En otras palabras, sshden el servidor remoto no se puede alcanzar el objetivo del túnel. Dado que el host remoto también es el host al que supuestamente estás haciendo túneles, es difícil decir cuál es el problema específico. Podría ser que "host.com" resuelva en más de una dirección IP. Está realizando una conexión SSH a un servidor en el clúster, y luego se elige un servidor diferente en el clúster como destino del túnel. Puede intentar cambiar el objetivo del túnel a "localhost" en lugar de "host.com":

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

Actualizar:

"-L 9999: localhost: 27017" significa que el sshcliente en el servidor local escucha las conexiones en el puerto 9999. Cuando obtiene una conexión, la conecta a la sshdinstancia en el servidor remoto. La sshdinstancia remota se conecta desde allí a localhost: 27017. Entonces "localhost" aquí es desde la perspectiva del servidor remoto.

Con la salida de netstat, es un poco más claro por qué no estaba funcionando antes. La parte "127.0.0.1:27017" significa que Mongodb está específicamente vinculado a la interfaz localhost (127.0.0.1) en el host remoto. No puede contactar esa instancia de mongodb directamente al intentar conectarse a la dirección IP normal del host; solo puede contactar esa instancia de mongodb a través de la dirección localhost. Y, por supuesto, dado que es localhost, solo puede contactarlo desde un cliente que se ejecute en el mismo host.

Entonces, la forma en que lo está haciendo ahora: tunelizar una conexión al servidor a través de ssh y luego conectarse a localhost desde allí, es la forma de hacerlo.

Kenster
fuente
eso es realmente extraño ... la forma en que usas -Lparece contradecir la página de manual de 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 explícitamente que hostes el host del servidor remoto ... ¿lo estás usando para local?
Abbood
Intenté el mismo comando con una dirección IP ... pero el mismo resultado ... por cierto, actualicé mi pregunta para mostrar el resultado de ejecutar netstat para servicios de escucha si eso ayuda
Abbood
después de leer por aquí y por aquí , tu camino es el correcto. sin embargo tengo una pregunta .. en el primer link el chico explica por qué es necesaria su comando ->
Abbood
1
ssh -L 27017: myserver: 27017 user @ myserver Debe escuchar en el puerto 27017 en localhost, luego hacer un túnel sobre la conexión ssh a mi servidor y luego presionar myserver en el puerto 27017. Ahora, si myserver está escuchando solo en localhost, esto no lo hará funciona, porque el nombre de host puede estar apuntando a la dirección IP externa. Si ese es el caso, pruebe este ssh -L 27017: localhost: 27017 user @ myserver
abbood
¿puedes explicar qué significa esto? ¿Qué significa 'hostname solo apunta a una dirección IP externa'?
Abbood
-1

He hecho algunas configuraciones en mi cuadro Ubuntu 18 Vagrant para conectar MongoDB de forma remota de forma exitosa utilizando Robo 3T GUI. Lo he explicado en los siguientes pasos.

  1. En el servidor Ubuntu, para abrir la ejecución de shell mongo:
    $ mongo
    
  2. Dentro de mongo shell, escriba el siguiente comando para crear un nuevo usuario administrador.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Por defecto, mongodb está configurado para permitir conexiones solo desde localhost (IP 127.0.0.1). Necesitamos permitir conexiones remotas desde cualquier dirección IP. El siguiente cambio solo debe hacerse en su servidor de desarrollo. Abre etc / mongod.conf y realice el siguiente cambio.

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

    También en la misma opción de seguridad descomentar archivo mongod.conf y agregar la opción de autorización como se muestra a continuación.

    security:
        authorization: enabled
    
  4. Guarde y salga del archivo mongod.conf y reinicie el servidor mongodb.

    $ sudo servcie mongod restart
    
  5. Descargue e instale la herramienta Robo 3T GUI.

  6. En Robo 3T GUI, en la configuración de conexión, debe hacer algunos cambios como se muestra en las capturas de pantalla a continuación.

ingrese la descripción de la imagen aquí

Ingrese el nombre de usuario y la contraseña de la base de datos de administración de mongodb que creó anteriormente.

ingrese la descripción de la imagen aquí

Aquí, ingresé mis credenciales ssh de Ubuntu Vagrant box.

ingrese la descripción de la imagen aquí

Guarde los cambios y presione el icono de conexión para ver si la conexión funciona bien.

Krishna
fuente