使用SSH進行內網透傳對外提供服務

環境:

局域網主機A:IP:192.168.18.8(這是一個局域網內部IP),提供Web服務端口:8080,ssh端口:22
阿里雲主機B:IP:39.100.100.100(這是一個公網IP,主機A可以SSH連接到主機B,當然,我自己真實服務器的地址不是這個~),ssh端口:22
域名:test.iquanzi.top

需求:

局域網主機A通過端口8080對外提供一個Web服務,用戶C使用域名test.iquanzi.top在互聯網上訪問服務。

問題:

主機A只有局域網IP,A所在局域網的外部IP不固定,且沒有權限在A所在的局域網路由器上作端口映射。

解決思路:

(實現A主機服務被外部訪問的方案不止一種,本文只介紹SSH透傳一種其他方案可自行百度)

藉助互聯網服務器B進行代理,將域名解析到B服務器,B服務器通過nginx代理轉發到主機B的指定端口,主機B的指定端口是主機A與主機B進行數據通信的SSH隧道遠程轉發端口(A主動連接的B喔,SSH端口轉發概念點擊瞭解一下~)。

實現步驟:

1、在主機A上執行命令:

$ ssh -fCNR 8161:localhost:8080 [email protected]

回車後,需要輸入主機B的密碼,輸入成功後SSH隧道就建立成功了。

該命令的可以理解爲:建立本地主機的8080端口與遠端主機的8161端口的隧道。這樣依賴,所有向遠端主機8161端口發送的數據,會通過該隧道,直接轉發到本地主機的8080端口。

參數說明:
-f:SSH客戶端在後臺運行。
-C:壓縮數據傳輸。
-N:僅做端口轉發。
-R:該參數有三個部分:

  • 8161:遠端主機使用的端口;
  • localhost:本地主機的主機名或IP地址
  • 8080:需要映射的本地主機端口

 

可以通過netstat命令在主機B上查看ssh監聽端口。

2、在主機B上配置nginx代理

配置好後,nginx需要reload一下。

3、域名解析,這一步按照一般解析做即可,不需要特殊說明,跳過。

到此,基本上算是配置完成了。

但是,上面的配置還存在兩個問題:

其一:每次連接時,都需要輸入主機B的密碼;參考:《SSH免密登錄的實現

其二:第一步SSH這種反向連接不穩定,遇到各種各樣的問題都可能斷開,需要主機A 再次向主機B發起連接。此時,我們需要使用另一個武器了–>“autossh

$ autossh -M 5122 -CNR 8161:localhost:8080 [email protected]

這裏,比使用ssh多了一個-M參數,該參數設定一個監視連接狀態的端口,當連接出現問題時,會進行自動重連。

---------------------------------------------------------

本文系作者原創發佈在個人博客【小T圈子】。轉載請加本文鏈接,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章