為了數據安全,在MongoDB的配置文件里,一般會把默認的27017端口port改為自定義的端口號,然后把允許訪問的IP設為127.0.0.1(即主機本身)。但是這樣就會在開發的過程查看數據時帶來麻煩,必須去服務器端或調用部署在服務器的API接口才能很好地可視化地查詢數據。為了能在客戶端也能使用可視化工具,可以建立一條SSH隧道,直接在客戶端訪問遠程服務器的數據庫。
本文例子基於以下開發環境:
服務器端:Ubuntu 16.04 x86_64,MongoDB 3.4.6
客戶端:Windows10 x86_64,Robomongo 1.0.0-RC1,PuTTY或XShell
=========================================================================
有兩種思路可以建立SSH隧道以實現客戶端Robomongo訪問服務器MongoDB,一是使用PuTTY或XShell連接服務器時建立隧道,將服務器的MongoDB監聽端口映射到客戶端的指定端口,這樣在客戶端使用Robomongo連接本地的指定端口即可訪問到服務器的MongoDB端口,缺點是連接數據庫前需要保持PuTTY或者XShell處於與數據庫的連接狀態;二是使用Robomongo自帶的建立SSH隧道方式,只需要在Robomongo新建連接,輸入建立SSH會話所需的用戶名密碼或者密鑰,相當於使用Robomongo登錄到服務器,然后在服務器訪問本地的MongoDB端口即可,優勢在於不需要單獨建立SSH連接(沒錯這種方法才是推薦使用的,但是第一種就可以不局限於Robomongo的連接)。
=========================================================================
注意:因為SSH隧道是基於TCP Forward建立的,因此,在sshd配置文件里一定要允許TCPForwarding,我開始配置sshd的時候將這個禁用了,所以爬了好久才爬出這個坑。
$ sudo vim /etc/ssh/sshd_config
修改如下字段:
AllowTCPForwarding yes
重啟sshd
$ sudo systemctl restart sshd
另外,要把MongoDB的配置文件進行修改,使其僅能通過本地訪問:
$ sudo vim /etc/mongod.conf
修改如下字段:
net:
port: 27017
bindIP: 127.0.0.1
=========================================================================
一、使用PuTTY或XShell建立客戶端與服務器的SSH隧道
PuTTY: 設置好登錄信息(包括服務器IP端口用戶密碼密鑰等)后,在左側欄找到Connection/SSH/Tunnels,Add new forwarded port下,Source Port 填寫需要映射到客戶端的端口號,Destination填寫服務器的主機和端口號(服務器的主機當然是localhost了)下面選Local和Auto即可,然后點擊Add,保存以便下次登錄方便,點擊Open即可建立SSH隧道連接。
然后,打開Robomongo,新建連接到localhost:27018即可連接到服務器的MongoDB了。
或者說,可以通過監聽本地的27018端口即可監聽到服務器的27017端口。
類似地,使用XShell時,填寫好登錄主機端口用戶名密碼密鑰等信息后,在左側欄找到SSH/隧道,添加TCP/IP轉移規則類型為Local, 源主機即使客戶端的主機及偵聽端口,目標則是服務器的主機及端口,確定后連接,即可建立SSH隧道。
=========================================================================
二、使用Robomongo自帶的SSH隧道
打開Robomongo,在連接設置里的SSH選項卡中啟用SSH tunnel並設置登錄SSH服務器的信息,回到Connection選項卡,填入主機(localhost)與服務器上MongoDB對應的端口。保存連接即可。