| 
基本概念不多解釋了,直入主題。GNU HTTP Tunnel (http://www./software/httptunnel.html)是一個開源的http-tunnel項目,包括了tunnel server(hts命令)和tunnel client(htc命令),有(x)nix和windows版本。我們就用它來建立自己的tunnel。1。靜態(tài)tunnel。
 http-tunnel是一個完全透明的通道,直接將你的連接forward給目標服務端口,因此當你連接tunnel的本地偵聽端口時,就相當于直接連接到目標服務端口。例如你要建立一條可以訪問外部POP3服務器的隧道,可以建立如下連接:
 
 htc  ------------> http proxy ------------------------> hts
------------------------------> POP3 serve
 (localhost:8888)             (proxyhost:3128)       (tunnelserver:80)                           (pop3server:110)
 在你自己的機器上運行htc,外部充當tunnel server的機器上的80端口運行hts,htc將數(shù)據(jù)打包成http請求,通過proxy連接到hts,hts解包后將連接forward給POP3服務器。命令如下:
 在tunnel server機器上:
 hts --forward-port pop3server:110 80
 (將pop3server替換成實際的IP)
 在本地機器上:
 htc --forward-port 8888 --proxy proxyhost:3128 tunnelserver:80
 (將proxyhost和tunnelserver替換成實際的IP)
 
 通過這樣的配置,你可以用Outlook或Foxmail連接本機的8888端口,就相當于直接連接到POP3服務器了。
 
 2。動態(tài)的tunnel。
 上面建立了一條可以訪問POP3服務的隧道,但缺點是只能訪問某一個指定的POP3服務器,要訪問其他的服務器還得按同樣的方法再建立一條隧道,很不方
便。既然hts可以將連接forward給POP3服務器,那讓它forward給一個SOCKS5服務,不是就可以實現(xiàn)動態(tài)的tunnel,可以連接任
意服務了嗎?yeah!沒錯!我們建立這樣的連接:
 
 htc 
------------> http proxy ------------------------> hts
------------------------------> SOCKS5 serve
 (localhost:8888)             (proxyhost:3128)       (tunnelserver:80)                           (socks5server:1080)
 
 命令就不說了,照第一點改一下就行。這樣就相當于在localhost:8888運行了一個SOCKS5服務,設置一下你的網(wǎng)絡程序(Outlook,NetAnt,FlashGet,QQ......),讓他們通過SOCK5訪問網(wǎng)絡,就OK了。
 
 3。利用http proxy的CONNECT支持。
 大多數(shù)http
proxy支持CONNECT命令,但一般只支持CONNECT到外部服務器的443(https)端口。這是為了允許訪問外部的https服務。由于
porxy對于CONNECT的連接是直接轉發(fā),不做任何分析處理或緩存,所以利用CONNECT可以獲得比較快的速度。
 由于hts和htc不支持CONNECT連接,我們可以使用另一個專門支持CONNECT的程序DesProxy  http://desproxy.
 來建立一個tunnel。由于使用CONNECT建立了直接的TCP連接,不需要將數(shù)據(jù)按http格式打包和解包,所以連tunnel server也不需要了,只需要在你原來運行hts機器上運行一個SOCKS5就行了,連接如下:
 
 desproxy  -------------> http proxy ----------------------> SOCKS5 server
 (localhost:8888)           (proxyhost:3128)                    (tunnelserver:443)
 
 desproxy命令的用法:
 desproxy remote_host remote_port proxy_host proxy_port local_port
 在這里remot_host,remote_port就是tunnelserver:443,proxy_host,proxy_port是porxyhost:3128,local_port就是8888。
 
 注意必須把SOCKS5運行在443端口,如果運行在其他端口的話,CONNECT請求會被http proxy拒絕。同樣,我們在localhost:8888得到了一個可以訪問外部的SOCK5服務。
 
 4。最簡單,最安全而且快速的方式:利用SSH + CONNECT。
 實際上SSH提供了SOCKS5的功能,利用ssh客戶端或PuTTY可以在本地建立一個SOCKS5服務,而且PuTTY也直接支持http proxy,最大的好處是ssh的數(shù)據(jù)連接是加密的,保證了數(shù)據(jù)的安全。使用ssh的連接如下:
 PuTTY(或plink) ------------> http  proxy  ---------------------> ssh server
 (localhost:8888)                 (proxyhost:3128)                     (tunnelserver:443->22)
 首先我們要讓ssh
server在443端口偵聽,ssh默認端口是22,我們可以修改ssh的配置,或用iptables將443端口重定向到22端口,服務端的配置就
OK了。然后在PuTTY建立一個new
session,填上ssh服務器的ip和port;在"Connection->Proxy"頁,填上http
proxy的ip和port;在"SSH -> Tunnels"頁,"Source
port"填本地的端口,在這里我們用8888",Destination"選"Dynamic",按"Add"將這個forward
port加上,就OK了。配置完成后,用PuTTY登陸上ssh,用netstat
-an可以看到PuTTY已經(jīng)在localhost:8888偵聽了,這是一個SOCKS5服務,下面改怎么用,就不用我羅嗦了吧:-)。另外在
"SSH"頁,可以根據(jù)要求選擇"Protocol
options"。保存session后,也可以用命令行的plink命令來利用這個session:
 plink -load session_name           (session_name就是session保存的名稱)
 登陸后效果也一樣。
 |