alb*_*ert 2 networking centos virtual-machine mongodb macos
我正在使用 Virtualbox 在 Mac OS X 上运行的虚拟机中使用 CentOS 7。
不幸的是,我无法从我的 Mac OS 主机连接到 VM 的数据库。我使用NAT作为虚拟机的网络并定义了一个规则来将主机端口 3017 转发到虚拟机的端口 27017,这是 mongod 的默认端口。可以看出使用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
Run Code Online (Sandbox Code Playgroud)
我在来宾系统上使用 CentOS 的防火墙,但将 MongoDB 的默认端口添加27017到public区域定义中,如下所示:
[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:
Run Code Online (Sandbox Code Playgroud)
此外SELINUX被禁用:
[guestOS]$ sestatus
SELinux status: disabled
Run Code Online (Sandbox Code Playgroud)
所以我想检查从我的主机到来宾 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!
Run Code Online (Sandbox Code Playgroud)
下一步是确保它mongod确实在 VM 的操作系统上运行。所以我检查了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..
Run Code Online (Sandbox Code Playgroud)
除此之外,我还可以连接到 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]
Run Code Online (Sandbox Code Playgroud)
但是,我无法从主机操作系统连接到数据库:
[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
Run Code Online (Sandbox Code Playgroud)
所以让我总结一下整个事情:
NAT网络接口3017到访客端口27017正在工作mongod在来宾操作系统上运行SELINUX在 CentOS 中禁用27017为 CentOS 的防火墙例外添加端口Error: DBClientBase::findN: transport error: 127.0.0.1:3017 ns: admin.$cmd query: { whatsmyuri: 1 }我怎样才能解决这个错误?
alb*_*ert 13
在网上搜索引发的错误消息后,我认为这是与 SSL/TLS 相关的问题,因为 Mac OS mongo shell 的默认版本不支持 SSL/TLS 连接(但是,自制版本支持)。
所以我试图建立一个失败的加密连接并没有解决问题。
之后,我想到了对数据库的外部访问。Virtualbox 将端口转发到 VM,因此传入请求是从 VM 的网络接口完成的。由于我在蒙戈的配置添加的虚拟机的IP地址允许的IP地址/etc/mongod.conf的描述在这里:
# Listen to local and LAN interface.
bind_ip = 127.0.0.1,10.0.2.15
Run Code Online (Sandbox Code Playgroud)
最后,这解决了我的连接问题。