Fox Project 跳墙原理
首先声明,我很白菜很青菜。接着声明,我不是很愿意花时间来想这些东西,但因为我需要国外的教学视频,迫于无奈。最后声明,以下内容纯属无理取闹,可能会 浪费你的宝贵时间。
曾经有一天,我学着气泡熊大牛,编写了一个proxy程序,据说能够翻X墙,因为数据在传输过程中进行了编码。之所以说编码而不是说加密是因为仅仅对数据 进行了一次XOR。不过这样已经能够使原原本本的一个HTTP文本变成一堆乱码了,于是躲过了g。f。w的眼睛。这个proxy写得很成功,翻得很顺利, 没有什么网页不能打开的。但是速度有限。后来,我换了洛杉矶的服务器之后,速度提升了很多,我用移动的无线网络能够在线看Yale大学的物理教学视频,那 段时间真爽!但好景不长,我最终抛弃了洛杉矶的服务器,因为稳定性太差了。
曾经有一次,我使用校园网无法访问博客,于是向一个网友临时接了一个Linux服务器账号作SSH代理。当时,我惊奇的发现,通过他的代理,访问我博客居 然下载速度有2-3MB/s,神奇!
不久之后,我更换了硅谷的服务器,速度真的传说中的慢,ping有时候300~400ms以上,丢包也很严重!!!
而且,悲剧的是,我直接连接服务器下载东西的平均速度为10kb/s,上传还好一些,有200kb/s以上,反差太大了吧!
又曾经有一次,我使用校园网上博客的时候用了一个移动的代理,突然发现访问速度比以前提升了很多,下载东西也有300kb/s了(教育网1.2mb /s)。当时我灵光一闪,这么快的速度,能不能充分利用一下呢?!就这样,Fox Project开始策划了~~
首先,需要使用到一个国内代理服务器作为中转数据。能够达到高速访问的条件是:
1、用户电脑和国内代理服务器有很好的传输速度。
2、国内代理服务器与国外服务器都有很好的数据传输速度。
因为带有敏感词的HTTP头肯定是不能够通过墙的。另外,透露一下,墙目前是不检查响应HTTP头里的内容!要让数据顺利通过国内代理服务器的话,不需要 把敏感词隐藏起来。如何隐藏起来呢?如果HTTP头不完整,国内代理服务器肯定是不会受理而返回Bad Request或者其它错误信息。这里我当时想到一个解决办法,因为墙的敏感词检查仅限于HTTP头,HTTP的数据内容永远也不会检查到,所以我可以给 发送过去的数据加壳(再加一个HTTP头)。这样国内代理服务器就帮忙传输这个合法的HTTP数据了。而墙把守边境的时候只判断你的脸型来确认你是不是在 黑名单里,当你戴上一个面具之后,墙就不认得了。因为它不可能会把你的面具拆下来检查,这样会很麻烦,负担很重。想一下,仅检查头部就动用了超级电脑曙光 4000L,已经没有再大的能力再进行内部详细检查。
好了,你大概已经知道我想说什么了,你也许会发笑,如此简单,我也觉得!也许会嘲笑,我早就想到了,那算我倒霉了。。。
如图所示,根据此工作原理,一般需要在用户PC上安装一个客户端(Fox2 client)用来进行HTTP加壳脱壳,在国外的服务器上也需要一个这样的软件。下面,说一下我现在写的工具的工作流程。
1、在本地运行Fox2 Client,监听本地1998端口(为什么叫1998?问气泡熊)。本地浏览器设置代理服务器为127.0.0.1:1998。
2、用浏览器访问呢页面时,向Fox2 Client发送了一个HTTP请求。然后Fox2 Client收到所有HTTP数据后,可以对数据进行加密也可以不加密,然后给它加壳,封装一个POST HTTP头。接着把这个头和HTTP数据先后发送到一个国内的代理服务器。
3、国内代理服务器受理该HTTP请求,并把该请求稍加装饰后(例如增加一个Via来说明经过了这个代理服务器)转发给国外服务器。
4、国外服务器上的Fox2 Server接收到此请求的完整数据后,进行脱壳,去掉封装的HTTP头,对HTTP数据体进行解密(如果之前有加密的话),然后把HTTP数据体发送给 一个代理服务器(一般是在和Fox2 Server同一台主机上运行的),代理服务器再转发请求到相应网站,等待相应。
5、代理服务器把响应的数据转发给Fox2 Server,Fox2 Server对这个数据进行和之前一样的加壳,封装一个响应HTTP头。在加壳之前可以选择加密或者不加密。接着把加壳后所有数据发给到国内代理服务器。
6、国内代理服务器收到响应,转发给Fox2 Client。
7、Fox2 Client进行脱壳,对数据体进行解密(如果之前有加密的话)。然后把HTTP数据体发送给浏览器。
8、浏览器收到数据显示到屏幕上,至此整个跳墙过程完成。
一个数据包,经过了那么多个站点,最终才到达目的地,真是个漫长的旅程。这样的效率看似不怎么高,但其实感觉不出来。因为一般情况下,你和国内代理服务器 之间的响应时间都能够在100ms内吧。这样国内代理服务器和国外的服务器响应时间一般也是200ms左右(也有100多的)。加起来也就300多。庆幸 的是,现在大多数的浏览器都会开启多个连接进行请求,在最好的情况下,能够打开整个网站也只在1秒钟内(不考虑DNS,很多站点打开都需要多次访问 DNS)。
PS:我在加壳的过程中对原始数据进行了一次XOR,不是255!主要因为是担心被无聊的人看到传输的内容了:)