问题
- SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused : connect@src/mongo/shell/mongo.js:341:17
- mongodb - How to fix Mongo connection problem? Connection refused : connect@src/mongo/shell/mongo.js:344:17 @(connect):2:6 exception: connect failed - Stack Overflow
- (4条消息) 【MongoDB】This server is bound to localhost. Remote systems will be unable to connect to this server._Hhalcyon的博客-CSDN博客
解决办法
mongod -f /etc/mongod.conf
补充
查看mongodb 进程
sudo netstat -plnt |egrep mongod
参考文章
由于之前写了学习博客,暴露了自己服务器的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
});
文章部分引用:用户角色的解释