利用SSH隧道突破云主機(jī)服務(wù)訪問限制
1.摘要
在工作中,經(jīng)常需要對公網(wǎng)云主機(jī)上運(yùn)行的一系列服務(wù)進(jìn)行維護(hù),為了安全起見,通常對外開放的端口只有SSH(22端口)服務(wù),雖然可以在運(yùn)維的時候臨時通過改變安全策略放行其它服務(wù)端口,但對于耗時較長的排查操作,長時間暴露敏感端口存在較大的安全風(fēng)險。而通過SSH隧道技術(shù),不用改變?nèi)魏伟踩呗员憧梢詫⒃浦鳈C(jī)中的服務(wù)端口映射到本地進(jìn)行操作,不僅能夠保證傳輸數(shù)據(jù)處于加密狀態(tài),而且可以在本地通過工具或瀏覽器訪問目標(biāo)服務(wù),既方便又安全。
2.SSH隧道原理
SSH隧道技術(shù)在本文中的應(yīng)用場景圖如下:
圖片
要成功建立SSH隧道,需要滿足以下幾個前提條件:
- 個人電腦需要安裝支持SSH協(xié)議的軟件,Windows系統(tǒng)可能需要安裝類似于Cygwin這樣的軟件。
- 云主機(jī)防火墻安全策略必須放行22端口,也就是SSH協(xié)議使用的默認(rèn)端口。
- 云主機(jī)上同樣需要安裝支持SSH協(xié)議的軟件包,要能保證能用SSH協(xié)議正常登錄遠(yuǎn)程主機(jī)。
SSH隧道主要從個人電腦開始建立,根據(jù)上圖可知,SSH隧道建立過程如下:
- 在個人電腦中開放一個自定義端口,這里選擇了5478端口,該端口沒有特別要求,可以自己根據(jù)實際情況選擇,不與其它端口沖突就行。5478端口可以看作是隧道的開端。
- 輸入遠(yuǎn)程主機(jī)的SSH登錄賬號和密碼建立隧道遠(yuǎn)程連接,防火墻的22端口必須放行才能成功建立連接。這里的SSH遠(yuǎn)程登錄可以看作是隧道的延伸,由個人電腦的5478端口出發(fā),延伸到遠(yuǎn)程云主機(jī)的22端口。
- 將遠(yuǎn)程主機(jī)的真實服務(wù)端口與本地隧道開端5478端口建立映射。映射關(guān)系可以看作是隧道的收尾工程,隧道從云主機(jī)的22端口連接后,需要將其與遠(yuǎn)程主機(jī)上的本地服務(wù)端口建立連接,假設(shè)本地服務(wù)有個3306的數(shù)據(jù)庫服務(wù), 這樣最終就打通了個人電腦5478端口和3306端口的連接,實現(xiàn)從本地訪問防火墻之后的云主機(jī)服務(wù)。
3. 實踐應(yīng)用
上面建立SSH隧道的過程,在個人電腦里可以使用SSH工具自帶的命令完成,完整命令如下:
ssh -CfNg -L 5478:localhost:3306 root@xx.xx.177.122
這條命令參數(shù)含義如下:
-C: 表示壓縮傳輸,可以提高傳輸速率。
-f: 將ssh傳輸轉(zhuǎn)入后臺執(zhí)行,不會占用當(dāng)前的shell
-N:建立靜默連接,不會看到具體的會話
-g: 允許遠(yuǎn)程主機(jī)連接本地端口轉(zhuǎn)發(fā)
-L: 本地端口轉(zhuǎn)發(fā)
5478:localhost:3306 這個參數(shù)是建立端口映射關(guān)系,5478表示本地端口,localhost:3306表示遠(yuǎn)程主機(jī)的3306端口。
注意:這里一定要寫localhost,不要寫xx.xx.177.122,雖然localhost和xx.xx.177.122代表同一臺遠(yuǎn)程機(jī)器。
root@xx.xx.177.122參數(shù)就是遠(yuǎn)程SSH登錄的過程,需要輸入SSH密碼才能最終完成隧道連接。
如果命令執(zhí)行失敗,可以先看看本地有沒有出現(xiàn)端口占用的情況,如圖:
圖片
如果命令執(zhí)行返回了進(jìn)程ID,說明本地轉(zhuǎn)發(fā)端口5478被該進(jìn)程占用了,要么kill 進(jìn)程ID,要么更換其它端口。
成功執(zhí)行命令后,可以查看ssh的后臺進(jìn)程,發(fā)現(xiàn)該進(jìn)程說明隧道建立成功,如圖:
圖片
在本地通過數(shù)據(jù)庫軟件連接5478端口試試,可以看到已成功連接遠(yuǎn)程數(shù)據(jù)庫,如圖:
圖片