如何使用多个 ip 地址设置 mongod.conf bind_ip

Posted

技术标签:

【中文标题】如何使用多个 ip 地址设置 mongod.conf bind_ip【英文标题】:How to set mongod.conf bind_ip with multiple ip address 【发布时间】:2015-05-20 11:23:11 【问题描述】:

我是设置服务器环境和mongoDB的新手。这听起来可能很简单,但是,我真的需要你的帮助。

我正在尝试从本地机器连接到运行 mongodb 实例的虚拟机,当我在单独的远程服务器上运行它时,我认为它应该类似于生产环境。

环境如下:

虚拟机私有 IP:192.168.184.155

本地机和虚拟机的公共 IP:96.88.169.145

我将 /etc/mongod.conf 文件中的 bind_ip 更改为

bind_ip = 127.0.0.1

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 采用逗号分隔的列表,这让我很困惑。

提前感谢您的帮助。

【问题讨论】:

如果使用 bind_ip = 127.0.0.1,192.168.184.155 会怎样?对我来说 96.88.169.145 不是您 VM 上的有效 IP @anhlc 结果是一样的。一旦我添加了多个 IP 地址,它们都不起作用。有什么想法吗? 启动mongod时能否从日志中获取解析后的命令行选项?它真的应该工作,所以我想知道这里是否有一些奇怪的 VM 网络障碍? 嗨@wdberkeley,非常感谢您提出这个问题!我检查了日志文件,发现了问题!看来我碰巧在下一个 IP 地址之前添加了一个空格,这使整个事情崩溃了。 我同意 wdberkeley,总是值得检查日志文件,看看那里是否有任何关于哪里出了问题的线索。 【参考方案1】:

感谢@wdberkeley 和@anhlc 提供了线索。

我查看了 /var/log/mongodb/mongod.log 下的日志文件。它显示了问题的失败原因。

2015-03-17T16:08:17.274-0400 I CONTROL  [initandlisten] options:  config: "/etc/mongod.conf", net:  bindIp: "127.0.0.1, 192.168.184.155" , storage:  dbPath: "/var/lib/mongodb" , systemLog:  destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log"  
2015-03-17T16:08:17.332-0400 I NETWORK  [initandlisten] getaddrinfo(" 192.168.184.155") failed: Name or service not known

所以 mongo.conf 文件对空间很敏感,这是我碰巧添加的,应该已经注意到了。同样正如@anhlc 指出的那样,96.88.169.145 不是 VM 的有效 IP 地址。所以这也是造成错误的原因。

非常感谢您的帮助!希望如果有人碰巧遇到同样的问题,这可能会有所帮助。

【讨论】:

你的意思是我们应该这样写:bind_ip=127.0.0.1 192.168.184.155 96.88.169.145 即空格分隔而不是逗号分隔?【参考方案2】:

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

在您的情况下,您需要执行以下步骤。

    设置远程机器以阻止所有到端口 27017 的连接 使远程机器只接受来自本地机器的连接 使用 MongoDB 设置凭据 使用凭据与客户端连接。

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

Blog Post

希望这会有所帮助。

【讨论】:

这根本没有任何意义。 什么部分?他想从公共位置的简单网络访问一台机器。 确保如果您不赞成这个答案,您会发布为什么? youtu.be/Jsb-9iM_tiw 我否决了这个答案,因为它是错误的。一个例子,为什么,考虑一个专用网络。网络安全可防止未经授权访问 mongo 集群。但是客户端需要绑定到私有接口才能工作。但是,在某些情况下,您可能还需要绑定 localhost 以进行统计、维护等。绑定所有内容都是危险的,即使使用凭据也是如此。我的网络服务器通过专用网络接口(本地子网)连接到我的 mongo 集群,比公共互联网安全得多。 您的回答和博客文章与 OP 的问题无关 - 这是关于在虚拟机上配置 bind_ip 的问题。【参考方案3】:

