como conectar-se ao servidor mongodb via túnel ssh

16

Foi fácil conectar-me ao meu servidor mysql remoto na AWS usando um sequelpro , no entanto, estou lutando para fazer o mesmo com o mongodb.

Eu tentei configurar um túnel ssh via linha de comando da seguinte maneira:

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

Eu também tentei substituindo host por um endereço IP

a idéia é encaminhar todas as conexões mongodb na porta 9999 para aquela no host da porta 27101 .. no entanto, quando executo o comando:

mongo --host localhost --port 9999

a conexão falha, eu recebo isso:

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 eu executar sudo netstat -plnt, recebo o seguinte (que parece em ordem):

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  

alguma ideia do que estou fazendo de errado?

update: é assim que o comando funcional final se parece (o crédito vai para o kenster ):

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

onde o -fNcomando faz com que este comando seja executado em segundo plano

abbood
fonte

Respostas:

22

As linhas "canal 2" e "canal 3" são de ssh. A sshdinstância no servidor remoto está tentando se conectar à porta host.com 27017 para atender a uma conexão de encapsulamento e está recebendo um erro de "tempo limite de conexão expirado".

Em outras palavras, sshdno servidor remoto não é possível alcançar o alvo do túnel. Como o host remoto também é o host para o qual você supostamente está encapsulando, é difícil dizer qual é o problema específico. Pode ser que "host.com" resolva para mais de um endereço IP. Você está fazendo uma conexão SSH com um servidor no cluster e, em seguida, um servidor diferente no cluster está sendo escolhido como o destino do túnel. Você pode tentar alterar o destino do túnel para "localhost" em vez de "host.com":

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

Atualizar:

"-L 9999: localhost: 27017" significa que o sshcliente no servidor local escuta as conexões na porta 9999. Quando obtém uma conexão, encapsula a conexão com a sshdinstância no servidor remoto. A sshdinstância remota se conecta de lá ao localhost: 27017. Então, "localhost" aqui é da perspectiva do servidor remoto.

Com a saída netstat, fica um pouco mais claro por que não estava funcionando antes. A parte "127.0.0.1:27017" significa que o Mongodb está especificamente vinculado à interface localhost (127.0.0.1) no host remoto. Você não pode entrar em contato diretamente com essa instância do mongodb tentando se conectar ao endereço IP regular do host - é possível entrar em contato apenas com essa instância do mongodb através do endereço do host local. E, é claro, como é o host local, você só pode entrar em contato se for de um cliente executando no mesmo host.

Portanto, a maneira como você está fazendo isso agora - encapsula uma conexão com o servidor através do ssh e depois se conecta ao host local a partir daí - é a maneira de fazê-lo.

Kenster
fonte
isso é realmente estranho .. a maneira como você usa -Lparece contradizer a página de manual do 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.diz explicitamente que hosté o host do servidor remoto .. você está usando o local?
Abbood
Tentei o mesmo comando com um endereço IP .. mas mesmo resultado .. btw eu atualizei a minha pergunta para mostrar o resultado de me executar netstat para ouvir serviços se isso ajuda
abbood
depois de ler por aqui e aqui, o seu caminho é o caminho correto. no entanto eu tenho uma pergunta .. no primeiro link o cara explica por que seu comando é necessário ->
abbood
1
ssh -L 27017: myserver: 27017 user @ myserver Deve escutar na porta 27017 no localhost, encapsular a conexão ssh com o meu servidor e depois pressionar myserver na porta 27017. Agora, se o myserver estiver escutando apenas o localhost, isso não acontecerá. trabalho, porque o nome do host pode estar apontando para o endereço IP externo. Se for esse o caso, tente este ssh -L 27017: localhost: 27017 user @ myserver
abbood
você pode explicar o que isso significa? o que significa 'nome do host apenas apontando para endereço IP externo'?
Abbood 23/05
0

Fiz algumas configurações na minha caixa do Ubuntu 18 Vagrant para conectar com êxito o MongoDB remotamente usando o Robo 3T GUI. Eu expliquei nas etapas a seguir.

  1. No servidor Ubuntu, para abrir o mongo shell run:
    $ mongo
    
  2. Dentro do mongo shell, digite o seguinte comando para criar um novo usuário administrador.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Por padrão, o mongodb está configurado para permitir conexões apenas do host local (IP 127.0.0.1). Precisamos permitir conexões remotas a partir de qualquer endereço IP. A seguinte mudança deve ser feita apenas no seu servidor de desenvolvimento. Abra o arquivo etc / mongod.conf e faça a seguinte alteração.

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

    Também no mesmo arquivo mongod.conf, descomente a opção de segurança e inclua a opção de autorização, como mostrado abaixo.

    security:
        authorization: enabled
    
  4. Salve e saia do arquivo mongod.conf e reinicie o servidor mongodb.

    $ sudo servcie mongod restart
    
  5. Baixe e instale a ferramenta Robo 3T GUI.

  6. Na Robo 3T GUI, nas configurações de conexão, você precisa fazer algumas alterações, conforme mostrado nas capturas de tela abaixo.

insira a descrição da imagem aqui

Digite o nome de usuário e a senha do banco de dados administrativo mongodb que você criou anteriormente.

insira a descrição da imagem aqui

Aqui, digitei minhas credenciais de caixa ssh do Ubuntu 18 Vagrant.

insira a descrição da imagem aqui

Salve as alterações e pressione o ícone conectar para ver se a conexão está funcionando bem.

Krishna
fonte