<strike id="uc6q2"><menu id="uc6q2"></menu></strike>
  • <strike id="uc6q2"></strike>
  • <strike id="uc6q2"></strike>
  • http tunnel 原理 及 穿透防火墻方法

    2012年01月13日    點(diǎn)擊數(shù): 31757    字體:           一鍵關(guān)注匯訊

    http tunnel 原理穿透防火墻方法-1

    tunnel很多文章解釋為"隧道", "通道".

    這里所謂的tunnel 是指一種繞過(guò)防火墻端口屏蔽的通訊方式, 可以有效地解決防火墻對(duì)端口的屏蔽作用.

    原理:
    防火墻兩端的數(shù)據(jù)包封裝在防火墻所允許通過(guò)的數(shù)據(jù)包類(lèi)型或是端口上,然后穿過(guò)防火墻與對(duì)端通訊,當(dāng)封裝的數(shù)據(jù)包到達(dá)目的地時(shí),再將數(shù)據(jù)包還原,并將還原后的數(shù)據(jù)包交送到相應(yīng)的服務(wù)進(jìn)程上。 

    舉例如下:
    A 主機(jī)系統(tǒng)在防火墻之后,受防火墻保護(hù)。防火墻配置的訪問(wèn)控制原則是只允許80端口的數(shù)據(jù)進(jìn)出,屏蔽了其他的所有端口.  B主機(jī)系統(tǒng)在防火墻之外,是開(kāi)放的。現(xiàn)在假設(shè)需要從A 系統(tǒng)Telnet到B系統(tǒng)上去,怎么辦?
    使用正常的Telnet肯定是不可能了,但我們知道可用的只有80端口,那么這個(gè)時(shí)候使用http Tunnel,就是一個(gè)好的辦法。思路如下:  在A 機(jī)器上運(yùn)行一個(gè)Tunnel 的Client端,讓它偵聽(tīng)本機(jī)的一個(gè)不被使用的任意指定端口(Port>1024 and port < 65535),如1234. 同時(shí)將來(lái)自1234端口上的數(shù)據(jù)導(dǎo)向到遠(yuǎn)端(B機(jī))的80端口上(注意,是80端口,防火墻允許通過(guò)),然后在B機(jī)上運(yùn)行一個(gè)tunnel Server,同樣在80端口上監(jiān)聽(tīng),然后把80 端口上接收到的數(shù)據(jù)(數(shù)據(jù)由tunnel client傳來(lái))轉(zhuǎn)到本機(jī)的Telnet 服務(wù)端口23,這樣就ok了。

    根據(jù)剛才的設(shè)置, 數(shù)據(jù)流程大概是:

    [telnet.exe:任意端口] ---> [tunnel client.exe:1234] ---->[Firewall]---->[tunnel server.exe:80]---->[telnet Server.exe:23]

    說(shuō)明:
    telnet.exe 和tunnel client.exe 是在同一個(gè)機(jī)器上的.
    tunnel server.exe 和telnet Server.exe 是在同一臺(tái)機(jī)器上的.

    按照流程圖:
    telnet.exe:           把發(fā)送的數(shù)據(jù)轉(zhuǎn)向到tunnel client.exe 的1234 端口
    tunnel client.exe     把數(shù)據(jù)發(fā)送給tunnuel server.exe:80 ( 這次連接外網(wǎng)機(jī)器的80端口了, 防火墻應(yīng)該是沒(méi)有異議吧)
    Friewall              只允許80 端口的數(shù)據(jù)進(jìn)出.
    tunnel server.exe     負(fù)責(zé)把接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給telnet 的服務(wù)進(jìn)程, 并可以接收telnet 服務(wù)進(jìn)程的數(shù)據(jù)
    telnet Server.exe     把要發(fā)送的數(shù)據(jù)轉(zhuǎn)給tunnel server.exe,由它把數(shù)據(jù)經(jīng)80 端口發(fā)給tunnel client.exe.

    HTTP Tunnel原理穿透防火墻方法-2

    這篇文章提供一個(gè)通過(guò)代理服務(wù)器建立TCP 連接來(lái)繞過(guò)防火墻的方法.
    通常情況下防火墻限制了很多端口的連接,但是HTTP 的連接還是允許的(否則誰(shuí)也上不了網(wǎng))。


    協(xié)議指定了一個(gè)  CONNECT 請(qǐng)求方法. Client 可以使用這個(gè)方法通知Proxy Server 連接指定的服務(wù)器IP和端口號(hào). Proxy Server
    在接收到這個(gè)請(qǐng)求后與指定的服務(wù)器IP和端口號(hào)建立連接,如果連接失敗會(huì)通知Client 并關(guān)閉連接,成功則給Client 發(fā)送
    "Coonection Established" 并保持連接. 在與Client 和Real Server 建立連接后,Proxy Server 就不關(guān)心數(shù)據(jù)的內(nèi)容了,此時(shí)就表現(xiàn)為tunnel 了.

    [Client]----[FireWall]------>[Proxy Server:80]------->[Real Server]
       |            |               |                           |  
      Src   只允許80端口數(shù)據(jù)通過(guò)   數(shù)據(jù)轉(zhuǎn)發(fā)                       Dest


    相關(guān)協(xié)議:

    在Client一端, 我們只對(duì)CONNECT 方法感興趣.  在Client 和ProxyServer 建立連接后, Client 必須發(fā)送CONNECT 請(qǐng)求.
    格式如下:

    CONNECT :


    ...


    Proxy Server 處理來(lái)自Client 的請(qǐng)求, 然后和destionation_address:destination_port 建立連接.


    proxy server 給Client 返回HTTP 回應(yīng).
    格式如下:



    ...

    如果Proxy Server 分析Client 請(qǐng)求格式有誤或者與destionation_address:destination_port 連接失敗,都會(huì)關(guān)閉連接.
    如果成功則可以轉(zhuǎn)發(fā)數(shù)據(jù), 作為tunnel 使用.

     

     

     

     

    HTTP隧道(HTTP代理Socket客戶)

     

    HTTP 隧道(HTTP代理Socket客戶)

    環(huán)境: VC6

    mr ans


    ※HTTP 隧道※
    --------
    HTTP是基于文本的通過(guò)瀏覽器檢索網(wǎng)頁(yè)的協(xié)議。大多數(shù)情況下你躲在代理服務(wù)器的后面,通過(guò)LAN接入互聯(lián)網(wǎng)。在IE的Connection Option中,你給出你的LAN的設(shè)置。這個(gè)代理服務(wù)器運(yùn)行著基于文本的協(xié)議,你從它那里可以得到外界的網(wǎng)絡(luò)HTTP相關(guān)的數(shù)據(jù)。是的,用HTTP通過(guò)它上面的小的望孔可以連接到外部世界,并用二進(jìn)制協(xié)議得到你想要的數(shù)據(jù),或者甚至是你的協(xié)議。它通過(guò)HTTP。

    字串8

    ※HTTPS 解釋※
    ---------
    在HTTPS中,數(shù)據(jù)以一種安全的方式從瀏覽器到服務(wù)器和從服務(wù)器到瀏覽器。它是二進(jìn)制的協(xié)議;當(dāng)他穿過(guò)代理時(shí),代理不知道是什么。代理僅僅允許二進(jìn)制流打開(kāi),讓服務(wù)器和客戶兩者之間交換數(shù)據(jù)。代理服務(wù)器認(rèn)為我們?cè)谶M(jìn)行某個(gè)安全的會(huì)話。

    字串9


    對(duì)于HTTPS, 你的瀏覽器連接到代理服務(wù)器,并送出一個(gè)命令字串9

    CONNECT neurospeech.com:443 HTTP/1.0
    HOST neurospeech.com:443
       【...如果需要,HTTP頭部的其它行以結(jié)束】
        // 最后的空行mr ans


    接下來(lái),代理服務(wù)器把它作為某個(gè)HTTP安全會(huì)話,打開(kāi)一個(gè)到需求服務(wù)器和端口的二進(jìn)制流。如果連接確立,代理服務(wù)器返回如下回應(yīng):m r a n s


    HTTP/1.0 200 Connection Established
             【...忽略所有HTTP頭部的其它行以結(jié)束,】
        // 最后的空行

    字串7

    現(xiàn)在,瀏覽器連接到了終端服務(wù)器,可以用二進(jìn)制和安全的方式交換數(shù)據(jù)了。字串8


    ※怎樣做這個(gè)※
    -------------
    現(xiàn)在是你的程序任務(wù)去愚弄代理服務(wù)器,行為如IE一樣進(jìn)行Secure HTTP。mr ans

    1. Connect to Proxy Server first.
    2. Issue CONNECT Host:Port HTTP/1.1.
    3. Issue .
    4. Wait for a line of response. If it contains HTTP/1.X 200 , the connection is successful.
    5. Read further lines of response until you receive an empty line.
    6. Now, you are connected to outside world through a proxy. Do any data exchange you want.

    mrans


    示例源代碼www.mrans.com

      // You need to connect to mail.yahoo.com on port 25
      // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
      // CSocketClient is Socket wrapping class
      // When you apply operator << on CString, it writes CString
      // To Socket ending with CRLF
      // When you apply operator >> on CString, it receives
      // a Line of response from socket until CRLF mrans


      try
      {
        CString Request,Response;
        CSocketClient Client;

    字串8

        Client.ConnectTo("192.0.1.1",4480);

    字串8

        // Issue CONNECT Command
        Request = "CONNECT mail.yahoo.com:25 HTTP/1.0";
        Client<

    字串6

        // Issue empty line
        Request = "";
        Client<

        // Receive Response From Server
        Client>>Response;

    m r a n s

        // Ignore HTTP Version

    字串7

        int n = Response.Find(' ');
        Response = Response.Mid(n+1); mr ans

        // Http Response Must be 200 only
        if(Response.Left(3)!="200")
        {
          // Connection refused from HTTP Proxy Server
          AfxMessageBox(Response);
        }

    字串7


        // Read Response Lines until you receive an empty line.
        do
        {
          Client>>Response;
          if (Response.IsEmpty())
            break;
        }while (true);

    字串6


        // Coooooooool.... Now connected to mail.yahoo.com:25
        // Do further SMTP Protocol here.. mrans.com

      }
      catch (CSocketException * pE)
      {
        pE->ReportError();
      }

    mrans.com

      字串6

    ※庫(kù)源碼※
    -------------
    文件Dns.h包含所有所有DNS相關(guān)的源代碼。它利用了其它的庫(kù),如SocketEx.h, SocketClient.h, 和NeuroBuffer.h 字串6


    ※CSocketEx※
    -------------

    字串6

    作為一個(gè)Socket功能的包裹(wapper)類(lèi)。(如果你不是確切知道CSocket怎樣工作的,它是非常笨重和不可信的)所有的函數(shù)根CSocket同名。你可以直接應(yīng)用這個(gè)類(lèi)

    字串8

    ※CSocketClient※
    -----------------

    mrans.com

    派生自CSocketEx,并且根據(jù)詳細(xì)的Winsock錯(cuò)誤拋出適當(dāng)?shù)乩猓╡xceptions). 為了方便的發(fā)送和接收,它定義了兩個(gè)操作符, >> 和<<;如果需要它也交換網(wǎng)絡(luò)序?yàn)橹鳈C(jī)序和主機(jī)序?yàn)榫W(wǎng)絡(luò)序。字串8


    ※CHttpProxySocketClient※
    ----------------- www.mrans.com

    派生自CSocketClient, 你可以調(diào)用SetProxySettings(ProxyServer, Port) 方法和做代理設(shè)置。接下來(lái),你可以連接到你想要的主機(jī)和端口。ConnnectTo 方法被覆蓋,它自動(dòng)的實(shí)現(xiàn)了HTTP代理協(xié)議并無(wú)爭(zhēng)論的給你了一個(gè)連接。

    字串6

     

    字串8

    ※怎樣利用CHttpProxySocketClient※
    ---------------------------------
      // e.g. You need to connect to mail.yahoo.com on port 25
      // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
      // CSocketClient is Socket wrapping class
      // When you apply operator << on CString, it writes CString
      // To Socket ending with CRLF
      // When you apply operator >> on CString, it receives
      // Line of response from socket until CRLF
      try
      {
        CHttpProxySocketClient Client;

    字串9

        Client.SetProxySettings("192.0.1.1",1979);

    m r a n s

        // Connect to server mail.yahoo.com on port 25
        Client.ConnectTo("mail.yahoo.com",25);

    m r a n s

        // You now have access to mail.yahoo.com on port 25
        // If you do not call SetProxySettings, then
        // you are connected to mail.yahoo.com directly if
        // you have direct access, so always use
        // CHttpProxySocketClient and no need to do any
        // extra coding. 字串8

      }
      catch(CSocketException * pE) {
        pE->ReportError();
      } 字串7

     

     

     

     

     

     

     

     

     

     

    上一篇:P2P技術(shù)

    下一篇:HttpTunnel工作原理及源程序分析

    Copyright ? 2007-2021 匯訊Wiseuc. 粵ICP備10013541號(hào)    
    展開(kāi)
    国产午夜亚洲精品不卡电影| 亚洲精品中文字幕无码A片老| 久久久久无码精品| 国产日韩精品一区二区在线观看 | 精品日韩一区二区三区视频| 精品欧洲av无码一区二区| 亚洲国产成人久久精品影视| 久久国产精品99久久久久久老狼 | 亚洲精品白色在线发布| 99热在线精品播放| 青青青国产精品一区二区| 久久精品无码精品免费专区| 久久青青草原国产精品免费| 亚洲线精品一区二区三区影音先锋| 久久精品国产只有精品66| 国产精品人成在线观看| 亚洲精品国产福利一二区| 精品国偷自产在线不卡短视频| jizz中国jizz欧洲/日韩在线| 中文字幕日韩理论在线| 日韩一区二区三区视频| 国产日韩在线视看高清视频手机| 国产乱码一二三区精品| 国产产在线精品亚洲AAVV| 国产四虎精品8848hh| 日韩有码一区二区| 日韩免费视频一区二区| 日韩精品久久久久久| 亚洲日韩国产二区无码| 国产日韩美国成人| 亚洲精品国产精品乱码不卞| 国产精品无码永久免费888| 精品人妻无码专区中文字幕| 久久久91人妻无码精品蜜桃HD | 亚洲国产成人精品无码区二本 | 日韩三级电影视频| 牛牛在线精品免费视频观看| 一级一级特黄女人精品毛片| 国产成人无码精品一区在线观看| 精品精品国产理论在线观看| 在线精品亚洲一区二区三区|