第一部分 SSH端口轉發概述
當你在咖啡館享受免費 WiFi 的時候,有沒有想到可能有人正在竊取你的密碼及隱私信息?當你發現實驗室的防火墻阻止了你的網絡應用端口,是不是有苦難言?來看看 SSH 的端口轉發功能能給我們帶來什么好處吧!
SSH端口轉發概述
讓我們先來了解一下端口轉發的概念吧。我們知道,SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH 還同時提供了一個非常有用的功能,這就是端口轉發。
它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程有時也被叫做“隧道”(tunneling),這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。
例如,Telnet,SMTP,LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果您工作環境中的防火墻限制了一些網絡端口的使用,但是允許 SSH 的連接,那么也是能夠通過將 TCP 端口轉發來使用 SSH 進行通訊。
總的來說 SSH 端口轉發能夠提供兩大功能:
加密 SSH Client 端至 SSH Server 端之間的通訊數據。
突破防火墻的限制完成一些之前無法建立的 TCP 連接。
圖 1. SSH 端口轉發
如上圖所示,使用了端口轉發之后,TCP 端口 A 與 B 之間現在并不直接通訊,而是轉發到了 SSH 客戶端及服務端來通訊,從而自動實現了數據加密并同時繞過了防火墻的限制。
第二部分 SSH本地端口轉發與遠程端口轉發
SSH本地端口轉發實例分析
我們先來看第一個例子,在實驗室里有一臺 LDAP 服務器(LdapServerHost),但是限制了只有本機上部署的應用才能直接連接此 LDAP 服務器。
如果我們由于調試或者測試的需要想臨時從遠程機器(LdapClientHost)直接連接到這個 LDAP 服務器 , 有什么方法能夠實現呢?
答案無疑是本地端口轉發了,它的命令格式是:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
在 LdapClientHost 上執行如下命令即可建立一個 SSH 的本地端口轉發,例如:
$ ssh -L 7001:localhost:389 LdapServerHost
圖 2. 本地端口轉發
這里需要注意的是本例中我們選擇了 7001 端口作為本地的監聽端口,在選擇端口號時要注意非管理員帳號是無權綁定 1-1023 端口的,所以一般是選用一個 1024-65535 之間的并且尚未使用的端口號即可。
然后我們可以將遠程機器(LdapClientHost)上的應用直接配置到本機的 7001 端口上(而不是 LDAP 服務器的 389 端口上)。之后的數據流將會是下面這個樣子:
我們在 LdapClientHost 上的應用將數據發送到本機的 7001 端口上,
而本機的 SSH Client 會將 7001 端口收到的數據加密并轉發到 LdapServertHost 的 SSH Server 上。
SSH Server 會解密收到的數據并將之轉發到監聽的 LDAP 389 端口上,
最后再將從 LDAP 返回的數據原路返回以完成整個流程。
我們可以看到,這整個流程應用并沒有直接連接 LDAP 服務器,而是連接到了本地的一個監聽端口,但是 SSH 端口轉發完成了
剩下的所有事情,加密,轉發,解密,通訊。
這里有幾個地方需要注意:
SSH 端口轉發是通過 SSH 連接建立起來的,我們必須保持這個 SSH 連接以使端口轉發保持生效。一旦關閉了此連接,相應的端口轉發也會隨之關閉。
新聞熱點
疑難解答