2026年CentOS MongoDB防火墙配置完全指南:从入门到生产级安全(2026)

一、为什么需要配置MongoDB防火墙

1.1 MongoDB默认安装的安全隐患

MongoDB默认安装后,存在以下安全风险:

风险项 说明 严重程度
无密码认证 可直接连接操作 ⭐⭐⭐⭐⭐
监听所有IP 0.0.0.0,可被远程访问 ⭐⭐⭐⭐
无传输加密 明文通信,可被窃听 ⭐⭐⭐⭐
默认端口 27017,易被扫描 ⭐⭐⭐

1.2 防火墙配置的核心目标

正确配置防火墙可以实现:

  • 限制访问来源:只允许特定IP访问MongoDB
  • 防止端口扫描:隐藏MongoDB端口
  • 减少攻击面:禁止不必要的入站连接
  • 满足合规要求:符合数据安全规范

二、CentOS防火墙基础(firewalld)

2.1 firewalld基本操作

CentOS 7+默认使用firewalld作为防火墙管理工具:

# 查看防火墙状态
sudo firewall-cmd --state

# 查看当前活动区域
sudo firewall-cmd --get-active-zones

# 查看当前规则
sudo firewall-cmd --list-all

# 重新加载防火墙规则
sudo firewall-cmd --reload

2.2 防火墙区域(zone)概念

firewalld有不同区域,对应不同信任级别:

区域 说明 适用场景
drop 丢弃所有入站,只出不允许 高安全服务器
block 拒绝入站并通知 隔离环境
public 允许部分入站 公网服务器
dmz 允许部分入站 非军事区
trusted 允许所有连接 内网环境

默认区域通常是public

三、MongoDB防火墙配置实战

3.1 基础配置:限制MongoDB端口访问

场景:MongoDB部署在192.168.1.100,只允许192.168.1.0/24网段访问。

# 1. 添加MongoDB服务(如果不存在)
sudo firewall-cmd --permanent --new-service=mongodb
sudo firewall-cmd --permanent --service=mongodb --add-port=27017/tcp

# 2. 只允许特定IP段访问MongoDB端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept'

# 3. 拒绝其他IP访问MongoDB端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="27017" drop'

# 4. 重新加载防火墙
sudo firewall-cmd --reload

# 5. 验证规则
sudo firewall-cmd --list-all

3.2 进阶配置:基于服务的防火墙规则

# 创建自定义服务
sudo firewall-cmd --permanent --new-service=mongodb-cluster
sudo firewall-cmd --permanent --service=mongodb-cluster --set-description="MongoDB Cluster"
sudo firewall-cmd --permanent --service=mongodb-cluster --add-port=27017/tcp
sudo firewall-cmd --permanent --service=mongodb-cluster --add-port=27018/tcp
sudo firewall-cmd --permanent --service=mongodb-cluster --add-port=27019/tcp

# 允许应用服务器网段访问
sudo firewall-cmd --permanent --add-source=192.168.2.0/24 --zone=public
sudo firewall-cmd --permanent --zone=public --add-service=mongodb-cluster

# 重新加载
sudo firewall-cmd --reload

3.3 生产环境推荐配置

# 生产环境完整配置脚本

# 1. 设置默认区域为public
sudo firewall-cmd --set-default-zone=public

# 2. 只允许应用服务器访问MongoDB
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" service name="mongodb" accept'

# 3. 允许监控服务器访问(只读端口)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.2.10" port protocol="tcp" port="27017" accept'

# 4. 拒绝其他所有访问MongoDB端口的请求
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="27017" drop'

# 5. 允许SSH(管理用途)
sudo firewall-cmd --permanent --add-service=ssh

# 6. 重新加载
sudo firewall-cmd --reload

# 7. 验证
sudo firewall-cmd --list-all --zone=public

四、MongoDB绑定IP配置(必须配合)

防火墙规则需要配合MongoDB的bindIp配置才能完全生效:

4.1 修改MongoDB配置文件

# 编辑MongoDB配置文件
sudo nano /etc/mongod.conf

# 修改net部分
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.100  # 只绑定内网IP,不要设为0.0.0.0

# 重启MongoDB
sudo systemctl restart mongod

4.2 启用认证(必须)

# 1. 连接MongoDB
mongosh

# 2. 创建管理员用户
use admin
db.createUser({
  user: "admin",
  pwd: "StrongPassword123!",
  roles: [ { role: "root", db: "admin" } ]
})

# 3. 修改配置文件启用认证
sudo nano /etc/mongod.conf

# 添加:
security:
  authorization: enabled

# 4. 重启MongoDB
sudo systemctl restart mongod

# 5. 使用认证连接
mongosh -u admin -p StrongPassword123! --authenticationDatabase admin

五、高级防火墙策略

5.1 使用iptables(兼容旧系统)

CentOS 6或需要更精细控制时,可以使用iptables:

# 清除现有规则
sudo iptables -F
sudo iptables -X

# 设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立和相关的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 只允许应用服务器访问MongoDB
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 27017 -j ACCEPT

# 拒绝其他访问MongoDB
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP

# 保存规则
sudo iptables-save | sudo tee /etc/sysconfig/iptables

5.2 使用rich-rule实现复杂策略

# 限制访问频率(防DDoS)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="27017" limit value="10/s" accept'

# 记录被拒绝的连接
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="27017" log prefix="mongodb-denied: " level="warning" drop'

# 允许特定MAC地址
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port protocol="tcp" port="27017" accept'

