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