如何使用多个IP地址设置mongod.conf的bind_ip?

56
我是一个新手,不太懂如何设置服务器环境和mongoDB。这听起来很简单,但我真的需要你的帮助。
我正在尝试从本地计算机连接到运行mongodb实例的虚拟机,我认为这应该类似于在单独的远程服务器上运行时的生产环境。
环境如下:
- 虚拟机的私有IP: 192.168.184.155 - 本地计算机和虚拟机的公共IP:96.88.169.145
我更改了/etc/mongod.conf文件中的bind_ip
bind_ip = 127.0.0.1

to

bind_ip = 127.0.0.1,192.168.184.155,96.88.169.145

在我重新启动mongod服务后,无论是虚拟机还是本地机器都无法通过mongodb命令访问mongodb,并给出以下错误。

MongoDB shell version: 3.0.1
connecting to: test
2015-03-17T16:02:22.705-0400 W NETWORK  Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2015-03-17T16:02:22.707-0400 E QUERY    Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

然而,如果我改变

bind_ip = 192.168.184.155

重新启动服务后,我可以从本地机器上使用mongo进行访问。但是在多个IP地址上似乎无法正常工作。我尝试在mongodb文档中查找信息,但它们提到的bind_ip参数需要使用逗号分隔的列表,这让我很困惑。

非常感谢您的帮助。


1
如果您使用bind_ip = 127.0.0.1,192.168.184.155会怎样?对我来说,96.88.169.145不是您的VM上有效的IP。 - anhlc
1
@anhlc 这是相同的结果。一旦我添加了多个IP地址,它们都无法工作。有什么想法吗? - yeelan
1
你能否从日志中获取启动 mongod 时解析的命令行选项?它真的应该可以工作,所以我想知道是否有一些奇怪的 VM 网络障碍? - wdberkeley
嗨@wdberkeley,非常感谢您提出这个问题!我检查了日志文件,并找到了问题所在!似乎我不小心在下一个IP地址之前加了一个空格,导致整个程序崩溃。 - yeelan
我建议设置 bindIpAll: true。当您有一台具有多个网络接口的机器时,使用带有IP地址的 bindIp 是有用的,否则在我看来它没有太多意义。例外情况是 bindIp: localhost,当您想要防止任何外部连接时,通常在维护工作期间使用。 - Wernfried Domscheit
显示剩余2条评论
20个回答

2
在Mongo 3.*中, 使用括号,例如:
net:
    port: 27017
    bindIp : [127.0.0.1,10.0.0.2,10.0.0.3]

1

逗号分隔的bindIp规则仅适用于已知的以太网接口,或者适用于0.0.0.0和127.0.0.1规则。您只能使用系统网络接口卡的IP地址。如果此列表包含未知的IP地址,即另一个系统的IP,则您的MongoDb实例将无法重新启动,因此您将无法连接。要检查MongoDb实例是否正在运行,请运行以下命令:

$ sudo systemctl status mongod

如果您希望使MongoDb实例在网络上对其他系统可用,您需要绑定与私有网络相关联的本地IP。为了轻松确定网络接口配置,请只需从命令行运行ifconfig:
$ ifconfig

这将列出所有可用于bindIp规则的IP地址。毫无疑问,您使用的IP地址96.88.169.145不是有效的IP地址或者被您的系统所不知道。

1
对于版本4.4.6,因此 - 假设为系列4.x(也许是某些系列3.x),正确的语法是:

  • bindIp: 127.0.0.1,<private_host_ip>,<public_host_ip>

每个新IP只需使用,而不带任何空格。

对于局域网访问,必须使用private_host_ip,您可以使用WindowsLinux分别使用ipconfigip a来了解ip值。当然,对于公共WAN访问,必须使用<public_host_ip>,这与您的ISP有关。

警告 - private_host_ip<public_host_ip>都是您的MongoDB 服务器运行的位置,而不是远程客户端。因此,假设每个新的ip代表一个远程客户端 IP地址(与服务器 IP地址 - LAN和/或WAN不同)是错误的,这是不正确的

注意 为了避免问题,最好使用静态IP地址,一个通过您的路由器使用私有IP地址,另一个通过您的ISP使用公共IP地址。


