配置Linuxiptables
防火墙,用于自管理部署
在当代Linux系统上,iptables
程序提供了管理Linux内核的netfilter
或网络数据包过滤功能的方法。这些防火墙规则允许管理员控制哪些主机可以连接到系统,并通过限制可以连接到系统的主机来降低风险暴露。
本文档概述了Linux上iptables
防火墙的基本防火墙配置。将这些方法作为您更大规模网络组织的一个起点。有关MongoDB的安全实践和风险管理详情,请参阅安全.
概述
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
第一条规则允许来自<ip-address>
的端口27017
的所有传入流量,这允许应用服务器连接到mongod
实例。第二条规则允许从mongod
到应用服务器的流出流量。
注意
可选
如果您只有一个应用服务器,您可以将<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
实例。
使用与副本集成员的 mongod
实例相同的 iptables
命令,允许这些实例的流量进入和流出。以 到和从 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
规则,请使用系统外壳中的以下操作。
iptables -L
清除所有 iptables
规则
如果您在输入 iptables
规则时出错或只需恢复到默认规则集,您可以在系统外壳中使用以下操作来清除所有规则
iptables -F
如果您已经使您的 iptables
规则持久化,您需要在使所有 iptables
规则持久化部分中重复相应的程序。