SSH 端口轉發

端口轉發

我們知道,SSH會自動加密和解密所有得SSH客戶端與服務器之間得網絡數據。但是,SSH還同時提供了一個非常有用的功能,就是端口轉發。它能夠將其他TCP端口的網絡數據通過SSH鏈接來轉發,並且自動提供了相應加密和解密服務。這一過程也叫做“隧道”,這是因爲SSH爲其他的TCP鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet ,SMTP ,LDAP這些TCP應用均能夠從中獲益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火牆限制了一些網絡端口的使用,但是允許SSH的連接,那麼也是能夠通過將TCP端口轉發來使用SSH進行通訊。總的來說SSH端口轉發能夠提供兩大功能:

  1. 加密SSH Client端至SSH Server端之間的通訊。
  2. 突破防火牆的i限制完成一些之前無法建立的TCP連接

本地端口轉發

在實驗室裏有一臺LDAP服務器,但是限制了只有本機上的部署的應用才能直接連接此LDAP服務器。如果我們由於調試或者測試的需要想臨時從遠程機器直接連接到這個LDAP服務器,那我們就需要通過下圖的方式,也就是本地端口轉發來實現了。
SSH 端口轉發
如上圖所示,選擇了一個空閒端口7001,數據流方向將會如下所述:

  1. 我們在LDAP Client 上的應用將數據發送到本機的7001端口上。
  2. 本機的SSH Client會將7001端口收到的數據加密並轉發到LDAP Server的SSH Server上。
  3. SSH Server會解密收到的數據並將之轉發到監聽的LDAP的端口上。
  4. 最後再將從LDAP返回的數據原路返回以達到我們的目的。

整個過程應用並沒有直接連接LDAP服務器,而是連到了本地的一個監聽端口,但是SSH轉發完成看剩下的所有事情,加密、轉發解密通訊。那麼如何在LDAP Client上建立SSH的本地端口轉發呢?其實很簡單,只需要一條命令:

ssh -L 7001:localhost:389 LDAPServerhost

注:LDAP服務監聽端口是389


遠程端口轉發

同樣以LDAP服務爲例,但是在這裏由於網絡或防火牆的原因我們不能用SSH直接從LDAP Clie,那麼我們就得選擇遠程端口轉發了。具體如下圖所示:
SSH 端口轉發
和本地端口轉發相比,這次得圖裏,SSH Server和SSH Client的位置對調了一下,但是數據流依然是一樣的。我們在 Ldap Client上的應用將數據發送到本機的 7001 端口上,而本機的 SSH Server 會將 7001 端口收到的數據加密並轉發到 Ldap Server 的 SSH Client 上。 SSH Client 會解密收到的數據並將之轉發到監聽的 LDAP 389 端口上,最後再將從 LDAP 返回的數據原路返回以完成整個流程。
同樣的,我們只需要通過一條命令就可以實現上述流程

ssh -R 7001:localhost:389 LDAPServerhost

本地端口轉發和遠程端口轉發的區別

由上述的本地端口轉發和遠程端口轉發我們發現,兩種轉發方式的數據流是一致的,那麼他們到底有什麼區別呢?

  • 首先,SSH端口轉發是需要的SSH連接的,而SSH連接室友是有方向的,從SSH Client到SSH Server.
  • 其次,我們的應用也是有方向的,比如我們想要連接到LDAP的服務器,則我們需要從LDAP的Client去連接LDAP的Server,連接方向也是從Client到Server端。
  • 最後,我們可以看到,本地端口轉發的應用的連接方向和SSH的連接方向是一致的;而遠程端口轉發應用連接方向和SSH連接方向是相反的。

所以說,我們可以直接通過應用的連接方向和SSH的連接方向來判斷,如果這兩個連接的方向一致,那我們就說它是本地轉發。而如果兩個方向不一致,我們就說它是遠程轉發。


動態端口轉發以及科學上網的實現

SSH動態綁定
這是SSH×××的基本原理:利用SSH動態綁定的功能。那麼何謂SSH動態綁定呢?動態綁定是SSH端口轉發功能的一種形式。

  1. 首先,牆內的客戶機跟牆外的代理服務器,建立好SSH連接,並設定動態綁定
  2. 此時牆內客戶機上的SSH會監聽本地的一個端口7001
  3. 客戶機上的程序,將對www.youtube.com:80的請求告知7001端口的SSH,SSH將此請求通過SSH加密連接發送到牆外服務器的SSH上
  4. 由於建立的動態綁定,服務器會將www.youtube.com:80的請求發送給www.youtube.com上的80端口,並在收到回覆後,通過原路返回給客戶機的SSH,
    如下圖所示:
    SSH 端口轉發

客戶機的SSH返回給應用程序在這裏SSH客戶端已經不僅僅是個客戶端了,它同時打開了7001端口偵聽本機應用程序的請求。這是SSH跟傳統用法最大的區別。而服務端的SSH也不僅僅是處理客戶端的請求,而是將請求轉發到對應的主機和端口,這裏的動態二字體現在服務端的SSH的轉發目標是不固定的,是根據客戶端的請求而定的。

SOCKS代理
那麼如何讓應用程序知道應該把請求發送給本機的7001端口呢?
答案就是SOCKS代理。

實際上SOCKS代理普遍被許多應用程序支持:QQ、瀏覽器、MSN…所以在上述的模型中,客戶機的SSH實際上就是實現了一個SOCKS代理的角色,這個SOCKS代理偵聽了7001端口,並將所有的請求都代理給服務器的SSH,並利用SSH動態綁定,讓服務器進一步轉發請求。

SSH隧道的搭建
其實SSH搭建很簡單,我們只需要牆外有一臺支持SSH的服務器就可以了,然後在客戶端SSH執行如下命令:

ssh -D 7001 username@remote-host

上述命令中-D表示動態綁定,7001表示本地SOCKS代理的偵聽端口,可以改成別的,後面的username@remote-host就是你登錄遠程服務器的用戶名和主機。當然,這個命令後會提示輸入密碼,就是username這個用戶的密碼。
密碼正確輸入後,隧道也就成功打通了。最後在瀏覽器或者其他應用程序上設置SOCKS代理,代理指向127.0.0.1,端口7001即可,這樣科學上網就實現了。

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