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


16

sequelproを使用してAWSのリモートmysqlサーバーに接続するのは簡単でしたが、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  

私が間違っていることは何ですか?

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

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 root@remote.server.com

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

回答:


22

「チャネル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アドレスを介してのみ連絡できます。そしてもちろん、それはlocalhostなので、同じホストで実行されているクライアントからのみ連絡できます。

そのため、現在の方法(sshを介してサーバーへの接続をトンネルし、そこからlocalhostに接続する)がその方法です。


それは本当に奇妙です..あなたの使用方法-Lはsshのマニュアルページと矛盾しているようです:-L [bind_address:]port:host:hostport Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.それは明示的にそれhostがリモートサーバーのホストであると言います..あなたはそれをローカルで使用していますか?
abbood

私はところで、私はそれが助け場合は、サービスを聴くためのnetstatコマンドを実行している私の結果を表示するために私の質問を更新しました。.. IPアドレスと同じコマンドを試してみました..しかし、同じ結果
abbood

ここを読んだ後、ここが正しい方法であることがわかります。しかし、質問があります。最初のリンクで、男はあなたのコマンドが必要な理由を説明します->
abbood

1
ssh -L 27017:myserver:27017 user @ myserver localhostのポート27017でリッスンし、ssh接続を介して自分のサーバーにトンネルし、ポート27017でmyserverをヒットする必要があります。これは、ホスト名が外部IPアドレスを指している可能性があるためです。その場合は、このssh -L 27017:localhost:27017 user @ myserver
abbood

これが何を意味するのか説明してもらえますか?「ホスト名は外部IPアドレスのみを指している」とはどういう意味ですか?
abbood

0

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

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

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. デフォルトでは、mongodbはローカルホスト(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
    
  4. mongod.confファイルを保存して終了し、mongodbサーバーを再起動します。

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

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

ここで、Ubuntu 18 Vagrant box sshクレデンシャルを入力しました。

ここに画像の説明を入力してください

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.