如何使用多个 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.xxx
和 bindIpAll: 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.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
【讨论】:
【参考方案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
,对于Windows和Linux可以分别使用ipconfig
或ip 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的主要内容,如果未能解决你的问题,请参考以下文章