nmap -sS -p27017 your_public_ip可快速检测MongoDB是否公网暴露;若返回“27017/tcp open mongodb”,表明端口已裸奔,攻击者可直连尝试未授权操作,此时无论是否启用认证均存在严重风险。

用 nmap 快速确认 MongoDB 是否可被公网扫描到
只要你的服务器有公网 IP,且 mongod 正在运行,nmap 一条命令就能验证它是否“裸奔”:
nmap -sS -p27017 your_public_ip
如果输出中出现 27017/tcp open mongodb,说明该端口已对公网开放——不管有没有密码,都已被暴露。此时攻击者无需爆破,直接连接即可尝试未授权操作。
- 若返回
filtered或超时,不代表绝对安全,可能是防火墙拦截了探测包,但服务本身仍监听在公网地址上 - 别只扫自己机器的
127.0.0.1或内网 IP,那永远显示“open”,毫无意义 - 真实攻击者用的是
Shodan或ZoomEye,它们默认就扫27017端口,不依赖你是否允许 ICMP
检查 bindIp 配置是否等于自曝身份证
bindIp 是 MongoDB 安全的第一道闸门。它写在哪?怎么看?怎么改?三个动作必须连贯:
- 配置文件路径因安装方式而异:
/etc/mongod.conf(Linux systemd)、/www/server/mongodb/mongod.cfg(宝塔)、C:\Program Files\MongoDB\Server\*\bin\mongod.cfg(Windows) - 打开后定位到
net:段,重点看bindIp:的值 —— 如果是0.0.0.0、空值、或包含公网 IP(如192.168.1.100,203.204.205.206),就是高危配置 - 正确值应为
127.0.0.1(仅本地)或明确的内网段(如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16),绝不能含0.0.0.0
改完不重启 = 白改。sudo systemctl restart mongod 后,必须验证生效。
用 ss 或 netstat 看实际监听地址
配置文件写得再对,没生效也没用。用系统工具看 mongod 进程到底绑在哪个地址上:
ss -tlnp | grep :27017
关键看输出第三列(Local Address:Port):
-
127.0.0.1:27017✅ 安全 -
10.10.1.5:27017✅(假设是可信内网 IP) -
*:27017❌ 等价于0.0.0.0:27017,正在公网裸奔 -
[::]:27017❌ IPv6 全局监听,同样危险
注意:netstat -tlnp | grep mongod 在部分新系统已被弃用,优先用 ss。
为什么开了 auth 还被黑?因为 bindIp 比密码更前置
很多人以为“我设了管理员用户,还启用了 authorization: enabled”,就万事大吉。错。
-
authorization只控制“登录后能做什么”,不控制“谁能连上来” - 如果
bindIp: 0.0.0.0,攻击者连上后会直接收到not authorized on admin to execute command { listDatabases: 1.0 }—— 但这已足够暴露数据库存在、版本、甚至部分库名 - 更糟的是:旧版 MongoDB(admin 库可能根本没用户,
authorization形同虚设
真正的防护顺序是:先用 bindIp 缩小攻击面 → 再用防火墙限制来源 IP → 最后启用 authorization 并创建强密码用户。漏掉第一步,后面全白搭。

















