它是简单的我使用续集,然而我在用 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
知道我做错了什么吗?
更新: 这是最终的功能命令的样子(归功于肯斯特):
ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 [email protected]
该-fN
命令使该命令在后台运行
答案1
“通道 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 实例 - 您只能通过 localhost 地址联系该 mongodb 实例。 当然,由于它是 localhost,因此您只能从在同一主机上运行的客户端联系它。
因此,您现在执行的方式 - 通过 ssh 建立与服务器的连接,然后从那里连接到本地主机 - 就是执行的方式。
答案2
为了使用 Robo 3T GUI 成功远程连接 MongoDB,我在 Ubuntu 18 Vagrant 盒子上进行了一些配置。我在以下步骤中进行了解释。
- 在 Ubuntu 服务器上,打开 mongo shell 运行:
$ mongo
在 mongo shell 中,键入以下命令来创建新的管理员用户。
> use admin; > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
默认情况下,mongodb 配置为仅允许来自 localhost(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
保存并退出mongod.conf文件并重新启动 mongodb 服务器。
$ sudo servcie mongod restart
下载并安装 Robo 3T GUI 工具。
在 Robo 3T GUI 上,在连接设置中,您需要做一些更改,如下面的屏幕截图所示。
进入 mongodb行政您之前创建的数据库用户名和密码。
在这里,我输入了我的 Ubuntu 18 Vagrant box ssh 凭证。
保存更改并按连接图标来查看连接是否正常。