Amazon-Web-Services

無法通過 SSH 連接到在 AWS EC2 實例上執行的 MongoDB

  • November 1, 2016

我有一個執行 MongoDB 作為服務的 Amazaon 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 數據庫 via mysql -P 6789 -u user_name -p,所以問題是特定於 MongoDB 的。

至於連接性,我將 Putty 的keepalive選項設置為 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

問題是 100% EBCAK。結果我使用這些指令設置了到 MySQL 實例的初始 SSH 隧道,這些指令將我本地機器上的一個埠映射到 Amazon RDS 實例上的埠 3306,而 MongoDB 守護程序 ( mongod) 在 EC2 實例上執行。在設置到 MongoDB 實例的 SSH 隧道時,我過於嚴格地按照說明進行操作,結果將我機器上的埠 12345 映射到 MySQL 實例上的埠 27017,而不是執行的 EC2 實例mongod

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

引用自:https://serverfault.com/questions/812360