http隧道技术可以用来突破防火墙,一般防火墙不会封锁80端口,通过把数据包封装在http协议中,就可以实现穿越。具体原理:防火墙两端的数据包封装在防火墙所允许通过的数据包类型或是端口上,然后穿过防火墙与对端通讯,当封装的数据包到达目的地时,再将数据包还原,并将还原后的数据包交送到相应的服务进程上。
举例如下:
A 主机系统在防火墙之后,受防火墙保护。防火墙配置的访问控制原则是只允许80端口的数据进出,屏蔽了其他的所有端口. B主机系统在防火墙之外,是开放的。 现在假设需要
从 A 系统Telnet到B系统上去,怎么办?
使用正常的Telnet肯定是不可能了,但我们知道可用的只有80端口,那么这个时候使用http Tunnel,就是一个好的办法。思路如下: 在A 机器上运行一个 Tunnel 的Client端,
让它侦听本机的一个不被使用的任意指定端口(Port>1024 and port < 65535),如1234. 同时将来自1234端口上的数据导向到远端(B机)的80端口上(注意,是80端口,防火墙允许
通过),然后在B机上运行一个tunnel Server,同样在80端口上监听,然后把 80 端口上接收到的数据 (数据由 tunnel client传来)转到本机的 Telnet 服务端口23,这样就ok了。
根据刚才的设置, 数据流程大概是:
[telnet.exe:任意端口] ---> [tunnel client.exe:1234] ---->[Firewall]---->[tunnel server.exe:80]---->[telnet Server.exe:23]
说明:
telnet.exe 和 tunnel client.exe 是在同一个机器上的.
tunnel server.exe 和 telnet Server.exe 是在同一台机器上的.
按照流程图:
telnet.exe: 把发送的数据转向到 tunnel client.exe 的 1234 端口
tunnel client.exe 把数据发送给 tunnuel server.exe:80 ( 这次连接外网机器的80端口了, 防火墙应该是没有异议吧 )
Friewall 只允许 80 端口的数据进出.
tunnel server.exe 负责把接收到的数据转发给 telnet 的服务进程, 并可以接收 telnet 服务进程的数据
telnet Server.exe 把要发送的数据转给 tunnel server.exe,由它把数据经 80 端口发给 tunnel client.exe.
协议指定了一个 CONNECT 请求方法. Client 可以使用这个方法通知 Proxy Server 连接指定的服务器IP和端口号. Proxy Server
在接收到这个请求后与指定的服务器IP和端口号建立连接,如果连接失败会通知 Client 并关闭连接,成功则给 Client 发送
"Coonection Established" 并保持连接. 在与 Client 和 Real Server 建立连接后,Proxy Server 就不关心数据的内容了,此时就表现为 tunnel 了.
[Client]----[FireWall]------>[Proxy Server:80]------->[Real Server]
| | | |
Src 只允许80端口数据通过 数据转发 Dest
相关协议:
在 Client一端, 我们只对 CONNECT 方法感兴趣. 在 Client 和 ProxyServer 建立连接后, Client 必须发送 CONNECT 请求.
格式如下:
CONNECT <destination_address>:<destination_port> <http_version><CR><LF>
<header_line><CR><LF>
<header_line><CR><LF>
...
<header_line><CR><LF>
<CR><LF>
Proxy Server 处理来自 Client 的请求, 然后和 destionation_address:destination_port 建立连接.
proxy server 给 Client 返回 HTTP 回应.
格式如下:
<http_version> <code> <message><CR><LF>
<header_line><CR><LF>
<header_line><CR><LF>
...
<header_line><CR><LF>
<CR><LF>
如果 Proxy Server 分析 Client 请求格式有误或者与 destionation_address:destination_port 连接失败,都会关闭连接.
如果成功则可以转发数据, 作为 tunnel 使用. |