Skip to content

MongoDB IP白名单

适用场景

  • 生产环境中限制只有应用服务器才能访问MongoDB
  • 跨数据中心部署时限制特定区域的访问
  • 开发测试环境中限制团队成员的IP访问
  • 云环境中限制特定VPC或子网的访问

单节点MongoDB IP白名单配置

配置方法

  1. 修改mongod.conf配置文件
yaml
# mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0  # 绑定到所有网卡,结合IP白名单使用
security:
  authorization: enabled  # 启用认证
  1. 使用防火墙配置IP白名单
  • Linux (iptables)
bash
# 允许特定IP访问MongoDB端口
iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP  # 默认拒绝所有其他IP
  • Linux (firewalld)
bash
# 添加允许访问的IP段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept'
firewall-cmd --reload
  • Windows防火墙

通过Windows防火墙高级设置,创建入站规则,限制只有特定IP可以访问27017端口。

复制集MongoDB IP白名单配置

配置方法

  1. 修改mongod.conf配置文件
yaml
# mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0  # 复制集成员需要互相访问
security:
  authorization: enabled
  keyFile: /path/to/keyfile  # 复制集密钥文件
replication:
  replSetName: rs0
  1. 防火墙配置

对于复制集,需要允许以下IP访问:

  • 所有复制集成员的IP地址
  • 应用服务器IP地址
  • 管理工具IP地址
bash
# 允许复制集成员之间通信
for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do
  iptables -A INPUT -p tcp --dport 27017 -s $ip -j ACCEPT
done

# 允许应用服务器访问
iptables -A INPUT -p tcp --dport 27017 -s 10.0.0.0/16 -j ACCEPT

# 默认拒绝
iptables -A INPUT -p tcp --dport 27017 -j DROP

分片集群MongoDB IP白名单配置

配置方法

  1. 修改各组件的配置文件
  • mongod (分片节点)
yaml
net:
  port: 27018
  bindIp: 0.0.0.0
security:
  authorization: enabled
  keyFile: /path/to/keyfile
replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr
  • mongod (配置节点)
yaml
net:
  port: 27019
  bindIp: 0.0.0.0
security:
  authorization: enabled
  keyFile: /path/to/keyfile
replication:
  replSetName: configRS
sharding:
  clusterRole: configsvr
  • mongos (路由节点)
yaml
net:
  port: 27017
  bindIp: 0.0.0.0
security:
  keyFile: /path/to/keyfile
sharding:
  configDB: configRS/192.168.1.20:27019,192.168.1.21:27019,192.168.1.22:27019
  1. 防火墙配置

对于分片集群,需要允许以下IP访问:

  • 所有集群组件(mongod分片、mongod配置、mongos)的IP
  • 应用服务器IP
  • 管理工具IP
bash
# 允许集群内部通信
for ip in 192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.20 192.168.1.21 192.168.1.22 192.168.1.30; do
  iptables -A INPUT -p tcp -m multiport --dports 27017,27018,27019 -s $ip -j ACCEPT
done

# 允许应用服务器访问mongos
for port in 27017; do
  iptables -A INPUT -p tcp --dport $port -s 10.0.0.0/16 -j ACCEPT
done

# 默认拒绝
iptables -A INPUT -p tcp -m multiport --dports 27017,27018,27019 -j DROP

MongoDB Atlas IP白名单配置

配置方法

  1. 登录MongoDB Atlas控制台
  2. 选择目标集群,点击"Network Access"
  3. 点击"Add IP Address"
  4. 可以选择:
    • "Add Current IP Address":添加当前机器IP
    • "Allow Access From Anywhere":允许所有IP访问(不推荐生产环境)
    • "Add IP Range":添加IP段
  5. 点击"Confirm"

最佳实践

  • 生产环境中只允许特定IP或IP段访问
  • 使用VPC对等连接或专用链路替代公网IP白名单
  • 定期审查和更新IP白名单

云环境IP白名单配置

AWS EC2安全组

  1. 创建或选择安全组
  2. 添加入站规则:
    • 类型:自定义TCP
    • 端口范围:27017
    • 源:特定IP或IP段
  3. 将安全组关联到MongoDB实例

Azure网络安全组

  1. 创建或选择网络安全组
  2. 添加入站安全规则:
    • 源:特定IP或IP段
    • 目标端口范围:27017
    • 协议:TCP
    • 操作:允许
  3. 将网络安全组关联到子网或网络接口

Google Cloud防火墙规则

bash
gcloud compute firewall-rules create mongodb-allow --allow tcp:27017 --source-ranges 10.0.0.0/16 --target-tags mongodb

IP白名单管理最佳实践

  1. 最小权限原则:只允许必要的IP访问MongoDB
  2. 定期审查:每季度或半年审查一次IP白名单,移除不再需要的IP
  3. 自动化管理:使用基础设施即代码工具(Terraform、CloudFormation)管理IP白名单
  4. 变更审批流程:修改IP白名单需要经过审批流程
  5. 监控和告警:监控IP白名单的变更,设置告警
  6. 文档化:记录IP白名单的使用目的和变更历史

常见问题(FAQ)

Q1: IP白名单和认证机制的关系是什么?

A1: IP白名单是网络层的访问控制,认证机制是应用层的访问控制。两者应该结合使用,提供多层次的安全保护。即使IP在白名单中,用户仍然需要提供正确的用户名和密码才能访问MongoDB。

Q2: 复制集环境中,是否需要在防火墙中开放所有节点的IP?

A2: 是的,复制集成员之间需要互相通信,所以需要在防火墙中允许所有复制集成员的IP访问MongoDB端口。同时,还需要允许应用服务器和管理工具的IP访问。

Q3: 如何处理动态IP的情况?

A3: 对于动态IP,可以考虑以下解决方案:

  • 使用VPN连接,将动态IP转换为固定的VPN IP
  • 使用云服务商提供的动态DNS服务
  • 对于MongoDB Atlas,可以使用API自动更新IP白名单
  • 考虑使用零信任网络架构

Q4: IP白名单配置错误会导致什么问题?

A4: IP白名单配置错误可能导致:

  • 应用服务器无法连接到MongoDB
  • 复制集成员之间无法通信,导致复制集故障
  • 管理工具无法访问MongoDB,影响运维操作
  • 集群组件之间无法通信,导致分片集群故障

Q5: 如何验证IP白名单是否生效?

A5: 可以通过以下方法验证IP白名单:

  • 从不在白名单中的IP尝试连接MongoDB,应该连接失败
  • 从在白名单中的IP尝试连接MongoDB,应该连接成功
  • 检查防火墙日志,确认被拒绝的连接尝试
  • 使用telnet或nc命令测试端口可达性

Q6: 生产环境中是否应该使用"允许所有IP访问"的配置?

A6: 不推荐。生产环境中应该严格限制IP访问,只允许必要的IP或IP段访问MongoDB。"允许所有IP访问"会大大增加安全风险,容易受到暴力破解和恶意攻击。

Q7: 如何在不中断服务的情况下更新IP白名单?

A7: 可以按照以下步骤更新IP白名单:

  1. 先添加新的IP到白名单
  2. 测试新IP可以正常访问
  3. 移除不再需要的旧IP
  4. 验证服务仍然正常运行

这样可以避免因更新IP白名单导致服务中断。