The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
          什么是SSH隧道
          首先看下面這張圖,我們所面臨的大部分情況都和它類似。我們的電腦在右上角,通過公司帶有防火墻功能的路由器接入互聯(lián)網(wǎng)(當然可能還有交換機什么的在中間連接著你和路由器,但是在我們的問題中交換機并不起到什么關鍵性的作用)。右下腳的部分是一個網(wǎng)站的服務器,它是我們公司防火墻策略的一部分,也就是說公司不希望我們訪問這個服務器。在右上角還有一臺機器,它也是屬于我們的。但是這臺機器并不在我們公司里面,換句話說他不受到公司防火墻的限制。最后也是最重要的一點是,我們能夠在公司通過互聯(lián)網(wǎng)直接訪問這臺機器。或者說這臺位于公司防火墻外面的機器需要擁有一個獨立的互聯(lián)網(wǎng)IP,同時公司的防火墻規(guī)則不會屏蔽這臺機器,并且這臺機器運行著一個OpenSSH服務器。
          如何使用ssh建立隧道(轉載) - Search - Search的博客



          現(xiàn)在,我們清楚地知道了自己所處的網(wǎng)絡環(huán)境。并且不難理解我們在公司無法訪問那個服務器的原因是:線路A-B-C上A-B之間的防火墻屏蔽了對那個服務器的訪問。與此同時,我們也很快注意到,線路A-B-D之間、D-C之間是不受阻礙的。相信你已經(jīng)想到了,在A-B之間的防火墻不會屏蔽對機器d的訪問。因此我們可以通過機器d建立一個通道A-B-D-C,從而訪問到機器c上的數(shù)據(jù)。

          這條通道可以用很多技術來建立,這里我們僅僅介紹如何使用SSH服務器來建立這樣一個通道-他被稱為SSH隧道。

          如何建立本地SSH隧道
          在我們計劃建立一個本地SSH隧道之前,我們必須清楚下面這些數(shù)據(jù):

          中間服務器d的IP地址
          要訪問服務器c的IP地址
          要訪問服務器c的端口
          現(xiàn)在,我們把上面這張圖變得具體一些,給這些機器加上IP地址。并且根據(jù)下面這張圖列出我們的計劃:
          如何使用ssh建立隧道(轉載) - Search - Search的博客



          需要訪問234.234.234.234的FTP服務,也就是端口21
          中間服務器是123.123.123.123
          現(xiàn)在我們使用下面這條命令來達成我們的目的

          ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
          ftp localhost:2121 # 現(xiàn)在訪問本地2121端口,就能連接234.234.234.234的21端口了
          這里我們用到了SSH客戶端的三個參數(shù),下面我們一一做出解釋:

          -N 告訴SSH客戶端,這個連接不需要執(zhí)行任何命令。僅僅做端口轉發(fā)
          -f 告訴SSH客戶端在后臺運行
          -L 做本地映射端口,被冒號分割的三個部分含義分別是
          需要使用的本地端口號
          需要訪問的目標機器IP地址(IP: 234.234.234.234)
          需要訪問的目標機器端口(端口: 21)
          最后一個參數(shù)是我們用來建立隧道的中間機器的IP地址(IP: 123.123.123.123)
          我們再重復一下-L參數(shù)的行為。-L X:Y:Z的含義是,將IP為Y的機器的Z端口通過中間服務器映射到本地機器的X端口。

          在這條命令成功執(zhí)行之后,我們已經(jīng)具有繞過公司防火墻的能力,并且成功訪問到了我們喜歡的一個FTP服務器了。

          如何建立遠程SSH隧道
          通過建立本地SSH隧道,我們成功地繞過防火墻開始下載FTP上的資源了。那么當我們在家里的時候想要察看下載進度怎么辦呢?大多數(shù)公司的網(wǎng)絡是通過路由器接入互聯(lián)網(wǎng)的,公司內(nèi)部的機器不會直接與互聯(lián)網(wǎng)連接,也就是不能通過互聯(lián)網(wǎng)直接訪問。通過線路D-B-A訪問公司里的機器a便是不可能的。也許你已經(jīng)注意到了,雖然D-B-A這個方向的連接不通,但是A-B-D這個方向的連接是沒有問題的。那么,我們能否利用一條已經(jīng)連接好的A-B-D方向的連接來完成D-B-A方向的訪問呢?答案是肯定的,這就是遠程SSH隧道的用途。

          與本地SSH一樣,我們在建立遠程SSH隧道之前要清楚下面幾個參數(shù):

          需要訪問內(nèi)部機器的遠程機器的IP地址(這里是123.123.123.123)
          需要讓遠程機器能訪問的內(nèi)部機器的IP地址(這里因為是想把本機映射出去,因此IP是127.0.0.1)
          需要讓遠程機器能訪問的內(nèi)部機器的端口號(端口:22)
          在清楚了上面的參數(shù)后,我們使用下面的命令來建立一個遠程SSH隧道

          ssh -N -f -R 2222:127.0.0.1:22 123.123.123.123
          現(xiàn)在,在IP是123.123.123.123的機器上我們用下面的命令就可以登陸公司的IP是192.168.0.100的機器了。

          ssh -p 2222 localhost
          -N,-f 這兩個參數(shù)我們已經(jīng)在本地SSH隧道中介紹過了。我們現(xiàn)在重點說說參數(shù)-R。該參數(shù)的三個部分的含義分別是:

          遠程機器使用的端口(2222)
          需要映射的內(nèi)部機器的IP地址(127.0.0.1)
          需要映射的內(nèi)部機器的端口(22)
          例如:-R X:Y:Z 就是把我們內(nèi)部的Y機器的Z端口映射到遠程機器的X端口上。

          建立SSH隧道的幾個技巧
          自動重連

          隧道可能因為某些原因斷開,例如:機器重啟,長時間沒有數(shù)據(jù)通信而被路由器切斷等等。因此我們可以用程序控制隧道的重新連接,例如一個簡單的循環(huán)或者使用 djb’s daemontools . 不管用哪種方法,重連時都應避免因輸入密碼而卡死程序。關于如何安全的避免輸入密碼的方法,請參考我的 如何實現(xiàn)安全的免密碼ssh登錄 。這里請注意,如果通過其他程序控制隧道連接,應當避免將SSH客戶端放到后臺執(zhí)行,也就是去掉-f參數(shù)。

          保持長時間連接

          有些路由器會把長時間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項可以避免這個問題的發(fā)生,默認情況下它是被開啟的。如果它被關閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啟。

          另一種方法是,去掉-N參數(shù),加入一個定期能產(chǎn)生輸出的命令。例如: top或者vmstat。下面給出一個這種方法的例子:

          ssh -R 2222:localhost:22 123.123.123.123 "vmstat 30"
          檢查隧道狀態(tài)

          有些時候隧道會因為一些原因通信不暢而卡死,例如:由于傳輸數(shù)據(jù)量太大,被路由器帶入stalled狀態(tài)。這種時候,往往SSH客戶端并不退出,而是卡死在那里。一種應對方法是,使用SSH客戶端的ServerAliveInterval和ServerAliveCountMax選項。ServerAliveInterval會在隧道無通信后的一段設置好的時間后發(fā)送一個請求給服務器要求服務器響應。如果服務器在ServerAliveCountMax次請求后都沒能響應,那么SSH客戶端就自動斷開連接并退出,將控制權交給你的監(jiān)控程序。這兩個選項的設置方法分別是在ssh時加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定義。

          如何將端口綁定到外部地址上

          使用上面的方法,映射的端口只能綁定在127.0.0.1這個接口上。也就是說,只能被本機自己訪問到。如何才能讓其他機器訪問這個端口呢?我們可以把這個映射的端口綁定在0.0.0.0的接口上,方法是加上參數(shù)-b 0.0.0.0。同時還需要打開SSH服務器端的一個選項-GatewayPorts。默認情況下它應當是被打開的。如果被關閉的話,可以在/etc/sshd_config中修改GatewayPorts no為GatewayPorts yes來打開它。

          如何尋找中間服務器

          如果你家里使用ADSL上網(wǎng),多半你會比較幸運。一般的ADSL(例如 聯(lián)通 的ADSL)都是有互聯(lián)網(wǎng)地址的。你只需要在家里的路由器上一臺裝有OpenSSH server機器的SSH端口映射出去即可。同時一些提供SSH訪問的虛擬主機也可以用于這一用途。例如: Hostmonser 或者 Dreamhost .

          通過SSH隧道建立SOCKS服務器
          如果我們需要借助一臺中間服務器訪問很多資源,一個個映射顯然不是高明的辦法(事實上,高明確實沒有用這個方法)。幸好,SSH客戶端為我們提供了通過SSH隧道建立SOCKS服務器的功能。

          通過下面的命令我們可以建立一個通過123.123.123.123的SOCKS服務器。

          ssh -N -f -D 1080 123.123.123 # 將端口綁定在127.0.0.1上
          ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 將端口綁定在0.0.0.0上
          通過SSH建立的SOCKS服務器使用的是SOCKS5協(xié)議,在為應用程序設置SOCKS代理的時候要特別注意。

          總結
          至此,我們已經(jīng)對如何利用SSH隧道有一個基本的認識了。現(xiàn)在,文章開始時的那些問題應該迎刃而解了吧。這里要特別說一下,由于SSH隧道也使用了SSH加密協(xié)議,因此是不會被防火墻上的內(nèi)容過濾器監(jiān)控到的。也就是說一切在隧道中傳輸?shù)臄?shù)據(jù)都是被加密的。當然,離開隧道后的數(shù)據(jù)還是會保持自己原有的樣子,沒有加密的數(shù)據(jù)還是會被后續(xù)的路由設備監(jiān)控到。
          posted on 2013-04-11 09:51 Eric_jiang 閱讀(552) 評論(1)  編輯  收藏 所屬分類: 網(wǎng)絡資源

          Feedback

          # re: 什么是SSH隧道 2013-05-01 21:03 Eric_jiang
          http://my.tv.sohu.com/us/157265245/55317671.shtml  回復  更多評論
            

          主站蜘蛛池模板: 黔东| 清镇市| 南投市| 西吉县| 达孜县| 桂平市| 临汾市| 左贡县| 沁水县| 南宁市| 逊克县| 洪泽县| 长丰县| 合肥市| 建平县| 太和县| 政和县| 德庆县| 威信县| 衡山县| 开平市| 台山市| 泽州县| 禄丰县| 高青县| 博客| 西昌市| 泗洪县| 沙坪坝区| 隆子县| 石狮市| 武定县| 天祝| 绥滨县| 北海市| 龙州县| 海晏县| 大石桥市| 宁海县| 太仓市| 遂昌县|