本教程的早期版本由 Melissa Anderson 编写。
介绍
MongoDB,也称为 Mongo,是一个开源文档数据库,用于许多现代 Web 应用程序。 默认情况下,它只允许来自安装它的同一服务器上的连接。 如果您想远程管理 MongoDB 或将其连接到单独的应用程序服务器,您需要对默认配置进行一些更改。
在本教程中,您将配置 MongoDB 安装以安全地允许从受信任的远程计算机进行访问。 为此,您将更新防火墙规则以提供远程计算机访问 MongoDB 正在侦听连接的端口,然后更新 Mongo 的配置文件以更改其 IP 绑定设置。 然后,作为最后一步,您将测试您的远程计算机是否能够成功连接到您的数据库。
先决条件
要完成本教程,您需要:
- 运行 CentOS 8 的服务器。 此服务器应具有非 root 管理用户和配置为
firewalld
的防火墙。 按照我们的 CentOS 8 初始服务器设置指南进行设置。 - MongoDB 安装在您的服务器上。 本教程假设您安装了 MongoDB 4.4 或更新版本。 您可以按照我们关于 如何在 CentOS 8 上安装 MongoDB 的教程安装此版本。
- 您将从中访问 MongoDB 实例的第二台计算机。 为简单起见,本教程假设这台机器是另一台 CentOS 8 服务器。 就像您的 MongoDB 服务器一样,这台机器应该有一个非 root 管理用户和一个配置了
firewalld
的防火墙,如我们的 CentOS 8 初始服务器设置指南中所述。 但是,描述在数据库服务器上启用远程连接的实际过程的步骤 1 和 2 将起作用,而不管远程计算机运行的是什么操作系统。
最后,虽然不需要完成本教程,但我们 强烈 建议您通过为数据库创建管理用户帐户并启用身份验证来保护 MongoDB 安装。 为此,请按照我们关于 如何在 CentOS 8 上保护 MongoDB 的教程进行操作。
第 1 步 — 调整防火墙
假设您遵循了先决条件初始服务器设置教程并 在您的服务器 上设置了 firewalld,您的 MongoDB 安装将无法从 Internet 访问。 如果您打算仅在本地将 MongoDB 与在同一服务器上运行的应用程序一起使用,则这是推荐且安全的设置。 但是,如果您希望能够从远程位置连接到 MongoDB 服务器,则必须通过添加新的防火墙规则来允许到数据库正在侦听的端口的传入连接。
首先使用 netstat
命令检查 MongoDB 安装正在侦听的端口。 netstat
是一个命令行实用程序,可显示有关活动 TCP 网络连接的信息。
以下命令会将 sudo netstat -plunt
生成的输出重定向到 grep
命令,该命令搜索包含字符串 mongo
的任何行:
sudo netstat -plunt | grep mongo
此示例输出表明 MongoDB 在其默认端口 27017
上侦听到 127.0.0.1
的连接,这是一个表示 localhost 的特殊环回地址:
Outputtcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 15918/mongod
在大多数情况下,只能从某些受信任的位置访问 MongoDB,例如托管应用程序的另一台服务器。 使用 firewalld
进行配置的一种方法是在您的 MongoDB 服务器上运行以下 firewall-cmd
命令,该命令在 MongoDB 的默认端口上打开访问权限,同时明确只允许另一个受信任服务器的 IP 地址。
运行以下命令,确保将 trusted_server_ip
更改为您将用于访问 MongoDB 实例的受信任远程计算机的 IP 地址:
注意:如果上一个命令的输出表明您安装的 MongoDB 正在侦听非默认端口,请在此命令中使用该端口号代替 27017
。
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="trusted_server_ip" port protocol="tcp" port="27017" accept'
此命令将 丰富的规则 永久添加到防火墙的 public
区域。 丰富的规则是 firewalld
中的功能,可让您通过使用多个选项更精细地控制谁可以访问您的服务器。 此命令中提供的规则指定仅应允许 trusted_server_ip
地址通过墙进行连接。 它还指定它只能使用 TCP 协议连接到端口 27017
。
如果规则添加成功,该命令将在输出中返回 success
:
Outputsuccess
重新加载防火墙以使新规则生效:
sudo firewall-cmd --reload
将来,如果您想从另一台机器访问 MongoDB,请使用新机器的 IP 地址代替 trusted_server_ip
再次运行此命令。
您可以通过使用 --list-all
选项运行 firewall-cmd
来验证防火墙设置的更改:
sudo firewall-cmd --list-all
输出将包括新的丰富规则,允许从远程服务器到端口 27017
的流量:
Outputpublic (active) . . . rich rules: rule family="ipv4" source address="157.230.58.94" port port="27017" protocol="tcp" accept
您可以在 如何在 CentOS 8 上使用 firewalld 设置防火墙中了解有关 firewalld
的更多信息。
接下来,您将 MongoDB 绑定到服务器的公共 IP 地址,以便您可以从远程计算机访问它。
第 2 步 — 配置公共 bindIP
此时,即使端口是开放的,MongoDB 当前也绑定到本地环回网络接口 127.0.0.1
。 这意味着 MongoDB 只能接受来自安装它的服务器上的连接。
要允许远程连接,您必须编辑 MongoDB 配置文件 — /etc/mongod.conf
— 以另外将 MongoDB 绑定到服务器的可公开路由的 IP 地址。 这样,您的 MongoDB 安装将能够侦听从远程机器到您的 MongoDB 服务器的连接。
在您首选的文本编辑器中打开 MongoDB 配置文件。 以下示例使用 nano
:
sudo nano /etc/mongod.conf
找到 network interfaces
部分,然后找到 bindIp
值:
/etc/mongod.conf
. . . # network interfaces net: port: 27017 bindIp: 127.0.0.1 . . .
在这一行添加一个逗号,后跟您的 MongoDB 服务器的公共 IP 地址:
/etc/mongod.conf
. . . # network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb_server_ip . . .
保存并关闭文件。 如果您使用 nano
,请按 CTRL + X
、Y
,然后按 ENTER
。
然后,重新启动 MongoDB 以使此更改生效:
sudo systemctl restart mongod
之后,您的 MongoDB 安装将能够接受来自您允许访问端口 27017
的任何机器的远程连接。 作为最后一步,您可以测试您在步骤 1 中允许通过防火墙的可信远程服务器是否可以访问您服务器上运行的 MongoDB 实例。
第 3 步 — 测试远程连接
现在您已将 MongoDB 安装配置为侦听源自其可公开路由的 IP 地址的连接,并通过服务器的防火墙授予远程计算机访问 Mongo 的默认端口的权限,您可以测试远程计算机是否能够连接。
注意:正如先决条件部分所述,本教程假设您的远程计算机是另一台运行 CentOS 8 的服务器。 无论您的远程计算机运行什么操作系统,步骤 1 和 2 中概述的启用远程连接的过程都应该有效,但此步骤中描述的测试方法不能在操作系统中通用。
首先,使用 SSH 登录到您信任的服务器:
ssh sammy@trusted_server_ip
测试受信任的远程服务器是否能够连接到 MongoDB 实例的一种方法是使用 nc
命令。 nc
是 netcat 的缩写,是一个用于与 TCP 或 UDP 建立网络连接的实用程序。 在这种情况下进行测试很有用,因为它允许您同时指定 IP 地址和端口号。
如果您还没有,您可能需要安装 nc
。 来自官方 CentOS 存储库的版本实际上是一个名为 ncat 的实现,它是由 Nmap 项目编写的,作为 netcat 的更新。
通过键入以下命令安装 ncat:
sudo dnf install nc
按 y
,然后按 ENTER
提示确认您要安装该软件包。
然后运行以下 nc
命令,其中包括 -z
选项。 这将 nc
限制为仅扫描目标服务器上的侦听守护程序而不向其发送任何数据。 回想一下 先决条件安装教程 中,MongoDB 作为服务守护进程运行,这使得该选项对于测试连接性很有用。 它还包括 v
选项,它增加了命令的详细程度,导致 ncat 返回一些否则它不会返回的输出。
从您信任的远程服务器 运行以下 nc
命令 ,确保将 mongodb_server_ip
替换为安装 MongoDB 的服务器的 IP 地址:
nc -zv mongodb_server_ip 27017
如果受信任的服务器可以访问 MongoDB 守护程序,它的输出将表明它建立了连接:
OutputNcat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to mongodb_server_ip:27017. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.
假设您在远程服务器上安装了兼容版本的 mongo
shell,此时您可以直接连接到主机服务器上安装的 MongoDB 实例。
一种连接方式是使用 连接字符串 URI,如下所示:
mongo "mongodb://mongo_server_ip:27017"
注意:如果您遵循推荐的 如何在 CentOS 8 上保护 MongoDB 教程,您将关闭未经身份验证的用户访问您的数据库。 在这种情况下,您需要使用指定有效用户名的 URI,如下所示:
mongo "mongodb://username@mongo_server_ip:27017"
shell 会自动提示您输入用户密码。
这样,您已经确认您的 MongoDB 服务器可以接受来自受信任服务器的连接。
结论
您现在可以从远程服务器访问您的 MongoDB 安装。 此时,您可以从受信任的服务器远程管理您的 Mongo 数据库。 或者,您可以将应用程序配置为在受信任的服务器上运行并远程使用数据库。
如果您尚未配置管理用户并启用身份验证,则有权访问您的远程服务器的任何人也可以访问您的 MongoDB 安装。 如果您还没有这样做,我们 强烈 建议您按照我们关于 如何在 CentOS 8 上保护 MongoDB 的指南添加管理用户并进一步锁定。