問題
- 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
});
文章部分引用:用戶角色的解釋
