Mongodb Connection refused : connect@src/mongo/shell/mongo.js:341:17


问题

解决办法

mongod -f /etc/mongod.conf

补充

查看mongodb 进程

sudo netstat -plnt |egrep mongod

参考文章

(4条消息) 【MongoDB】This server is bound to localhost. Remote systems will be unable to connect to this server._Hhalcyon的博客-CSDN博客

由于之前写了学习博客,暴露了自己服务器的IP,导致自己的服务器被黑客攻击,隔三差五删我的数据库。终于有一天,不能忍受,想着改一下数据库的接口,修改了配置文件后启动‘mongod’,发现和以前的界面不一样,我的mongo的版本是4.0.17,环境是centOs7,正常可以全局用‘mongo’启动数据库,这个时候不但报错
在这里插入图片描述
且用mongod手工启动的时候,会有很多警告,其中一条就是这个:
在这里插入图片描述
不知道怎么处理的我将‘mongod --repair’ 、彻底卸载重装等等方法试过后,看了一位大佬说的话茅塞顿开。那位大佬说,如果要被外部访问,那么在接口状态中,不应该是127.0.0.1,应该是0.0.0.0,于是我看了看我的接口状态:
在这里插入图片描述
我能够被外部访问的接口是20012,而我在服务器端启动的接口是27017,这样导致你操作的和你连接的不是同一个数据库,所以会出现本文一开始的那个警告。我用DataGrip连接过,20012接口的确能够连接,但是是一个空的数据库,而通过服务器默认启动的是27017接口的数据库。
在安装4.0.17版本的时候,在最后通常会用这三句代码在系统中默认启动数据库:

     systemctl enable mongod //开机自启MongoDB
	 systemctl start mongod  //启动MongoDB
	 systemctl status mongod //可以检查是否启动了MongoDB

如果想用其它接口读写数据库,在启动mongod的时候需要带上接口号,不然会默认启动27017接口,但是,如果你使用上述三句代码在系统默认启动mongodb的话,不能指定其它接口登陆(至少我没有查到相关资料)。
那么现在我面临两个问题:1、如何将现在的状态还原。2、如何抵挡黑客的下一次攻击
现在先说第一个问题:
首先,我们先杀死mongod的进程,在官方文档中,用红色的字警示我们不要用

  kill -9 mongod

但是我们可以先找出mongod的运行进程单独杀掉它:

     ps -ef|grep mongod //查看mongod的进程
 	 kill -9 /*进程号*/

如下图所示:
在这里插入图片描述
为什么要杀死mongod的进程?因为更改mongod.conf之后,会再次通过

mongod -f /*mongod.conf*/

启动mongodb,如果之前不杀死进程,会提示有进程已经在运行。
这里需要说明的是,修改mongod.conf时,port改为27017,bind_ip改为0.0.0.0
如上图所示,启动后我们再运行’mongod’,如果提示‘mongod’进程已经在运行,第一个问题就解决了。
我们再说说第二个问题:
黑客能顺利的黑进来是因为我们为了方便没有对数据库设置角色,设置密码。导致他们知道服务器的IP时就可以顺藤摸瓜进来删你数据库,并留下“勒索信息”,这个时候我们就需要对数据库进行加密。

      use admin     //如果要加密一个新的数据库,一定要在show dbs里面看得到该数据库的名字才能添加成功
	  db.createUser({
		  user:"admin",
		  pwd:"admin",
		  roles:[{    //可以指定在不同数据库中不同的角色
			role:"root",
			db:"admin"
			 }]
		})

数据库用户角色:read、readWrite; 数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、4. clusterMonitor、hostManage;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root 内部角色:__system Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

mongodb 4.0和3.0最大的区别是,除了安装方便外,4.0已经将一些命令写入全局,不用像3.0一样./mongo,所以加密的登陆也会不一样。
首先,我们需要更改mongod.conf,根据我图中的样子改
在这里插入图片描述
这里有一点需要注意,mongod.conf的书写是有格式的,如果冒号后有值,需要中间有一个空格。且存在下一级的关系的时候要换行,不要偷懒写在一行上,会报错的。
然后像问题一那样重启数据库,通过‘mongo’进入数据库,这个时候界面会有变化:
在这里插入图片描述
会暗示你输入session,如果你什么都不输入,直接show dbs,什么都查不到。这个时候再

      use /*你要登陆的数据库*/
      db.auth(/*你设置的用户名*/,/*你设置的密码*/)

返回值是‘1’代表成功,这个时候再show dbs,只能看到该角色登陆成功的数据库。
解决完了问题,我再讲讲延伸的问题,在该状态下,如何让DataGrip和mongoose连接数据库。
1、DataGrip
打开配置:
在这里插入图片描述
输入用户名、密码和数据库名字,就可以(被黑怕了,把IP遮住)
在这里插入图片描述
2、mongoose连接

 const mongoose = require("mongoose");
 mongoose.connect("mongodb://用户名:密码@ip地址:27017/数据库", {
  useNewUrlParser: true
});

文章部分引用:用户角色的解释


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM