環境:
局域網主機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圈子】。轉載請加本文鏈接,謝謝!