SSH隧道應用, 突破網絡限制
文/怡文圣美
這篇文章可以幫你解決下面三個問題:
- 不能直連服務器, 要先登陸跳板機, 造成客戶端工具無法連接服務器.
- 服務器沒有公網IP, 且只允許公司IP訪問, 要在家里操作要先遠程桌面到工作機再登陸服務器, 速度很慢又不穩(wěn)定. 你有一臺公網服務器, 希望能借它牽線搭橋.
- 用最簡單的辦法為服務器增加代理功能.
一. SSH隧道技術
要解決本文開頭的三個問題, 最佳方案肯定是ssh隧道. 什么是ssh隧道呢? 請參考阮一峰老師寫的SSH原理與運用(二):遠程操作與端口轉發(fā).
阮一峰老師說到, ssh隧道有三種類型, 正好可以用來解決文章開頭提到的三個問題. 這三個類型是:
- 本地端口轉發(fā).
- 遠程端口轉發(fā).
- 綁定本地端口.
ssh隧道使用命令就可以創(chuàng)建, 工作中我們有先進的工具輔助, 可以為你省去不少麻煩, 比如你手頭肯定會有的SecureCRT, 或者XShell.
二. 使用隧道繞過跳板機
用通俗的話講, 這里的隧道在做這么一件事: 服務器A上有個程序, 監(jiān)聽3306端口, 存在一臺服務器B分別和你的工作機以及服務器A的網絡相通, 你在服務器A和服務器B上都有登陸權限, 隧道可以幫你把服務器A的3306端口映射到服務器B或者你的工作機上, 連接映射后的3306端口就等同于連接服務器A的3306端口.
工作中, 公司IT部為保證服務器安全, 工作機和服務器A之間的網絡是不通的, 需要借助充當跳板機角色的服務器B. 你需要先ssh到服務器B, 再ssh到服務器A. 這對控制臺下的一般管理還算能接受, 但對于不得不借助客戶端工具的任務就無法實施了. 所以, 使用隧道, 把服務器A的3306端口映射到本地, 客戶端工具中修改地址為localhost:3306
, 客戶端工具就能正常連接服務器A了.
使用工具創(chuàng)建隧道前先確保已將服務器B的ssh公鑰上傳至服務器A, 如果不明白我說的是什么, 請參考阮一峰老師寫的SSH原理與運用(一):遠程登錄的第五節(jié): 公鑰登錄
這里以XShell為例, SecureCRT類似. 打開服務器B的連接屬性, 有一個被"特意"加粗顯示的菜單叫隧道, 右邊大紅框中展示的是已經建立的, 點擊"添加"按鈕添加新隧道.
類型(方向)選擇Local (Outgoing), 源主機一欄填寫你想映射到哪里, 偵聽端口填寫映射后的端口, 這里填寫localhost和3306, 代表映射到本的3306端口. 目標主機為服務器A的IP, 目標端口為3306, 意思是把服務器A的3306端口映射到本地. 確定后就添加了一條映射規(guī)則, 以后只要打開這個連接, 這條映射規(guī)則就會生效.
查看菜單里的"隧道窗格"可以顯示當前會話所建立的隧道(轉義規(guī)則標簽)以及當前有哪些隧道正在通信(渠道標簽).
有些客戶端工具也自帶隧道功能, 比較常見的就是各種數(shù)據庫連接工具, 如HeidiSQL, MySQL Workbench, Navicat等等
總結: 有了ssh隧道后, 任意被跳板機"擋住"的服務器端口都可以映射到本地或者你能直連的服務器上.
三. 使用反向隧道繞過防火墻
這里的反向隧道應用于這樣一種場景: 公司服務器A位于內網, 沒有公網IP, 只能被公司IP的電腦登陸. 你有一臺公網服務器C, 可以被家中電腦和服務器A主動連接.
利用反向隧道可以讓服務器C成為連通家中電腦和公司服務器A的橋梁. 使用反向隧道的大致步驟為:
- 在公司登陸服務器A, 和服務器C之間建立反向隧道,
- 在家里登錄服務器C,
- 連接反向隧道從而登陸服務器A.
可以發(fā)現(xiàn)服務器A是主動連接服務器C的, 這就順利突破了公司防火墻和沒有公網IP的限制. 這就是反向的含義.
具體的步驟是先用公司的工作機登陸服務器A執(zhí)行命令:
ssh -R 7000:localhost22 root@ServerC_IP
含義是登陸服務器C后, 將本地的22端口映射到服務器C的7000端口上. 這時候不能退出, 不能關電腦, 不能斷網絡. 待你回到家后用家中電腦登陸服務器C, 執(zhí)行:
netstat -lpn | grep 7000
會發(fā)現(xiàn)一個被打開的7000端口, 這就是隧道了. 該端口等同于服務器A的22端口, 你執(zhí)行下面命令就可以登陸服務器A了:
ssh user@localhost -p 7000
工作機上如果退出服務器C的登陸, 隧道就會被關閉, 所以這種方案也只能適合工作機可以長時間不關的人.
讀者可能會發(fā)現(xiàn)XShell的連接屬性->隧道->添加->類型(方向)下拉框中有一個選項叫Remote (Incoming), 這種類型對應的也是反向隧道. 但筆者用這種方式建立的隧道無法使用, 既沒有報錯, 也沒有成功映射端口.有知道這個選項到底干嘛用的請一定要告訴我哦 O(∩_∩)O~.
總結: 在知道反向隧道之前, 你登錄公司服務器的方法可能是先遠程桌面到工作機, 再登陸公司服務器, 這之間可能還要先登錄跳板機, 受遠程桌面和網絡質量的影響, 這樣2次跳板后到達服務器的操作感受會很糟糕. 現(xiàn)在只需要跳轉1次, 關鍵是省去了遠程桌面, 操作流暢度會大大提高.
四. 使用代理隧道搭建代理服務器
阮一峰老是在SSH原理與運用(二):遠程操作與端口轉發(fā)中說的綁定本地端口類型指的就是代理隧道, 這點可以從XShell的連接屬性->隧道->添加->類型(方向)->Dynamic (SOCKS4/5)就可以看出:
這樣的隧道建立后, localhost:8080
就是代理服務器地址了, 代理的網絡環(huán)境就是會話所連接的服務器網絡.
這種隧道非常適合用來調試線上系統(tǒng). 比如采用分布式部署的應用, 從公網訪問, 均衡負載會隨機分配一臺主機響應, 想要調試指定的一臺主機怎么辦? 你可以在均衡負載機上建立代理隧道, 瀏覽器中配置均衡負載為代理服務器, 瀏覽器地址欄輸入主機的內網IP就可以訪問指定的主機了.
總結: 雖然Linux安裝ss5不難, 但在公司的服務器上安裝就不妥了. 這種基于ssh的ss5代理方式比較輕量級, 無需在服務器上安裝什么, 打開關閉很容易, 不相關人也無法使用, 簡單又安全.
完.