在现代 Linux 系统上,iptables 程序提供了管理 Linux 内核的 netfilter 或网络数据包筛选功能的方法。利用这些防火墙规则,管理员将能够控制哪些主机可以连接到系统,并通过限制可以连接到系统的主机来限制风险暴露。
本文档概述了Linux上iptables防火墙的基本防火墙配置。 使用这些方法作为大型网络组织的点。 有关MongoDB安全实践和风险管理的详细概述,请参阅安全性。
Overview
iptables 配置的规则分为若干链,描述了筛选和处理特定流量流的进程。链具有顺序,数据包必须通过链中较早的规则才能到达较晚的规则。本文档仅涉及以下两个链:
INPUT- 控制所有传入流量。
OUTPUT- 控制所有传出流量。
考虑到所有 MongoDB 进程的默认端口,您必须配置网络规则,以便仅允许应用程序与相应的 mongod 和 mongos 实例之间进行必要的通信。
请注意,默认情况下, iptables的默认策略是允许所有连接和流量,除非明确禁用。 本文档中概述的配置更改将创建规则,明确允许来自特定地址和特定端口的流量,并使用默认策略丢弃所有未明确允许的流量。 当您正确配置iptables规则以仅允许您想要允许的流量后,您可以将默认策略更改为DROP 。
模式
本部分包含许多用于配置 iptables 以与 MongoDB 部署结合使用的模式和示例。如果使用 port 配置设置配置了不同的端口,则需要相应地修改规则。
Traffic to and from mongod Instances
此模式适用于作为独立实例或副本集的一部分运行的所有 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
Traffic to and from mongos Instances
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
Manage and Maintain iptables Configuration
本节包含管理和使用 iptables 的一些基本操作。有多种前端工具可以自动执行 iptables 配置的某些方面,但所有 iptables 前端的核心都提供相同的基本功能:
Make all iptables Rules Persistent
默认情况下,所有 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 文件中。
List all iptables Rules
若要列出当前应用的所有 iptables 规则,请在系统 Shell 中执行以下操作。
iptables -L
Flush all iptables Rules
如果在输入 iptables 规则时出现配置错误,或者只是需要恢复到默认规则集,可以在系统 Shell 中使用以下操作清除所有规则:
iptables -F
如果您已经使 iptables 规则持久化,则需要重复执行使所有 iptables 规则持久化部分中的相应步骤。