簡単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
コマンドは、このコマンドをバックグラウンドで実行します
「チャネル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に接続する-はそれを行う方法です。
Robo 3T GUIを使用してMongoDBをリモートで正常に接続するために、Ubuntu 18 Vagrantボックスでいくつかの構成を行いました。以下の手順で説明しました。
$ 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ファイルのコメント解除セキュリティオプションで、以下に示すようにauthorizationオプションを追加します。
security:
authorization: enabled
mongod.confファイルを保存して終了し、mongodbサーバーを再起動します。
$ Sudo servcie mongod restart
Robo 3T GUIツールをダウンロードしてインストールします。
Robo 3T GUIの接続設定では、以下のスクリーンショットに示すように、いくつかの変更を行う必要があります。
以前に作成したmongodb adminデータベースのユーザー名とパスワードを入力します。
ここでは、Ubuntu 18 VagrantボックスのSSH資格情報を入力しました。
変更を保存し、connectアイコンを押して、接続が正常に機能しているかどうかを確認します。