一、为什么需要配置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防火墙是生产环境部署的关键步骤。本文详细介绍了:
- 基础配置:使用firewalld限制MongoDB端口访问
- 进阶配置:基于服务的规则、rich-rule复杂策略
- 生产实践:配合bindIp、启用认证、副本集配置
- 验证测试:从允许/不允许的来源测试连接
- 故障排查:无法连接的排查步骤
- 安全加固:最小权限、监控告警、定期审计
核心要点:
– ❌ 不要将MongoDB绑定到0.0.0.0
– ❌ 不要允许0.0.0.0/0访问MongoDB端口
– ✅ 一定要启用MongoDB认证
– ✅ 一定要配置防火墙限制访问来源
– ✅ 定期审查和更新防火墙规则
通过本文的配置,可以显著提升MongoDB数据库的安全性,减少被攻击的风险。
注:本文基于CentOS 7+/MongoDB 5.0+环境编写,其他版本可能略有差异。