1

Ubuntu 16.04 -> MongoDB shell 版本:2.6.10

对我来说,以下内容有效:

bind_ip = [127.0.0.1;X.X.X.X]

请注意,我使用的是 ; 而不是 ,


Ubuntu 14 配合 mongo 2.6 也可以这样使用。谢谢 finezza。 - undefined

1
在我的Ubuntu16.04 LTS上,mongodb版本3.6中的情况是您不需要将IP地址放在方括号“[]”中。删除逗号后的空格可以解决mongod日志(/var/log/mongodb/mongod.log)中连接失败的问题。
NETWORK  [initandlisten] getaddrinfo(" xxx.xxx.xxx.xxx") failed: Name or service not known

在将bindIp: 127.0.0.1修改为bindIp: 127.0.0.1,xxx.xxx.xxx.xxx(注意IP地址之间没有逗号)后,主机IP如下所示:
xxx@xxxx:/var/log/mongodb$ sudo netstat -plnt |egrep mongod
tcp        0      0 xxx.xxx.xxx.xxx:27017   0.0.0.0:*               LISTEN      30747/mongod    
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      30747/mongod 

1
Amazon-linux2 | Cent OS | MongoDB shell 版本:3.0.15
这是在最新配置中需要完成的方式。
#network interfaces
net:
  port: 27017
  bindIp: [xxx.xxx.xxx.xxx,127.0.0.1]  # Listen to local interface only, comment to listen on all interfaces.

干杯!!


错误:标量选项 'net.bindIp' 必须是单个值。 - Sergey Onishchenko

0
这适用于我的mongo v4.2.15

vi /etc/mongod.conf

net:
  port: 27017
  bindIp: 127.0.0.1;X.X.X.X;Y.Y.Y.Y

sudo systemctl restart mongod


0

在 MongoDB 服务器版本:3.6.8 中,我使用普通的逗号分隔列表即可正常工作。无论逗号后面是否有空格。

bind_ip = 127.0.0.1, 192.168.0.104
bind_ip = 127.0.0.1,192.168.0.104

然而,在MongoDB日志中加上封闭的[]会导致以下错误。
bind_ip = [127.0.0.1,192.168.0.104]
getaddrinfo("[127.0.0.1") failed: Name or service not known

bind_ip = [127.0.0.1, 192.168.0.104]
getaddrinfo("[127.0.0.1") failed: Name or service not known

0

我使用以下代码解决了这个问题。我的mongod版本是4.4.21。

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1, <your_server_ip>
  bindIpAll: true

更改后重新启动mongod服务。
sudo service mongod restart

为了验证连接,请在本地终端中编写以下代码

nc -zv <your_server_ip> 27017

输出:

Connection to <your_server_ip> port 27017 [tcp/*] succeeded!

-11

如果您只想通过网络连接到这台机器,您不需要修改bind_ip的值。

在您的情况下,您需要按照以下步骤操作:

  1. 设置远程机器阻止所有对端口27017的连接
  2. 启用远程机器仅接受来自本地机器的连接
  3. 使用MongoDB设置凭据
  4. 使用凭据连接客户端。

如果您不确定如何执行任何这些步骤,请查看我撰写的博客文章,其中详细介绍了如何执行此操作。

博客文章

希望这可以帮助您。


1
那根本就没有任何意义。 - r3wt
什么部分?他想要通过简单的网络从公共位置访问一台机器。 - Rick
请确保如果您要给这个答案投反对票,您需要附带理由。https://youtu.be/Jsb-9iM_tiw - Rick
1
我对这个答案进行了负评,因为它是错误的。例如,考虑一个私有网络。网络安全可以防止未经授权的访问Mongo集群。但是客户端需要绑定到私有接口才能正常工作。但是,在某些情况下,您可能还需要将本地主机绑定到统计信息、维护等方面。即使使用凭据,绑定所有也很危险。我的Web服务器通过私有网络接口(本地子网)连接到我的Mongo集群,比公共互联网更安全。 - r3wt
1
你的回答和博客文章与OP的问题无关,OP的问题是关于在虚拟机上配置bind_ip时出现的问题。 - Vince Bowdren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接