你可以这样做:

bindIp: [172.31.60.184,127.0.0.1]

记住不要在逗号后面加空格。

【讨论】:

您使用的是什么版本的 MongoDb?我正在尝试使用 2.6,但这似乎不起作用(用逗号列出,没有空格),也不是带括号的版本。 这不适用于db version v3.2.12 git version: ef3e1bc78e997f0d9f22f45aeb1d8e3b6ac14a14 Ubuntu 16.04。在下面的答案中使用括号是有效的【参考方案4】:

在 mongo 3.2.7 中将逗号分隔的 Ips 用括号括起来对我来说有效:

bindIp = [127.0.0.1, 192.168.184.155, 96.88.169.145]

【讨论】:

不知道为什么这被否决但现在这似乎是常态 逗号后不应再有括号或空格。它也是 bind_ip 而不是 bindIp。这是针对 ubuntu 的,对于其他系统可能会有所不同... joe-cheng 和 @puneet-goyal 的解决方案都有效。有空格需要括号,没有空格只需要逗号分隔的列表。 在我的情况下,它在这里不起作用 3.6。它添加了括号作为 IP 的一部分。 bindIp: 127.0.0.1, 10.8.0.1 # 适用于 centos 7.4, mongo 3.6【参考方案5】:

我使用逗号、无空格和 FQDN 在我的 3.2 版服务上成功添加了第二个 ip

net:
  port: 27017
  bindIp: localhost,dev-2.office.sampleorg.com

【讨论】:

【参考方案6】:

我在 SUSE 12.x 上运行 3.6,但在使用逗号分隔的 IP 列表时遇到了问题。我解决了这个问题 绑定IP:0.0.0.0

【讨论】:

谢谢,我遇到了同样的问题,上面和下面的解决方案都不起作用,但你的 +1 0.0.0.0 将起作用,因为您没有绑定到任何实质上将其绑定到您的公共 IP 并且可能将您的数据库公开给公众的服务器。可以,但不是个好主意。 不这么认为。 0.0.0.0 是不可路由的元地址。在服务器上下文中,0.0.0.0 表示“本地计算机上的所有 IPv4 地址”。 我还是觉得有点hacky。它基本上允许任何可以访问本地服务器的 IP 地址。对于 3.6,最安全的方法是 bindIp: 127.0.0.1, xxx.xxx.xxx.xxxbindIpAll: true 这不是一个好主意,它会暴露你的数据库。【参考方案7】:

在 Mongo 3.* 中,

使用括号,例如

net:
    port: 27017
    bindIp : [127.0.0.1,10.0.0.2,10.0.0.3]

【讨论】:

【参考方案8】:

在我的 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.1bindIp: 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 

【讨论】:

【参考方案9】:

在我的情况下,解决方案是放置逗号分隔的 IP 并且没有任何空格。

bind_ip=192.168.2.29,127.0.0.1
#port = 27017

这种方法奏效了:

2018-10-02T07:49:27.952+0000 I CONTROL  [initandlisten] options:  config: "/etc/mongodb.conf", net:  bindIp: "192.168.2.29,127.0.0.1", unixDomainSocket:  pathPrefix: "/run/mongodb"  , storage:  dbPath: "/var/lib/mongodb", journal:  enabled: true  , systemLog:  destination: "file", logAppend: true, path: "/var/log/mongodb/mongodb.log"   2018-10-02T07:49:27.954+0000 I -    [initandlisten] Detected data files in /var/lib/mongodb created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.

这里是 Mongo 3.6.3。

mongod --version 数据库版本 v3.6.3 git版本:9586e557d54ef70f9ca4b43c26892cd55257e1a5 OpenSSL 版本:OpenSSL 1.1.0g 2017 年 11 月 2 日 分配器:tcmalloc 模块:无 搭建环境: 淀粉:x86_64 目标架构:x86_64

【讨论】:

【参考方案10】:

