bindip必须显式指定具体ip,不可留空或设0.0.0.0,因mongodb 3.0+默认仅监听127.0.0.1,但空值、注释或0.0.0.0会意外暴露服务;且不支持cidr/通配符,仅允许多个具体ip逗号分隔。

bind_ip 配置为什么必须显式指定,不能留空或写 0.0.0.0
MongoDB 默认行为在 3.0 之前是监听 0.0.0.0,之后版本改为只监听 127.0.0.1 —— 但这个“默认”极易被覆盖。只要配置文件里出现 bindIp 字段且值为空、注释掉、或写成 0.0.0.0,服务就会对外暴露。
常见错误现象:netstat -tuln | grep 27017 显示 *:27017 或 0.0.0.0:27017,说明正在监听所有接口;用 nmap -p 27017 <ip></ip> 能直接连上,就是没生效。
- 若只需本地访问,
bindIp: 127.0.0.1是最安全的写法 - 若需内网其他机器访问,明确列出 IP,例如
bindIp: 127.0.0.1,192.168.10.50,192.168.10.51,不要用网段或通配符 - YAML 格式下注意缩进和逗号分隔,多写空格或少写冒号会导致 mongod 启动失败并报错
Failed to parse config file - 修改后必须重启服务:
sudo systemctl restart mongod,仅 reload 不生效
启用 authorization 后,为什么还可能被绕过
开了 authorization: enabled 却仍能无密码登录,通常不是配置没生效,而是用户体系根本没建好。
关键点:MongoDB 的认证机制依赖 admin 数据库中的 system.users 集合。如果这个集合为空(即没创建任何用户),即使开了 auth,mongod 也不会强制校验 —— 它会静默放行本地连接(尤其是 127.0.0.1)。
- 先用
mongo --host 127.0.0.1连入,再执行:use admin→db.createUser({user:"root",pwd:"xxx",roles:["root"]}) - 创建完务必验证:
mongo --host 127.0.0.1 -u root -p xxx --authenticationDatabase admin - 旧版 MongoDB(如 3.2 以前)用的是
auth=true参数,写在配置文件里要放在security:下而非顶层;新版 YAML 必须用security.authorization: enabled - 配置项写错位置(比如把
authorization写在net:下)会导致启动时忽略该设置,日志里可能只报 warning,不中断启动
防火墙 + bind_ip + auth 三者缺一不可
只靠某一项防护,漏洞依然存在。比如:
- 只设了
bindIp: 127.0.0.1,但服务器开了 Docker,容器网络桥接后可能绕过绑定(宿主机 netns 中仍可见 0.0.0.0) - 只开了 auth,但
bindIp没改,外网仍可连上来暴力猜解(尤其弱密码) - 只加了 iptables 规则,但规则未持久化,重启后失效;或规则顺序错误(如 -j ACCEPT 放在 DROP 之后)
实操建议:
- iptables 示例(仅允许内网段):
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 27017 -j ACCEPT,然后iptables -A INPUT -p tcp --dport 27017 -j DROP - 云服务器必须同步检查安全组,不能只信本地防火墙
- 每次改完配置,用非本机 IP 尝试连接:
mongo --host --port 27017,应直接拒绝连接(Connection refused),而不是提示 Authentication failed
验证是否真修复成功的三个命令
别只看配置文件和重启,必须实测。以下命令缺一不可:
-
sudo ss -tlnp | grep :27017—— 确认监听地址确实是127.0.0.1:27017或指定内网 IP,不是*:27017 -
mongod --config /etc/mongod.conf --dryRun—— 检查配置语法是否合法,避免因格式错误导致 auth 实际未加载 -
mongo --eval "db.runCommand({connectionStatus: 1})" --quiet 2>/dev/null | grep -q '"authEnabled":true'—— 返回 0 才表示 auth 已真正启用
最容易被忽略的是:MongoDB 在容器中运行时,bindIp 要绑定到容器内网 IP(如 172.17.0.2),而不是宿主机的 127.0.0.1;否则容器外仍可通过宿主机端口映射直连。











