web-dev-qa-db-ja.com

virtualboxで実行されているmongodbに接続できません(ホスト:Mac OS、ゲスト:CentOS)

Virtualboxを使用してMacOSXで実行されている仮想マシンでCentOS7を使用しています。

残念ながら、MacOSホストからVMのデータベースに接続できません。 VMのネットワークとしてNATを使用しており、ホストポート3017をmongodのデフォルトポートであるVMのポート27017に転送するルールを定義しています。VBoxManage showvminfo CentOS | grep 'NICを使用して確認できます。

[hostOS]$ VBoxManage showvminfo CentOS | grep 'NIC'
NIC 1:           MAC: 080027EF3CC0, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
NIC 1 Rule(0):   name = http, protocol = tcp, Host ip = , Host port = 3080, guest ip = , guest port = 80
NIC 1 Rule(1):   name = mongo, protocol = tcp, Host ip = , Host port = 3017, guest ip = , guest port = 27017
NIC 1 Rule(2):   name = ssh, protocol = tcp, Host ip = , Host port = 3022, guest ip = , guest port = 22

ゲストシステムでCentOSのファイアウォールを使用していますが、ここに示すように、MongoDBのデフォルトポート27017publicゾーン定義に追加しました。

[guestOS]$ firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources: 
  services: dhcpv6-client http https ssh
  ports: 27017/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

さらに、SELINUXは無効になっています:

[guestOS]$ sestatus
SELinux status:                 disabled

そこで、ホストからゲストへのポート転送VMが希望どおりに機能しているかどうかを確認したいと思いました。nc -w 3 -v localhost 3017を使用すると、ポート転送が希望どおりに機能するはずです。

[hostOS]$ nc -w 3 -v localhost 3017
found 0 associations
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
    outif lo0
    src 127.0.0.1 port 50595
    dst 127.0.0.1 port 3017
    rank info not available
    TCP aux info available

Connection to localhost port 3017 [tcp/event_listener] succeeded!

次のステップは、mongodがVMのOSで実際に実行されていることを確認することでした。そこで、mongodのステータスを確認しました:

[guestOS]$ systemctl status mongod
● mongod.service - SYSV: Mongo is a scalable, document-oriented database.
   Loaded: loaded (/etc/rc.d/init.d/mongod)
   Active: active (running) since So 2016-02-21 20:35:31 CET; 4min 12s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1167 ExecStart=/etc/rc.d/init.d/mongod start (code=exited, status=0/SUCCESS)
 Main PID: 1236 (mongod)
   CGroup: /system.slice/mongod.service
           └─1236 /usr/bin/mongod -f /etc/mongod.conf

Feb 21 20:35:27 localhost.localdomain systemd[1]: Starting SYSV: Mongo is a scalable, document-oriented database....
Feb 21 20:35:28 localhost.localdomain runuser[1191]: pam_unix(runuser:session): session opened for user mongod by (uid=0)
Feb 21 20:35:31 localhost.localdomain runuser[1191]: pam_unix(runuser:session): session closed for user mongod
Feb 21 20:35:31 localhost.localdomain mongod[1167]: Starting mongod: [  OK  ]
Feb 21 20:35:31 localhost.localdomain systemd[1]: Started SYSV: Mongo is a scalable, document-oriented database..

それに加えて、VMのように:内のデータベースに接続することができます:

[guestOS]$ mongo
MongoDB Shell version: 3.2.3
connecting to: test
Server has startup warnings: 
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] 
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] 
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-02-21T20:35:31.414+0100 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-21T20:35:31.415+0100 I CONTROL  [initandlisten] 
2016-02-21T20:35:31.415+0100 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
2016-02-21T20:35:31.415+0100 I CONTROL  [initandlisten] 

ただし、ホストOSからデータベースに接続できません。

[hostOS]$ mongo --port 3017
MongoDB Shell version: 3.0.6
connecting to: 127.0.0.1:3017/test
2016-02-21T20:47:38.810+0100 I NETWORK  DBClientCursor::init call() failed
2016-02-21T20:47:38.813+0100 E QUERY    Error: DBClientBase::findN: transport error: 127.0.0.1:3017 ns: admin.$cmd query: { whatsmyuri: 1 }
    at connect (src/mongo/Shell/mongo.js:181:14)
    at (connect):1:6 at src/mongo/Shell/mongo.js:181
exception: connect failed

それでは、全体を少し要約しましょう。

  • macOSのvirtualboxでゲストとしてCentOS7を使用する
  • ネットワークインターフェースとしてNATを使用
  • ホストポート3017をゲストポート27017に転送しています
  • mongodがゲストOSで実行されていることを確認しました
  • centOSでSELINUXを無効にしました
  • centOSのファイアウォール例外にポート27017を追加しました
  • ホストOSからmonogdbに接続すると、Error: DBClientBase::findN: transport error: 127.0.0.1:3017 ns: admin.$cmd query: { whatsmyuri: 1 }が発生します

どうすればそのエラーを解決できますか?

2
albert

発生したエラーメッセージをWebで検索した後、Mac OS mongoShellのデフォルトバージョンはSSL/TLS接続をサポートしていないため(ただし、自作バージョンはサポートしているため)、これはSSL/TLS関連の問題であると思いました。

そこで、暗号化された接続を確立しようとしましたが、失敗しても問題は解決しませんでした。

その後、データベースへの外部アクセスを考えました。 VirtualboxはVMへのポート転送を行うため、着信要求はVMのネットワークインターフェイスから行われます。そのため、mongoの構成で許可されているIPにVMのIPアドレスを追加しました/etc/mongod.conf説明どおり ここ

# Listen to local and LAN interface.
bind_ip = 127.0.0.1,10.0.2.15

最後に、これで接続の問題が解決しました。

13
albert

同様の問題が発生しました(Windows 10ホスト、Ubuntu 18.04ゲスト)。私の場合、ホストIPは頻繁に変更されるため、そのIPをbind_ipに追加しても役に立ちませんでした。 /etc/mongodb.confを編集して置き換えました

bind_ip = 127.0.0.1

bind_ip_all = true

mongodbを再起動した後は、すべて順調でした。自分が何をしているのかを正確に理解していない限り、これはセキュリティ面では優れたアイデアではないことに注意してください。私の場合、すべてのmongodbデータは使い捨てのテストデータであり、信頼できるネットワーク上にあります。 YMMV。

0
ksenzee