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

abb*_*ood 21 ssh database ssh-tunnel ssh-keys mongodb

这是很容易让我连接到我的远程MySQL服务器上使用AWS sequelpro,但是我用的MongoDB做同样的事情挣扎。

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

ssh -fN -l root -i path/to/id_rsa -L 9999:host.com:27017 host.com
Run Code Online (Sandbox Code Playgroud)

我也试过用 ip 地址替换主机

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

mongo --host localhost --port 9999
Run Code Online (Sandbox Code Playgroud)

连接失败,我得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

如果我运行,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  
Run Code Online (Sandbox Code Playgroud)

知道我在做什么错吗?

更新: 这是最终功能命令的样子(归功于kenster):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 root@remote.server.com
Run Code Online (Sandbox Code Playgroud)

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

Ken*_*ter 28

“通道 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
Run Code Online (Sandbox Code Playgroud)

更新:

“-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 实例——您只能通过 localhost 地址联系该 mongodb 实例。当然,由于它是本地主机,因此您只能从运行在同一主机上的客户端进行联系。

所以,你现在的做法——通过 ssh 建立到服务器的连接,然后从那里连接到 localhost——就是这样做的方法。

  • ssh -L 27017:myserver:27017 user@myserver 应该侦听本地主机上的端口 27017,然后通过 ssh 连接到我的服务器,然后在端口 27017 上访问 myserver。现在,如果 myserver 仅侦听本地主机,则这不会工作,因为主机名可能指向外部 IP 地址。如果是这种情况,请尝试此 ssh -L 27017:localhost:27017 user@myserver (2认同)