为 MongoDB 配置 Linux iptables 防火墙

在本页面

在现代 Linux 系统上,iptables程序提供了用于 ManagementLinux 内核的netfilter或网络数据包过滤功能的方法。这些防火墙规则使 Management 员可以控制哪些主机可以连接到系统,并通过限制可以连接到系统的主机来限制风险。

本文档概述了 Linux 上iptables防火墙的基本防火墙配置。使用这些方法作为大型网络组织的起点。有关 MongoDB 的安全性实践和风险 Management 的详细概述,请参阅Security

Overview

iptables配置中的规则分为多个链,描述了过滤和处理特定流量流的过程。链具有 Sequences,并且数据包必须通过链中的较早规则才能到达较后规则。本文档仅涉及以下两个链:

  • INPUT

    • 控制所有传入流量。
  • OUTPUT

    • 控制所有传出流量。

给定所有 MongoDB 进程的default ports,您必须配置网络规则,以允许应用程序与适当的mongodmongos实例之间仅进行必需的通信。

请注意,默认情况下,默认情况下iptables的策略是允许所有连接和流量,除非明确禁用。本文档中概述的配置更改将使用默认策略创建规则,该规则明确允许来自特定地址和特定端口的流量,该策略将丢弃所有未明确允许的流量。正确配置iptables规则以仅允许您要允许的流量后,您可以将默认策略更改为 DROP

Patterns

本部分包含一些配置iptables以供 MongoDB 部署使用的模式和示例。如果使用port配置设置配置了其他端口,则需要相应地修改规则。

往返于 Mongod 实例的流量

此模式适用于作为独立实例或replica set的一部分运行的所有mongod实例。

此模式的目标是明确允许流量从应用程序服务器到达mongod实例。在以下示例中,将<ip-address>替换为应用程序服务器的 IP 地址:

iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT

第一条规则允许端口27017上来自<ip-address>的所有传入流量,这允许应用程序服务器连接到mongod实例。第二条规则允许来自mongod的传出流量到达应用程序服务器。

Optional

如果只有一台应用程序服务器,则可以用任一 IP 地址本身替换<ip-address>,例如:198.51.100.55。您也可以使用 CIDR 表示法198.51.100.55/32来表示。如果要允许更大范围的可能的 IP 地址,可以使用<ip-address>的以下规范之一来允许/24的通信,如下所示:

10.10.10.10/24
10.10.10.10/255.255.255.0

往返 mongos 实例的流量

mongos实例为sharded clusters提供查询路由。Client 端连接到mongos实例,从 Client 端的角度来看,它们充当mongod实例。 mongos依次连接到作为分片群集组件的所有mongod实例。

使用相同的iptables命令来允许与这些实例之间的通信,就像从作为副本集成员的mongod实例进行通信一样。以往返 Mongod 实例的流量部分中概述的配置为例。

往返 MongoDB Config 服务器的流量

配置服务器托管的config database存储分片群集的元数据。配置服务器侦听端口27019上的连接。结果,将以下iptables规则添加到配置服务器,以允许端口27019上的传入和传出连接,以连接到其他配置服务器。

iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27019 -m state --state ESTABLISHED -j ACCEPT

<ip-address>替换为提供配置服务器的所有mongod的地址或地址空间。

此外,配置服务器需要允许来自群集中所有mongos实例和群集中所有mongod实例的传入连接。添加类似于以下内容的规则:

iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT

<ip-address>替换为mongos实例和分片mongod实例的地址。

往返 MongoDB 分片服务器的流量

Shard servers默认为端口号27018。您必须配置以下iptables规则以允许往返每个分片的流量:

iptables -A INPUT -s <ip-address> -p tcp --destination-port 27018 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT

<ip-address>规范替换为所有mongod的 IP 地址。这使您可以允许所有分片(包括组成副本集成员)之间的传入和传出流量:

  • 分片副本集中的所有mongod个实例。

  • 其他分片中的所有mongod个实例。 [1]

此外,分片需要能够构建与以下各项的传出连接:

  • 配置服务器中的所有mongod个实例。

创建类似于以下内容的规则,并将<ip-address>替换为配置服务器和mongos实例的地址:

iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT
[1]集群中的所有分片都需要能够与所有其他分片进行通信,以促进chunk和平衡操作。

为监控系统提供访问权限

mongostat诊断工具与--discover一起运行时,需要能够访问群集的所有组件,包括配置服务器,分片服务器和mongos实例。

在版本 3.6 中进行了更改:MongoDB 3.6 删除了 MongoDB 弃用的 HTTP 接口和 REST API。

将默认策略更改为 DROP

iptables链的默认策略是允许所有流量。完成所有iptables配置更改后,您必须*将默认策略更改为DROP,以便上述未明确允许的所有流量都无法到达 MongoDB 部署的组件。发出以下命令来更改此策略:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

Management 和维护 iptables 配置

本节包含一些用于 Management 和使用iptables的基本操作。有多种前端工具可以自动完成iptables配置的某些方面,但是在核心处,所有iptables前端都提供相同的基本功能:

永久保留所有 iptables 规则

默认情况下,所有iptables条规则仅存储在内存中。系统重新启动时,防火墙规则将恢复为默认值。测试规则集并确保其有效控制流量后,可以使用以下操作来使规则集持久化。

在 Red Hat Enterprise Linux,Fedora Linux 和相关发行版上,您可以发出以下命令:

service iptables save

在 Debian,Ubuntu 和相关发行版上,可以使用以下命令将iptables规则转储到/etc/iptables.conf文件:

iptables-save > /etc/iptables.conf

执行以下操作,恢复网络规则。

iptables-restore < /etc/iptables.conf

将此命令放置在您的rc.local文件中,或通过其他类似操作放置在/etc/network/if-up.d/iptables文件中。

列出所有 iptables 规则

要列出所有当前应用的iptables规则,请在系统 Shell 上使用以下操作。

iptables -L

刷新所有 iptables 规则

如果在 Importingiptables规则时犯了配置错误,或者仅需要恢复为默认规则集,则可以在系统 Shell 上使用以下操作来刷新所有规则:

iptables -F

如果您已经使iptables规则保持不变,则需要在使所有 iptables 规则永久存在部分中重复相应的过程。