由于众所周知的原因,在中国“翻墙”是网民的必杀技。就翻墙而言,有各种各样的方案,大部分方案未必是安全的方案,而安全的方案未必是免费的。就算有即安全又免费的方案(比如:“自×由×门”,“无×界”),由于其广泛利用,必然会遭到定点封锁,从而导致其不可靠。
就普通的HTTP代理方案而言,无论是HTTP代理还是HTTPS代理(加密的),其实都不是安全的方案。因为HTTPS的加密仅仅是 对传输的内容进行加密,而代理访问的目标网址的传输暴露在外面。仅仅对目标网址进行判断就可以使之“撞墙”。非加密HTTP代理就更不安全了。
为此需要对HTTP代理方式进行改造来保证其安全性,首先在“墙内”的本地电脑中设置一个本地HTTP代理客户端,在”墙外”电脑中设置远程HTTP代理服务端 。
其次,“本地HTTP代理”和“远程HTTP代理”之间交换的数据采用“准加密的压缩包”方式进行传输。“准加密的压缩包”指的是:将包括网 址,内容等相关HTTP数据打包压缩后,然后对压缩包头16个字节进行3DES加密。由于是压缩包的部分加密,故我称之为“准加密压缩包”。之所以采用 “准加密”的方式是出于性能的考虑。 我认为(不知是否正确?):头16个字节进行3DES加密的压缩包是无法破解的。这样就解决了由于网址暴露而导致的 不完全性。
其实,上述方案(我称之为“客户端式HTTP代理”)就是“自×由×门”,“无×界”采用的方案,但由于“自×由×门/“无×界”的通用性而导致其不可靠性(会被定点封锁)。
于是我认为,越是个性化的翻墙方式越不可能会被定点封锁。goagent这款代理是一个很好切入点,其远程HTTP代理服务端(fetch.py)搭建在GoogleAppEngine上(免费的),本地HTTP代理就是一个python程序:proxy.py.
from http://blog.chaoskey.com/2012/02/21/201202212226
就普通的HTTP代理方案而言,无论是HTTP代理还是HTTPS代理(加密的),其实都不是安全的方案。因为HTTPS的加密仅仅是 对传输的内容进行加密,而代理访问的目标网址的传输暴露在外面。仅仅对目标网址进行判断就可以使之“撞墙”。非加密HTTP代理就更不安全了。
为此需要对HTTP代理方式进行改造来保证其安全性,首先在“墙内”的本地电脑中设置一个本地HTTP代理客户端,在”墙外”电脑中设置远程HTTP代理服务端 。
其次,“本地HTTP代理”和“远程HTTP代理”之间交换的数据采用“准加密的压缩包”方式进行传输。“准加密的压缩包”指的是:将包括网 址,内容等相关HTTP数据打包压缩后,然后对压缩包头16个字节进行3DES加密。由于是压缩包的部分加密,故我称之为“准加密压缩包”。之所以采用 “准加密”的方式是出于性能的考虑。 我认为(不知是否正确?):头16个字节进行3DES加密的压缩包是无法破解的。这样就解决了由于网址暴露而导致的 不完全性。
其实,上述方案(我称之为“客户端式HTTP代理”)就是“自×由×门”,“无×界”采用的方案,但由于“自×由×门/“无×界”的通用性而导致其不可靠性(会被定点封锁)。
于是我认为,越是个性化的翻墙方式越不可能会被定点封锁。goagent这款代理是一个很好切入点,其远程HTTP代理服务端(fetch.py)搭建在GoogleAppEngine上(免费的),本地HTTP代理就是一个python程序:proxy.py.
http://code.google.com/p/goagent/我们可以对goagent这款客户端式代理进行改造,获得一个个性化安全的翻墙工具。(注:goagent交换的数据压缩包没有加密,也就不是完全安全的)。考虑到我的翻墙安全,我就不把改造后的程序公布了。仅仅介绍一下我对goagent做了哪些改造。
https://github.com/phus/goagent
1)远程HTTP代理服务端: 用Google Go语言重新开发了,部署在GAE上,然后绑定到一个特定域名上。最后,你们可能会失望了,我并没有给你提供了一个拿来即用的程序,仅仅是给你一个方法。这是因为如果具体程序一旦扩散开来,最终会遇到被定点封 锁的命运。GAE已经被拦在“墙外”,本人是通过特殊方式绕过了拦截,一旦扩散开来会影响到我的使用。基于我的私心,就不公布具体程序:)
2)本地和远程代理间的数据交换:采用了前述的“准加密压缩包”的形式进行传输。
3)本地HTTP代理服务端: 本想用Google Go语言重新开发,但目前Go开发的程序还不能运行在Window操作系统下,故还是使用proxy.py。但是删除了大量代码,专注于通过远程GAE的代理。
4)保留了本地HTTPS劫持功能:在本地HTTP代理中自动伪造HTTPS证书,将用户的HTTPS请求进行劫持解密,然后按HTTP数据的“准加密压缩包”的方式传输。
5)将proxy.py原本单线程的运行模式改造成多线程的运行模式。
from http://blog.chaoskey.com/2012/02/21/201202212226
No comments:
Post a Comment