HTTP Tunnel使用的幾種使用(經典)
基本概念不多解釋了,直入主題。GNU HTTP Tunnel (http://www.nocrew.org/software/httptunnel.html)是一個開源的http-tunnel專案,包括了tunnel server(hts命令)和tunnel client(htc命令),有(x)nix和windows版本。我們就用它來建立自己的tunnel。
1。靜態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將資料打包成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。動態的tunnel。
上面建立了一條可以訪問POP3服務的隧道,但缺點是隻能訪問某一個指定的POP3伺服器,要訪問其他的伺服器還得按同樣的方法再建立一條隧道,很不方 便。既然hts可以將連線forward給POP3伺服器,那讓它forward給一個SOCKS5服務,不是就可以實現動態的tunnel,可以連線任 意服務了嗎?yeah!沒錯!我們建立這樣的連線:
htc ------------> http proxy ------------------------> hts ------------------------------> SOCKS5 serve
(localhost:8888) (proxyhost:3128) (tunnelserver:80) (socks5server:1080)
命令就不說了,照第一點改一下就行。這樣就相當於在localhost:8888運行了一個SOCKS5服務,設定一下你的網路程式(Outlook,NetAnt,FlashGet,QQ......),讓他們通過SOCK5訪問網路,就OK了。
3。利用http proxy的CONNECT支援。
大多數http proxy支援CONNECT命令,但一般只支援CONNECT到外部伺服器的443(https)埠。這是為了允許訪問外部的https服務。由於 porxy對於CONNECT的連線是直接轉發,不做任何分析處理或快取,所以利用CONNECT可以獲得比較快的速度。
由於hts和htc不支援CONNECT連線,我們可以使用另一個專門支援CONNECT的程式DesProxy
來建立一個tunnel。由於使用CONNECT建立了直接的TCP連線,不需要將資料按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的資料連線是加密的,保證了資料的安全。使用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已經在localhost:8888偵聽了,這是一個SOCKS5服務,下面改怎麼用,就不用我羅嗦了吧:-)。另外在 "SSH"頁,可以根據要求選擇"Protocol options"。儲存session後,也可以用命令列的plink命令來利用這個session:
plink -load session_name (session_name就是session儲存的名稱)
登陸後效果也一樣。