为 MongoDB 配置 Linux iptables 防火墙
在本页面
在现代 Linux 系统上,iptables
程序提供了用于 ManagementLinux 内核的netfilter
或网络数据包过滤功能的方法。这些防火墙规则使 Management 员可以控制哪些主机可以连接到系统,并通过限制可以连接到系统的主机来限制风险。
本文档概述了 Linux 上iptables
防火墙的基本防火墙配置。使用这些方法作为大型网络组织的起点。有关 MongoDB 的安全性实践和风险 Management 的详细概述,请参阅Security。
Overview
iptables
配置中的规则分为多个链,描述了过滤和处理特定流量流的过程。链具有 Sequences,并且数据包必须通过链中的较早规则才能到达较后规则。本文档仅涉及以下两个链:
-
INPUT
- 控制所有传入流量。
-
OUTPUT
- 控制所有传出流量。
给定所有 MongoDB 进程的default ports,您必须配置网络规则,以允许应用程序与适当的mongod和mongos实例之间仅仅进行必需的通信。
请注意,默认情况下,默认情况下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个实例。
创建类似于以下内容的规则,并将<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 规则永久存在部分中重复相应的过程。