如何通过ssh隧道连接到mongodb服务器


17

使用sequelpro可以很容易地连接到AWS上的远程mysql服务器,但是我在mongodb上做同样的事情很费劲。

我尝试通过命令行设置ssh隧道,如下所示:

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

我也尝试用IP地址替换主机

这个想法是将端口9999上的所有mongodb连接转发到端口27101上的主机上的连接。但是当我运行命令时:

mongo --host localhost --port 9999

连接失败,我得到这个代替:

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

如果我运行,则会sudo netstat -plnt得到以下信息(按顺序显示):

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  

知道我在做什么错吗?

更新: 这是最终功能命令的样子(贷记给kenster):

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

-fN命令使该命令在后台运行

Answers:


23

“通道2”和“通道3”行来自ssh。在sshd远程服务器上的实例尝试连接到host.com端口27017以服务隧道连接,它才获得了“连接超时”的错误。

换句话说,sshd在远程服务器上无法到达隧道的目标。由于远程主机也是您要隧道传输到的主机,因此很难说出具体问题是什么。可能是“ host.com”解析为多个IP地址。您正在建立与群集中一台服务器的SSH连接,然后将群集中的另一台服务器选择为隧道目标。您可以尝试将隧道目标更改为“ localhost”,而不是“ host.com”:

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

更新:

“ -L 9999:localhost:27017”表示ssh本地服务器上的客户端侦听端口9999上的连接。获得连接后,它将通过隧道将连接传输到sshd远程服务器上的实例。远程sshd实例从那里连接到localhost:27017。因此,“ localhost”是从远程服务器的角度来看的。

使用netstat输出,可以更清楚地了解以前为什么不起作用。“ 127.0.0.1:27017”部分意味着Mongodb专门绑定到远程主机上的localhost(127.0.0.1)接口。您无法通过尝试连接到主机的常规IP地址直接联系该mongodb实例-您只能通过本地主机地址联系该mongodb实例。当然,由于它是localhost,因此只有在同一主机上运行的客户端中,您才可以联系。

因此,您现在要做的方式(通过ssh隧道连接到服务器,然后从那里连接到本地主机)是做到这一点的方式。


真的很奇怪..您使用的方式-L似乎与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.它明确表示这host是远程服务器的主机..您是否将其用于本地?
2014年

我用IP地址尝试了相同的命令..但结果却相同..顺便说一句,我更新了问题以显示运行netstat来监听服务的结果(如果有帮助的话)
2014年

阅读后左右在这里这里原来自己的方式才是正确之路。但是我有一个问题..在第一个链接中,那个家伙解释了为什么您的命令是必需的->
大约2014年

1
ssh -L 27017:myserver:27017 user @ myserver应该在localhost的端口27017上侦听,然后通过ssh连接隧道连接到我的服务器,然后在端口27017上击中myserver。现在,如果myserver仅在localhost上侦听,则不会起作用,因为主机名可能指向外部IP地址。如果是这种情况,请尝试使用此ssh -L 27017:localhost:27017 user @ myserver
2014年

您能解释一下这是什么意思吗?“主机名仅指向外部IP地址”是什么意思?
2014年

-1

为了在Robo 3T GUI上成功远程连接MongoDB,我在Ubuntu 18 Vagrant盒上做了一些配置。我已经按照以下步骤进行了说明。

  1. 在Ubuntu服务器上,打开mongo shell运行:
    $ mongo
    
  2. 在mongo shell中,键入以下命令以创建新的admin用户。

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. 默认情况下,mongodb配置为仅允许来自本地主机(IP 127.0.0.1)的连接。我们需要允许来自任何IP地址的远程连接。以下更改仅应在您的开发服务器中进行。打开 etc / mongod.conf文件并进行以下更改。

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

    同样在同一mongod.conf文件中,取消注释安全性选项并添加授权选项,如下所示。

    security:
        authorization: enabled
    
  4. 保存并退出mongod.conf文件,然后重新启动mongodb服务器。

    $ sudo servcie mongod restart
    
  5. 下载并安装Robo 3T GUI工具。

  6. 在Robo 3T GUI的连接设置中,您需要进行一些更改,如下面的屏幕截图所示。

在此处输入图片说明

输入您之前创建的mongodb admin数据库用户名和密码。

在此处输入图片说明

在这里,我输入了我的Ubuntu 18 Vagrant box ssh凭证。

在此处输入图片说明

保存更改,然后按连接图标以查看连接是否正常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.