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工作原理及源程序分析