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