como se conectar ao servidor mongodb via túnel ssh

13

Foi fácil para eu conectar ao meu servidor mysql remoto na AWS usando um sequelpro , no entanto estou lutando para fazer a mesma coisa com o mongodb.

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

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

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

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

mongo --host localhost --port 9999

a conexão falha, eu entendo 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 correto):

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 errado?

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

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

em que o comando -fN faz este comando ser executado em segundo plano

    
por abbood 22.05.2014 / 12:51

1 resposta

18

As linhas "canal 2" e "canal 3" são de ssh . A instância sshd no servidor remoto está tentando se conectar à porta host.com 27017 para fazer a manutenção de uma conexão de encapsulamento, e está recebendo um erro de "conexão esgotada".

Em outras palavras, sshd no servidor remoto não pode alcançar o destino do túnel. Como o host remoto também é o host ao qual você supostamente está tunelando, é difícil dizer qual é o problema específico. Pode ser que "host.com" resolva 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 de encapsulamento. 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

Atualização:

"- L 9999: localhost: 27017" significa que o cliente ssh no servidor local atende às conexões na porta 9999. Quando recebe uma conexão, encapsula a conexão com a instância sshd no servidor remoto . A instância sshd remota se conecta a partir do localhost: 27017. Então, "localhost" aqui é da perspectiva do servidor remoto.

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

Assim, a maneira como você está fazendo agora - encapsula uma conexão com o servidor por meio do ssh e, em seguida, conecta-se ao localhost de lá - é a maneira de fazê-lo.

    
por 22.05.2014 / 20:13