本教程的早期版本由Melissa Anderson编写。
介绍
MongoDB也称为Mongo,是现代 Web 应用程序中常用的开源文档数据库。默认情况下,它只允许源自安装它的同一服务器上的连接。如果要远程管理 MongoDB 或将其连接到单独的应用程序服务器,则需要对默认配置进行一些更改。
在本教程中,您将配置 MongoDB 安装以安全地允许从受信任的远程计算机进行访问。为此,您将更新防火墙规则以提供对 MongoDB 正在侦听连接的端口的远程计算机访问,然后更新其配置文件以更改其 IP 绑定设置。然后,作为最后一步,您将测试远程计算机是否能够成功连接到数据库。
先决条件
要完成本教程,您需要:
- 运行 Ubuntu 18.04 的服务器。此服务器应具有非 root 管理用户和使用 UFW 配置的防火墙。按照我们针对 Ubuntu 18.04 的初始服务器设置指南进行设置。
- MongoDB 安装在您的服务器上。本教程假设您已安装MongoDB 4.4或更新版本。您可以按照我们关于如何在 Ubuntu 18.04 上安装 MongoDB 的教程安装此版本。
- 用于访问 MongoDB 实例的第二台计算机。为简单起见,本教程假设这台机器是另一台 Ubuntu 18.04 服务器,具有非 root 管理用户和按照我们的 Ubuntu 18.04 初始服务器设置指南配置的 UFW 防火墙。但是,步骤 1 和 2 描述了在数据库服务器上启用远程连接的实际过程,无论远程机器运行的是什么操作系统,它们都将起作用。
最后,虽然不需要完成本教程,但我们强烈建议您通过为数据库创建管理用户帐户并启用身份验证来保护您的 MongoDB 安装。为此,请按照我们关于如何在 Ubuntu 18.04 上保护 MongoDB 的教程进行操作。
步骤 1 — 调整防火墙
假设您遵循了必备的初始服务器设置教程并在您的服务器上启用了 UFW 防火墙,您的 MongoDB 安装将无法从 Internet 访问。如果您打算仅在本地将 MongoDB 与在同一服务器上运行的应用程序一起使用,则这是推荐且安全的设置。但是,如果您希望能够从远程位置连接到 MongoDB 服务器,则必须通过添加新的 UFW 规则来允许传入连接到数据库正在侦听的端口。
首先使用命令检查您的 MongoDB 安装正在侦听哪个端口lsof
。此命令通常返回一个包含系统中每个打开文件的列表,但与该-i
选项结合使用时,它仅列出与网络相关的文件或数据流。
以下命令将生成的输出重定向lsof -i
到grep
搜索名为 的字符串的命令mongo
:
- sudo lsof -i | grep mongo
此示例输出显示mongod
进程正在侦听其默认端口上的连接27017
:
Output. . .
mongod 82221 mongodb 11u IPv4 913411 0t0 TCP localhost:27017 (LISTEN)
. . .
在大多数情况下,只能从某些受信任的位置访问 MongoDB,例如托管应用程序的另一台服务器。配置它的一种方法是在您的 MongoDB 服务器上运行以下命令,这会打开对 MongoDB 的默认端口的访问,同时明确只允许其他受信任服务器的 IP 地址。
运行以下命令,确保更改trusted_server_ip
为您将用于访问 MongoDB 实例的受信任远程机器的 IP 地址:
注意:如果上一个命令的输出显示您安装的 MongoDB 正在侦听非默认端口,请27017
在此命令中使用该端口号代替。
- sudo ufw allow from trusted_server_ip to any port 27017
以后,如果您想从另一台机器访问 MongoDB,请使用新机器的 IP 地址再次运行此命令,而不是trusted_server_ip
.
您可以使用以下命令验证防火墙设置的更改ufw
:
- sudo ufw status
输出将显示27017
现在允许从远程服务器到端口的流量:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW trusted_server_ip
OpenSSH (v6) ALLOW Anywhere (v6)
您可以在UFW Essentials: Common Firewall Rules and Commands 中找到更高级的防火墙设置来限制对服务的访问。
接下来,您将 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 的默认端口的权限,您可以测试远程机器是否能够连接。
注意:如先决条件部分所述,本教程假设您的远程机器是另一台运行 Ubuntu 18.04 的服务器。无论您的远程机器运行什么操作系统,步骤 1 和 2 中概述的启用远程连接的过程都应该可以工作,但是此步骤中描述的测试方法并不适用于所有操作系统。
测试受信任的远程服务器是否能够连接到 MongoDB 实例的一种方法是使用该nc
命令。 nc
,netcat 的缩写,是一个用于与 TCP 或 UDP 建立网络连接的实用程序。在这种情况下进行测试很有用,因为它允许您指定 IP 地址和端口号。
首先,使用 SSH 登录到您信任的服务器:
- ssh sammy@trusted_server_ip
然后运行以下nc
命令,其中包含该-z
选项。这限制nc
为仅扫描目标服务器上的侦听守护程序而不向其发送任何数据。回想一下先决条件安装教程,MongoDB 作为服务守护程序运行,使此选项可用于测试连接。它还包括v
增加命令详细程度的选项,导致 netcat 返回一些否则不会返回的输出。
从受信任的远程服务器运行以下nc
命令,确保替换为安装 MongoDB 的服务器的 IP 地址:mongodb_server_ip
- nc -zv mongodb_server_ip 27017
如果受信任的服务器可以访问 MongoDB 守护进程,其输出将指示连接成功:
OutputConnection to mongodb_server_ip 27017 port [tcp/*] succeeded!
假设您mongo
在远程服务器上安装了兼容版本的shell,此时您可以直接连接到安装在主机服务器上的 MongoDB 实例。
一种连接方式是使用连接字符串 URI,如下所示:
- mongo "mongodb://mongo_server_ip:27017"
注意:如果您遵循了推荐的如何在 Ubuntu 18.04 上保护 MongoDB教程,您将关闭未经身份验证的用户对数据库的访问。在这种情况下,您需要使用指定有效用户名的 URI,如下所示:
- mongo "mongodb://username@mongo_server_ip:27017"
shell 会自动提示你输入用户的密码。
这样,您就已确认您的 MongoDB 服务器可以接受来自受信任服务器的连接。
结论
您现在可以从远程服务器访问您的 MongoDB 安装。此时,您可以从受信任的服务器远程管理您的 Mongo 数据库。或者,您可以将应用程序配置为在受信任的服务器上运行并远程使用数据库。
如果您尚未配置管理用户并启用身份验证,任何有权访问您的远程服务器的人也可以访问您的 MongoDB 安装。如果您还没有这样做,我们强烈建议您按照我们关于如何在 Ubuntu 18.04 上保护 MongoDB 的指南来添加管理用户并进一步锁定。