# 时间段控制(仅工作时间允许)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept' --timeout=28800

5.3 MongoDB副本集防火墙配置

# 副本集成员之间需要互相访问
# 假设副本集有3个节点:192.168.1.100, 192.168.1.101, 192.168.1.102

# 在每个节点上执行:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.101" port protocol="tcp" port="27017" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.102" port protocol="tcp" port="27017" accept'

# 允许应用服务器访问所有副本集节点
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="27017" accept'

# 重新加载
sudo firewall-cmd --reload

六、验证与测试

6.1 从允许的来源测试

# 在允许的服务器上测试连接
mongosh --host 192.168.1.100 --port 27017 -u admin -p

# 或使用telnet测试端口
telnet 192.168.1.100 27017

6.2 从不允许的来源测试

# 在不允许的服务器上测试(应该被拒绝)
telnet 192.168.1.100 27017
# 预期结果:连接超时或被拒绝

# 使用nmap扫描
nmap -p 27017 192.168.1.100
# 预期结果:filtered或closed

6.3 查看防火墙日志

# 查看防火墙日志
sudo tail -f /var/log/firewalld

# 查看被拒绝的连接
sudo dmesg | grep -i "firewall"

七、常见问题与解决方案

Q1:配置后MongoDB无法连接?

排查步骤

# 1. 检查MongoDB是否运行
sudo systemctl status mongod

# 2. 检查MongoDB监听地址
sudo ss -tulnp | grep mongod

# 3. 检查防火墙规则
sudo firewall-cmd --list-all

# 4. 临时关闭防火墙测试
sudo systemctl stop firewalld
# 如果能连接,说明是防火墙规则问题

# 5. 检查SELinux
sudo getenforce
# 如果是Enforcing,尝试设置为Permissive
sudo setenforce 0

Q2:如何允许动态IP访问?

方案1:使用VPN

# 管理员通过VPN连接后,使用VPN分配的IP访问
# 在防火墙中只允许VPN网段
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.8.0.0/24" service name="mongodb" accept'

方案2:使用端口转发+VPN

Q3:云服务器如何配置安全组?

AWS/阿里云/腾讯云等需要在控制台配置安全组:

类型 协议 端口 来源 说明
自定义TCP TCP 27017 192.168.1.0/24 允许特定IP段
SSH TCP 22 0.0.0.0/0 管理用途
自定义TCP TCP 27017 0.0.0.0/0 ❌ 不要这样配置

Q4:如何配置MongoDB集群的防火墙?

集群环境需要开放更多端口:

端口 说明 需要开放给
27017 MongoDB主端口 应用服务器、副本集成员
27018 Shard Server 集群成员
27019 Config Server 集群成员
28017 Web管理界面 管理员(建议禁用)

八、安全最佳实践

8.1 最小权限原则

## MongoDB防火墙安全清单

✅ 只开放必要端口
✅ 只允许必要IP访问
✅ 启用MongoDB认证
✅ 修改默认端口(可选)
✅ 启用TLS/SSL加密
✅ 定期审查防火墙规则
✅ 启用防火墙日志
✅ 配置入侵检测系统

8.2 监控与告警

# 1. 安装fail2ban防止暴力破解
sudo yum install fail2ban -y

# 2. 配置fail2ban监控MongoDB日志
sudo nano /etc/fail2ban/jail.local

[mongodb]
enabled = true
port = 27017
filter = mongodb
logpath = /var/log/mongodb/mongod.log
maxretry = 5
bantime = 3600

# 3. 启动fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

8.3 定期安全审计

# 创建安全审计脚本
sudo nano /opt/mongodb_security_audit.sh

#!/bin/bash
echo "=== MongoDB Security Audit ==="
echo "1. Checking MongoDB status..."
sudo systemctl status mongod | grep Active

echo "2. Checking MongoDB listening address..."
sudo ss -tulnp | grep mongod

echo "3. Checking firewall rules..."
sudo firewall-cmd --list-all | grep 27017

echo "4. Checking MongoDB authentication..."
grep "authorization" /etc/mongod.conf

echo "5. Checking for default admin user..."
# 需要认证后执行
# mongosh -u admin -p -e "db.getUser('admin')"

echo "=== Audit Complete ==="

# 设置定时执行
sudo chmod +x /opt/mongodb_security_audit.sh
sudo echo "0 2 * * * /opt/mongodb_security_audit.sh >> /var/log/mongodb_audit.log" | sudo tee -a /etc/crontab

九、总结

正确配置MongoDB防火墙是生产环境部署的关键步骤。本文详细介绍了:

  1. 基础配置:使用firewalld限制MongoDB端口访问
  2. 进阶配置:基于服务的规则、rich-rule复杂策略
  3. 生产实践:配合bindIp、启用认证、副本集配置
  4. 验证测试:从允许/不允许的来源测试连接
  5. 故障排查:无法连接的排查步骤
  6. 安全加固:最小权限、监控告警、定期审计

核心要点
– ❌ 不要将MongoDB绑定到0.0.0.0
– ❌ 不要允许0.0.0.0/0访问MongoDB端口
– ✅ 一定要启用MongoDB认证
– ✅ 一定要配置防火墙限制访问来源
– ✅ 定期审查和更新防火墙规则

通过本文的配置,可以显著提升MongoDB数据库的安全性,减少被攻击的风险。

注:本文基于CentOS 7+/MongoDB 5.0+环境编写,其他版本可能略有差异。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注