无法通过 SSH 连接到在 AWS EC2 实例上运行的 MongoDB

无法通过 SSH 连接到在 AWS EC2 实例上运行的 MongoDB

我有一个运行 MongoDB 服务的 Amazon AWS EC2 实例,我使用这些说明。我能够将 Putty 放入我的 EC2 实例并通过调用mongo --port 27017Putty shell 进入 MongoDB shell,因此mongod守护进程在该机器上运行良好。

我设置了从我的计算机到 EC2 实例的 SSH 隧道,将我计算机上的端口 12345 映射到远程 EC2 实例上的 27017。但是,当我尝试通过调用从本地 Windows 计算机连接到 MongoDB 时mongo --port 12345,mongo shell 客户端挂起约一分钟并返回:

connecting to: 127.0.0.1:12345/test
2016-10-31T11:31:39.727-0700 I NETWORK  [thread1] Socket recv() errno:10054 An existing connection was forcibly closed by the remote host. 127.0.0.1:12345
2016-10-31T11:31:39.727-0700 I NETWORK  [thread1] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:12345]
2016-10-31T11:31:39.728-0700 E QUERY    [thread1] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:12345'  :
connect@src/mongo/shell/mongo.js:231:14
@(connect):1:6

exception: connect failed

作为背景,我也有一个运行 MySQL 并监听 EC2 实例上端口 3306 的 Amazon RDS,以及一个将我本地机器上的端口 6789 映射到 EC2 实例上的端口 3306 的 SSH 隧道,并且我通过连接到 MySQL 数据库没有任何问题mysql -P 6789 -u user_name -p,所以问题特定于 MongoDB。

至于连接性,我有 Putty 的活着选项设置为 1,以下 PowerShell 脚本测试对两个 SSH 隧道端口都返回 true,因此隧道肯定已连接:

function test-connection{
    param($IP,$PORT)
    $connected = $FALSE
    $s = New-Object Net.Sockets.TcpClient
    try{
        $s.Connect($IP,$PORT)
        $connected = !!$s.connected
    }catch{
        #PASS
    }finally{
        $s.close()
    }
    $connected
}
test-connection "127.0.0.1" 12345
test-connection "127.0.0.1" 6789

答案1

问题完全是 EBCAK。原来我使用以下命令设置了到 MySQL 实例的初始 SSH 隧道这些说明它将我本地计算机上的端口映射到 Amazon RDS 实例上的端口 3306,而 MongoDB 守护程序 ( mongod) 在 EC2 实例上运行。在设置到 MongoDB 实例的 SSH 隧道时,我过于严格地遵循了说明,结果将我计算机上的端口 12345 映射到 MySQL 实例上的端口 27017,而不是运行的 EC2 实例mongod

毫不奇怪,更新隧道以连接到 EC2 实例而不是 RDS 实例就可以了。

相关内容