Ubuntu 16.04 -> MongoDB shell 版本:2.6.10

对我来说,以下作品:

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

注意我有一个; 而不是,

【讨论】:

【参考方案11】:

使用以下版本的 MongoDB: MongoDB shell 版本 v3.6.10

重现问题: 当使用 [127.0.0.1,xxx.xxx.xxx.xxx] 时,我们得到以下错误。 标量选项“net.bindIp”必须是单个值 尝试“mongod --help”以获取更多信息

分析 这是因为,根据 MongoDB 文档:https://docs.mongodb.com/manual/reference/configuration-options/#net.bindIP

net.bindIP 的类型为“string”。

绑定多个IP地址的解决方案

bindIp: "127.0.0.1,xxx.xxx.xxx.xxx"

注意:逗号后面不能有空格

【讨论】:

它适用于 mongo 4.4.8 版本【参考方案12】:

以逗号分隔 IP 地址的 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 地址或系统未知。

【讨论】:

【参考方案13】:

对于那些仍然想知道的人 - 问题不在于语法,而在于您输入的地址

阅读this answer

【讨论】:

【参考方案14】:

亚马逊-linux2 |美分操作系统 | 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' 必须是单个值【参考方案15】:

默认的 /etc/mongod.conf 文件有这个网络接口条目:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

这对应于命令行中的--bind-ip arg 参数。请注意破折号表示法转换为驼峰式。要将在 VM 中运行的数据库公开给主机,最简单的方法是将数据库绑定到所有接口以进行测试。这将涵盖 VM 使用 NAT 接口或桥接接口的情况。命令行参数是--bind_ip_all,它没有参数,它的存在对应于配置文件中的bindIPAll: true参数。因此,配置文件应改为:

# network interfaces
net:
  port: 27017
  bindIpAll: true

请注意 bindIp 参数已删除。

还应该注意,可以在命令行中添加参数来覆盖配置文件中的参数。通常,mongod 使用--config /etc/mongod.conf 参数运行。更改配置文件更容易,而不是寻找作为守护进程运行它的脚本并让systemd 重新加载和使用它。

有关配置文件的 YAML 特性与命令行参数的详细信息,请参阅当前位于 https://docs.mongodb.com/manual/reference/configuration-options/ 的文档

如果您在使用 NAT 的 VM 上运行 mongod,则默认端口 27017 不会暴露给主机。有必要将主机上的端口映射到来宾 VM 中的此端口。这超出了此答案的范围,但稍作研究将提供一种用于您正在使用的 VM 软件(VirtualBox、VMware 等)的方法

【讨论】:

【参考方案16】:

使用 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

【讨论】:

【参考方案17】:

对于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

警告 ips - private_host_ip<public_host_ip> - 是您的 MongoDB 服务器 运行的位置,而不是远程客户端.因此存在添加每个新 ip 的错误假设,其中每个新 ip 代表 远程 客户端 IP 地址(不同于 服务器 IP地址 - LAN 和/或 WAN),它正确。

注意为避免出现问题,最好使用静态 ip,私有通过路由器,第二个通过 ISP。

【讨论】:

【参考方案18】:

在我的情况下,使用 mongoDB 4.4.6 以下解决方案有效 -

net:
  port: 27017
  bindIp: 127.0.0.1;<private_host_ip>

修改完成后,使用以下命令重启 mongoDB -

sudo systemctl restart mongod

要检查 mongoDB 状态,运行 -

sudo systemctl status mongod

【讨论】:

以上是关于如何使用多个 ip 地址设置 mongod.conf bind_ip的主要内容,如果未能解决你的问题,请参考以下文章

一个网卡设置多个IP地址的方法是啥?

一个网卡设置多个IP地址的方法是啥?

如何设置多个不同的IP地址

如何在 Redis 中配置多个可以访问的 IP 地址

如何实现Oracle的监听多个IP地址

需要给AP设置一个IP地址吗?