mongodb.conf中的bind_ip = 127.0.0.1无法工作,但0.0.0.0可以。

32
我不理解在mongodb中的bind_ip是什么意思。我可以通过设置bind_ip = 0.0.0.0来实现从桌面到EC2机器的远程连接,但使用bind_ip = 127.0.0.1无法工作。
请说明bind_ip是什么以及为什么适用于0.0.0.0而不适用于127.0.0.1
参考mongodb文档

bind_ip

默认:所有接口。

设置此选项以配置mongod或mongos进程绑定并侦听从此地址上的应用程序发起的连接。 您可以将mongod或mongos实例附加到任何接口;但是,如果将进程附加到公共可访问的接口, 实施适当的身份验证或防火墙限制以保护数据库的完整性。

您可以将多个逗号分隔的值连接在一起,将mongod绑定到多个IP地址。

5个回答

56

到处都写着要像这样绑定它们

bindIp : 127.0.0.1,192.168.0.50

但它不起作用。

版本3.2.0中的工作方式如下:

bindIp : [127.0.0.1,192.168.0.50]

所以尝试将您的IP地址添加到 [ ] 中

例子:

# network interfaces
net:
      port: 27017
      bindIp : [127.0.0.1,0.0.0.0]  (read what is written below in BOLD!)

然而 0.0.0.0 允许访问所有内容。虽然这在测试时没问题,但在生产环境中您应该了解此设置的安全影响!


8
我不知道为什么这个答案被标记为无用。我们花了很多时间试图理解为什么我们的MongoDB无法启动,最后我们发现bindIp参数需要这种格式来管理多个IP地址。MongoDB的日志真是让人头疼。文档中只是说:“要绑定到多个IP地址,请输入逗号分隔值列表。”关键在于列表表示什么。 - inigomedina
8
这样做是因为将数据库公开暴露给了所有IP地址。这是一个严重的安全漏洞。 - Randomblue
这不是文档中提到的格式...就像Randomblue所说的,它为每个人打开了它。 - rahil sharma
我正在使用Mongo 3.0.x,并且它在EC2上,所以我定义了两个接口,如下:bindIp: 127.0.0.1,172.145.1.15(仅为示例),我的Mongo正在侦听这些接口。在我的安全组中,我添加了过滤器以确定哪些IP可以连接到它。您能否提供一个链接,其中他们已经提到可以像[ip1,ip2]这样使用它的文档? - rahil sharma
8
一年后,约25,000个MongoDB服务器的IP地址为0.0.0.0的服务器被劫持,它们的数据丢失。应立即更新此回答。 - Panagiotis Kanavos

48

在将您的服务器绑定到0.0.0.0之前,请清楚了解这些更改的安全影响:您的服务器将公开暴露给整个互联网上所有IP。请务必在服务器上启用身份验证!

当您在EC2上将其绑定到127.0.0.1时,无法访问您的机器。这不是一个错误,而是由网络接口绑定所决定的。

127.0.0.1仅会绑定到环回接口(因此您只能在本地访问它),而0.0.0.0会将其绑定到所有可用的网络接口。

这就是为什么当您将其绑定到0.0.0.0时,可以通过EC2上的mongodb访问它(因为现在可以通过互联网访问它),而不能通过127.0.0.1访问它。

对于本地服务器(例如WAMP或本地mongodb服务器),对于您来说可能看起来没有什么区别,但是对于这种情况,您也应该考虑将其绑定到0.0.0.0可能会使它们在所有网络接口上都可用(如果没有防火墙,则对某些知道您IP的人可能是公开的!)

Server Fault上了解类似问题


我的答案更好,请查看下面的内容 :) - OWADVL
点赞了,但如果您在同一实例上,127.0.0.1不应该工作吗?您可能无法通过ssh使用mongo命令进行远程查询,但这难道不会使其更安全吗? - PirateApp
1
@PirateApp 你说得对。如果你想从同一实例连接并连接到127.0.0.1,那么一切都会正常工作。这个问题旨在寻找远程连接mongodb的解决方案,在这种情况下,你需要使用某种VPN或SSH隧道,或将绑定接口设置为公共接口。 - ConcurrentHashMap
“您的服务器将对整个互联网上的所有IP地址公开暴露”,这取决于您的防火墙设置。默认情况下,它应该被阻止。 - Wernfried Domscheit

14

对于查找这个答案的任何人来说,显然将您的mongoDB绑定到0.0.0.0可能是您最糟糕的决定。

请阅读以下文章,并确保每当您决定公开您(以及客户)的数据时,考虑以下事项:

  • 您是否有额外的防火墙规则来决定谁或什么可以访问您的服务?
  • 当使用Amazon EC2时,如果允许“内部”流量,则应视为完全公开此流量,您在Amazon上不是唯一一个
  • 您的服务是否受到密码保护?使用何种身份验证方式?数据是否以明文或使用加密方式提交?
  • 您正在使用默认数据库名称,还是复制了示例?

2
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子。- 来自审查 - Blackwood
2
@Blackwood,我怀疑在经历了大约25,000次MongoDB勒索攻击后,您可能需要重新考虑这个问题。这可能是最有帮助的答案。 - Panagiotis Kanavos
1
@PanagiotisKanavos 我已经审查了这个问题,虽然这可能是一个好建议,但它并不是问题的答案。 - Blackwood

2

0

当设置为bindIp: 127.0.0.1(或bindIp: localhost)时,mongod仅监听回环IP,这意味着您只能从运行mongod的本地计算机连接。

当设置为bindIp: 0.0.0.0(或bindIpAll: true)时,mongod会监听所有IP,这意味着您可以从任何远程计算机连接 - 除非连接被防火墙阻止。

请注意,localhost是一个别名,可能解析为IPv4地址127.0.0.1或IPv6地址::1,请参见使用Nodejs驱动程序无法在本地连接到MongoDB 6.0服务器


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