本教程的早期版本由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 服务器,则必须通过添加新的防火墙规则来允许传入连接到数据库正在侦听的端口。
首先使用命令检查您的 MongoDB 安装正在侦听哪个端口netstat
。 netstat
是一个命令行实用程序,用于显示有关活动TCP网络连接的信息。
以下命令将生成的输出重定向sudo netstat -plunt
到grep
搜索包含字符串的任何行的命令mongo
:
- sudo netstat -plunt | grep mongo
此示例输出表明 MongoDB 正在侦听与 的连接127.0.0.1
,这是一个表示localhost的特殊环回地址,在其默认端口上27017
:
Outputtcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 15918/mongod
在大多数情况下,只能从某些受信任的位置访问 MongoDB,例如托管应用程序的另一台服务器。配置它的一种方法firewalld
是firewall-cmd
在您的 MongoDB 服务器上运行以下命令,这会打开对 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
.
您可以通过运行firewall-cmd
以下--list-all
选项来验证防火墙设置的更改:
- 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
您可以firewalld
在如何在 CentOS 8 上使用 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
值:
. . .
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
. . .
在此行中附加一个逗号,后跟您的 MongoDB 服务器的公共 IP 地址:
. . .
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,mongodb_server_ip
. . .
保存并关闭文件。如果您使用过nano
,请按CTRL + X
, Y
, 然后ENTER
。
然后,重新启动 MongoDB 以使此更改生效:
- sudo systemctl restart mongod
之后,您的 MongoDB 安装将能够接受来自您允许访问 port 的任何机器的远程连接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 的服务器的 IP 地址:mongodb_server_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"
注意:如果您遵循了推荐的How To Secure MongoDB on CentOS 8教程,您将禁止未经身份验证的用户访问您的数据库。在这种情况下,您需要使用指定有效用户名的 URI,如下所示:
- mongo "mongodb://username@mongo_server_ip:27017"
shell 会自动提示你输入用户的密码。
这样,您就已确认您的 MongoDB 服务器可以接受来自受信任服务器的连接。
结论
您现在可以从远程服务器访问您的 MongoDB 安装。此时,您可以从受信任的服务器远程管理您的 Mongo 数据库。或者,您可以将应用程序配置为在受信任的服务器上运行并远程使用数据库。
如果您尚未配置管理用户并启用身份验证,任何有权访问您的远程服务器的人也可以访问您的 MongoDB 安装。如果您还没有这样做,我们强烈建议您按照我们关于如何在 CentOS 8 上保护 MongoDB 的指南来添加管理用户并进一步锁定。