为自管理部署配置Linuxiptables
防火墙
在现代 Linux 系统上,iptables
程序提供了管理 Linux 内核的 netfilter
或网络数据包筛选功能的方法。利用这些防火墙规则,管理员将能够控制哪些主机可以连接到系统,并通过限制可以连接到系统的主机来限制风险暴露。
本文档概述了Linux上iptables
防火墙的基本防火墙配置。 使用这些方法作为大型网络组织的点。 有关MongoDB安全实践和风险管理的详细概述,请参阅安全性。
Overview
iptables
配置的规则分为若干链,描述了筛选和处理特定流量流的进程。链具有顺序,数据包必须通过链中较早的规则才能到达较晚的规则。本文档仅涉及以下两个链:
INPUT
- 控制所有传入流量。
OUTPUT
- 控制所有传出流量。
考虑到所有 MongoDB 进程的默认端口,您必须配置网络规则,以便仅允许应用程序与相应的 mongod
和 mongos
实例之间进行必要的通信。
请注意,默认情况下, iptables
的默认策略是允许所有连接和流量,除非明确禁用。 本文档中概述的配置更改将创建规则,明确允许来自特定地址和特定端口的流量,并使用默认策略丢弃所有未明确允许的流量。 当您正确配置iptables
规则以仅允许您想要允许的流量后,您可以将默认策略更改为DROP
。
模式
本部分包含许多用于配置 iptables
以与 MongoDB 部署结合使用的模式和示例。如果使用 port
配置设置配置了不同的端口,则需要相应地修改规则。
进出mongod
实例的流量
此模式适用于作为独立实例或副本集的一部分运行的所有 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-address>
替换为 IP 地址本身,例如: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
实例为分片集群提供查询路由。客户端可连接到 mongos
实例,从客户端的角度来看,这些实例的行为与 mongod
实例类似。反过来,mongos
可连接到作为分片集群组成部分的所有 mongod
实例。
使用相同的 iptables
命令允许流量进出这些实例,就像副本集节点的 mongod
实例一样。以进出 mongod
实例的流量部分中概述的配置为例。
进出 MongoDB 配置服务器的流量
配置服务器托管为分片集群存储元数据的配置数据库。配置服务器侦听端口 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
进出 MongoDB 分片服务器的流量
分片服务器默认使用端口号 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] | 集群中的所有分片都需要能够与所有其他分片通信,以促进数据段和均衡操作。 |
为监控系统提供访问权限
mongostat
诊断工具在指定 --discover
运行时,需要能够访问集群的所有组件,包括配置服务器、分片服务器和 mongos
实例。
将默认策略更改为 DROP
iptables
链的默认策略是允许所有流量。完成所有 iptables
配置更改后,必须 将默认策略更改为 DROP
,以便上述未显式允许的所有流量都不会到达 MongoDB 部署的组件。发出以下命令以更改此策略:
iptables -P INPUT DROP iptables -P OUTPUT DROP
管理和维护iptables
配置
本节包含管理和使用 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
规则
如果在输入 iptables
规则时出现配置错误,或者只是需要恢复到默认规则集,可以在系统 Shell 中使用以下操作清除所有规则:
iptables -F
如果您已经使 iptables
规则持久化,则需要重复执行使所有 iptables
规则持久化部分中的相应步骤。