2015年10月11日星期日

TOR与GFW的PK(1) ——MEEK,让Tor复活的英雄!

TOR与GFW的PK(1)
                          ——MEEK,让Tor复活的英雄!

最近对于我们翻墙党来说最好的消息就是TOR复活了。从2010年开始,GFW逐渐把绝大部分TOR中继节点和目录服务器的IP都列入了黑名单,导致TOR无法在墙内独立联网,只能靠网桥,但不少网桥IP也被GFW加入了黑名单,导致这几年TOR的翻墙效果一直都不好。

不过最近出的meek插件和obfs4网桥又成功让TOR复活了,除了这两种,TOR团队还开发了几种流量混淆插件:FlashProxy,FTE(Format-Transforming Encryption,格式转换加密),FTE-IPv6,ScrambleSuit,还有几种停止开发了。

obfs4我已经介绍过了[1],这次我具体说说MEEK,在以后的系列里具体介绍一下其他插件。

先插一件事:我一直在强调当使用TOR+前置代理时,前置代理看到的是强加密的TOR流量,但有些人就想到了一个问题:从前置代理服务器到出口节点,自然是强加密的TOR流量(此时可以把前置代理服务器理解为本机,入口节点只知道代理服务器的IP地址),但从本机到代理服务器的这段路呢?是不是只有翻墙工具提供的加密处理,而对于代理服务器而言能看到明文呢?

答案是:不是,从本机到代理服务器的这段路也是强加密的TOR流量。

这里要引入一个概念:”原生支持HTTPS“。我曾经多次提过不原生支持HTTPS的翻墙工具(如goagent)无法成为TOR的前置代理,为什么呢?

所谓”原生支持HTTPS“简单来说就是当单独使用某一翻墙工具时,你可以直接连接到被墙的HTTPS网站而不用对操作系统做任何改动。对,像goagent那样要导入自己的数字证书就是在对操作系统进行改动(关于这一点,我会在接下来分析各翻墙手段原理及安全性时进行详细说明)。
或者说连接到HTTPS网站时,从本机到目标网站服务器都是TLS强加密[2](我用流程图说明一下这段过程)

对于原生支持HTTPS的翻墙软件来说,在连接HTTPS网站时远程服务器只知道用户连接了哪个网站以及真实IP(一重代理),而完全不知道传输内容(关于这一点,我以后会具体说明其中的原理,现在只要知道这个结论就行了)。

那么TOR+前置代理时情况也是一样的,TOR从设计上就保证了从本机到出口节点都是HTTPS强加密,中间不会有任何解密过程,自然远程服务器也不会知道你的传输内容(前提是翻墙工具要支持原生HTTPS,所以不支持原生HTTPS的GAE类翻墙工具无法成为TOR的前置代理)。


明白了这些,就可以开始说MEEK了。MEEK的原理是将TOR流量伪装成普通的云计算流量从而骗过GFW,成功翻墙。
具体来说就是这样一个过程:本机上的TOR客户端与云计算平台服务器进行通信(GAE,amazon,azure),再与MEEK SERVER进行通信,再先与目录服务器通信获得中继节点信息再连接到入口节点,搭建TOR环路(我在下面给出原理图)。这一段路也是原生支持HTTPS的(TOR自带的流量混淆插件都原生支持HTTPS),而且直到出口节点,你的数据都是被TLS强加密着的,如果目标网站支持HTTPS,还会一直强加密到目标网站服务器为止,除非进行中间人攻击,否则没人知道你干了什么。

MEEK高明的地方就在于GFW无法区分被混淆过的TOR流量和普通云计算流量,但又不敢封杀云计算IP,因为不少墙内公司都依赖这些云计算服务,贸然封封锁会造成严重的经济损失。

(不过事实上已经封杀了GAE,但有解决方案:
1,从这里https://gitweb.torproject.org/pluggable-transports/meek.git/tree/HEAD:/appengine下载app,然后修改google ID(就像修改goagent的proxy.ini一样),然后像goagent一样的方法上传[3]。
2,在https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go下载go_appengine与python,然后修改app.yaml中的google id号(替换里面的“meek-reflect”),然后再上传(运行go_appengine/goapp deploy)。可以像goagent一样上传多个,反正每个ID就1G的流量。
3,最后修改torrc文件,写上: UseBridges 1
 Bridge meek 0.0.2.0:1 url=https://yourapphere.appspot.com/front=www.google.com
ClientTransportPlugin meek exec ./meek-client --log meek-client.log申请GAE账号是需要手机号的,不过可以绕过[4]

*或者可以直接修改host填上可用的google IP,meek-google就复活了。*)

其他两种meek插件(amazon和azura)分别依赖于amazon和微软的云平台,也是可以自行搭建后给自己用的,不过操作复杂不适合小白,有兴趣的技术党可以看这里[5],里面描述了搭建过程,可以自己试试。

下一篇我会讲讲ScrambleSuit,obfs4和ScrambleSuit的原理有相通之处,诸位就把下一篇当成对于这篇[6]的补充好了。

补充说明:后来Tor开发者又专门叙述了如何应对MEEK被屏蔽,请看https://plus.google.com/109790703964908675921/posts/26zCmDmjYXP

最后照例附上科普文链接集合:https://plus.google.com/u/0/109790703964908675921/about

参考资料:
1,TOR网桥,主动探测攻击和烧钱的GFW
https://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP
2,SSL/TLS的原理以及互联网究竟是如何工作的(3)
                                    ————TLS的专场!
https://plus.google.com/109790703964908675921/posts/NwWoGQ9mcDY 
3,http://allinfa.com/goagent-v322-gae.html
4,http://blog.sina.com.cn/s/blog_4c451e0e01018rdx.html
5,MEEK设计文档https://trac.torproject.org/projects/tor/wiki/doc/meek#Distinguishability
6,TOR网桥,主动探测攻击和烧钱的GFW
https://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP

没有评论:

发表评论