web-dev-qa-db-ja.com

sshトンネル経由でmongodbサーバーに接続する方法

簡単sequelpro を使用してAWS上のリモートmysqlサーバーに接続することはできましたが、mongodbで同じことをするのに苦労しています。

私はコマンドラインで次のようにsshトンネルを設定しようとしました:

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

Hostを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  

私が間違っていることは何か考えていますか?

update:これは、最終的な機能コマンドがどのように見えるかです(クレジットは kenster に移動します):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 [email protected]

どこ -fNコマンドは、このコマンドをバックグラウンドで実行します

18
abbood

「チャネル2」および「チャネル3」の行はsshからのものです。リモートサーバーのsshdインスタンスは、トンネル接続を処理するためにHost.comポート27017に接続しようとしていますが、「接続がタイムアウトしました」というエラーが発生します。

つまり、リモートサーバー上のsshdがトンネルのターゲットに到達できません。リモートホストは、トンネリング先のホストでもあるため、特定の問題が何であるかを言うのは困難です。 「Host.com」が複数のIPアドレスに解決される可能性があります。クラスター内の1つのサーバーへのSSH接続を作成していて、クラスター内の別のサーバーがトンネルターゲットとして選択されています。トンネルターゲットを「Host.com」ではなく「localhost」に変更してみてください。

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がリモートホストのローカルホスト(127.0.0.1)インターフェースに明確にバインドされていることを意味します。ホストの通常のIPアドレスに接続しようとしても、mongodbのインスタンスに直接接続することはできません。ローカルホストアドレスを介してのみ、mongodbのインスタンスに接続できます。そしてもちろん、それはlocalhostであるため、同じホスト上で実行されているクライアントからのみアクセスできます。

だから、あなたが今それをやっている方法-ssh経由でサーバーへの接続をトンネルし、そこからlocalhostに接続する-はそれを行う方法です。

25
Kenster

Robo 3T GUIを使用してMongoDBをリモートで正常に接続するために、Ubuntu 18 Vagrantボックスでいくつかの構成を行いました。以下の手順で説明しました。

  1. Ubuntuサーバーでmongo Shellを開くには、を実行します。
    $ mongo
    
  2. Mongo Shell内で、次のコマンドを入力して新しい管理ユーザーを作成します。

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. デフォルトでは、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ファイルのコメント解除セキュリティオプションで、以下に示すようにauthorizationオプションを追加します。

    security:
        authorization: enabled
    
  4. mongod.confファイルを保存して終了し、mongodbサーバーを再起動します。

    $ Sudo servcie mongod restart
    
  5. Robo 3T GUIツールをダウンロードしてインストールします。

  6. Robo 3T GUIの接続設定では、以下のスクリーンショットに示すように、いくつかの変更を行う必要があります。

enter image description here

以前に作成したmongodb adminデータベースのユーザー名とパスワードを入力します。

enter image description here

ここでは、Ubuntu 18 VagrantボックスのSSH資格情報を入力しました。

enter image description here

変更を保存し、connectアイコンを押して、接続が正常に機能しているかどうかを確認します。

0
Krishna