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

Ghost Assassin的TOR与GFW的PK系列文章


Ghost Assassin的TOR与GFW的PK系列文章


TOR网桥,主动探测攻击和烧钱的GFW
随着GFW的不断升级,goagent以及其他基于GAE开发的翻墙软件越来越不好使,自由门和无界还有赛风在很多地方也瘫痪了,VPN的PPTP协议与L2TP协议也不再安全[1](PPTP很容易被 暴力破解,L2TP很容易被干扰成明文),OPENVPN被特征检测搞得半残了,其他手段基本上是要花钱或者进行复杂配置,所以TOR又成了很多人的选择,特别是TOR最新出了MEEK插件和obfs4网桥。
MEEK插件我曾经介绍过[2],这次就来聊聊obfs4网桥究竟有什么特别之处以及GFW是如何屏蔽TOR的。
2011年有中共匪国的TOR用户报告说一个网桥在使用几分钟之后就被GFW屏蔽了[3](当时是obfs2网桥,后来TOR官方正式宣布放弃对obfs2网桥的技术支持),GFW究竟是如何做到的呢?
注意我前面提到的一个词:特征检测。简单来说,很多互联网连接建立时都会有着某些特征(可以想象成他们都是一些有个性的人,打招呼时用的是自己的方式,从而很容易被别人从人堆里认出来),这些特征在一大堆流量里是很容易被认出来的(例如一大堆明文流量里的加密流量就非常显眼,TOR也有一样的问题,所以墙内使用TOR的人越多,诸位TOR用户和我就越安全,请为了自己的安全推广TOR),而GFW就是利用了这一点:众所周知墙内无法直连TOR(不过前段时间有份实验报告中提到在教育网TOR还是可以直连的,有条件的人可以试一下,不过即使是能直连也建议不要直连,因为TOR流量实在是太特别了,一定会成为重点监控对象,最好通过网桥或者前置代理掩盖TOR流量),因为GFW一是把绝大部分中继节点和目录服务器的IP都加入了黑名单(TOR要先与目录服务器连接获取节点信息再与节点连接建立环路,TOR中继的信息都是公开的[4],GFW的走狗们去网站就能把中继节点的IP放到黑名单里了),二是利用特征检测识别出了TOR流量并在TOR请求连接时进行阻断,具体来说就是放过走到墙外的TCP请求流,阻断返回的TCP数据流,这样TOR就无法正常建立连接了。
为了对付封锁,TOR团队就开发出了网桥,不过obfs2网桥依旧是在连接时会表现得很特别[3](具体来说GFW用了DPI(Deep Packet Inspection,深度包检测[5])检测到当一个天朝用户试图连接网桥或中继节点时,TOR客户端会发送一个密码列表进行TLS连接(TLS hello,为了与网桥建立HTTPS连接,TOR连接直到出口节点都是HTTPS强加密连接),这一过程非常独特,只有TOR会这么表现,那么GFW就会意识到这是在与TOR网桥进行通信),GFW意识到这一点后就进行了主动探测攻击(我试着用流程图表示出攻击过程),从而将网桥废掉。
obfs3比起obfs2改进了不少,但依旧可以被GFW用主动探测攻击屏蔽,于是为了应对GFW,obfs4横空出世了[6]。

看看obfs4的配置:Bridge obfs4 178.209.52.110:44367E72FF33D7D41BF11C569646A0A7B4B188340DF cert=Z+cv8z19Qb8RxWlkagp7SxiDQN++b7D2Tntowhf+j4D15/kLuj3EoSSGvuREGPc3h60Ofw iat-mode=0
比起obfs3,后面多了一大堆:“67E72FF33D7D41BF11C569646A0A7B4B188340DF”是建立连接时的验证密码,和后面的证书“cert=Z+cv8z19Qb8RxWlkagp7SxiDQN++b7D2Tntowhf+j4D15/kLuj3EoSSGvuREGPc3h60Ofw”一起建立了一个严格的连接验证机制,这样一来GFW就没办法伪装成TOR客户端与网桥进行连接了,而且也改进了连接时所用的协议,GFW要想进行特征检测很困难。

但其实还有一个问题没有解决:网桥不是公开的,但可以去网站或者通过邮件获取网桥[7],那么,GFW的走狗们也可以这么做,然后把获取到的网桥加入黑名单,从而使得诸位找网桥变得困难。

关于如何解决这一点我有一个想法:网桥中继也许可以采取像自由门一样的动态IP技术(很多人以为自由门就是简单的连接代理服务器然后翻墙,但如果就是如此,那么自由门早就废掉了,我打开资源监视器之后发现自由门同时与不少IP进行连接,而且不断在变动,还与两个后面相同的域名一直连接着:111-252-81-24.dynamic.hinet.net61-230-111-251.dynamic.hinet.net,我打不开这两个域名对应的网页,但应该是动态网公司的服务器域名,可能自由门就是从这里即时更新代理服务器IP,使共匪无法封锁;还有一个61-67-165-host139.kbtelecom.net.tw,依旧是打不开,这三个域名应该对应的都不是网页,而是IP地址库),每个网桥都拥有IP地址库,当第一次用网桥连上TOR后就即时变换IP,如果发现网桥被封锁就自动与IP地址库连接(我不知道动态网公司是怎么做到不让共匪全面封锁他们的主机的,也许是在重要的平台上搭建的地址库(例如云计算平台,例如电子商务平台。解说一下:为了节省成本,不少网站都采用了在同一台服务器主机上搭建VPS共用IP的策略,所以GFW的IP屏蔽误伤率非常高))更新网桥IP从而重新连接上。但自由门一直都不开源,动态网公司也一直不肯说明技术细节,所以要实现这一想法非常困难:(

论技术,GFW没有多高明,特征检测IP屏蔽之类早就不是新领域了,要不是该死的思科(卖给共匪核心技术和大量设备),GFW都不见得能搭建起来,但GFW通过砸了N多天朝屁民们的血汗钱,硬是将95%的流量困在了墙内!共匪倒台之后,建立维护GFW的钱一定要回到我们每个人手上!

最后照例附上科普文链接集合:https://plus.google.com/u/0/109790703964908675921/about
附录:
补充一下torrc文件设置方法(网桥版本):
AvoidDiskWrites 1
SocksListenAddress 127.0.0.1
ControlPort 9151
SocksPort 9150
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
UpdateBridgesFromAuthority 1
DirReqStatistics 0
ExcludeNodes {cn},{hk},{mo},{sg},{th},{pk},{by},{ru},{ir},{vn},{ph},{my},{cu},{br},{kz},{kw},{lk},{ci},{tk},{tw},{kp},{sy}
ExcludeExitNodes {cn},{hk},{mo},{sg},{th},{pk},{by},{ru},{ir},{vn},{ph},{my},{cu},{br},{kz},{kw},{lk},{ci},{tk},{tw},{kp},{sy}
StrictNodes 1
==========
TOR与GFW的PK(1)
最近对于我们翻墙党来说最好的消息就是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])

其他两种meek插件(amazon和azura)分别依赖于amazon和微软的云平台,也是可以自行搭建后给自己用的,不过操作复杂不适合小白,有兴趣的技术党可以看这里[5],里面描述了搭建过程,可以自己试试。
下一篇我会讲讲ScrambleSuit,obfs4和ScrambleSuit的原理有相通之处,诸位就把下一篇当成对于这篇[6]的补充好了。

最后照例附上科普文链接集合:https://plus.google.com/u/0/109790703964908675921/about
13
47
=================
                  TOR与GFW的PK(3)————披着羊皮的狼

话说可恶的共匪GFW对于加密流量那是特别关照啊,特别是对于出入443端口的HTTPS流量严加监视,一发现有异常就阻断,很多时候还故意随机丢包劣化传输质量,google2010年退出天朝市场之后就是遭到了此等待遇从而使自己在天朝的市场份额由30%多降到了不足3%[1]。

至于Tor,那更加是一直被GFW恨之入骨杀之而后快的,尤其是在GFW引入了基于DPI(Deep Packet Inspection,深度包检测)[2]的IDS(Intrusion Detecting System,入侵检测系统)[3]之后,特别的加密流量如Tor流量可以说被完全封杀了。怎么办呢?

英勇的Tor团队的成员们开始想办法了:“据研究大部分企业级和国家级的DPI都采用基于正则表达式[4]的检测算法,GFW很可能也是如此。”“对,天朝曾经向伊朗出口GFW技术[5],而伊朗采用的DPI—X就是采用基于正则表达式的检测算法的[6],那么天朝应该也一样。”

“GFW通过DPI识别协议并对“非法”协议进行封锁,阻断相应连接,但常用的合法协议(例如HTTP)只能放行,要是封锁了,那就等于直接断网了。”“那么就把狼披上羊皮吧!”

看上去正常的流量,看上去不正常的流量;可恶的GFW,杀死了加密的流量;穿上羊皮,恶狼变成了小羊;出入80端口的Tor,蒙在鼓里的GFW;冲向自由的互联网,对GFW宣战!试问,谁是幕后英雄?

FTE(Fomat-Transforming Encryption,格式转换加密)[7]!FTE成功把特别的加密Tor流量伪装成了明文的HTTP流量!事实上,FTE可以把输入的协议转换为任意指定的目标协议从而欺骗GFW!

“究竟是怎么一回事?加密流量变成非加密流量?”“不,不是变成非加密流量,而是进行格式转换把基于正则表达式的DPI检测算法给耍了,让基于DPI的IDS认为传输的是非加密流量。”

这么说吧,FTE实际上是这么一个工作流程:密钥生成,加密和解密。实际上,整个FTE就是在常规对称加密算法(基于AES的CTR模式[8])的基础上叠加了格式转换编码算法,加密时输入随机生成(实际上是通过精心设计的伪随机算法生成)密钥,数据和想要转换的数据包格式格式并将相应数据包先加密再转换为对应的格式,然后传输到FTE网桥(即服务器端)之后再进行解密得到数据。当然客户端并不是支持所有的格式的,所以输入的格式必须在客户端支持的格式集合当中。

“但是在加密之前必须要先协商好使用哪种格式以及进行密钥交换,要不然无法正常传输数据啊!”“没错,但很显然不能明文协商,否则直接被DPI了。”“那怎么办呢?”

FTE采用了这样一种协商策略:客户端将密钥和接下来的连接里采用的格式打包之后加密(这里存疑,密钥交换应该是和格式协商一起进行的,但我看了好几遍论文[7]里描述FTE记录层工作过程的部分都没有找到对密钥交换的说明,但密钥交换也只能和协商过程一起进行了,其他时候没有机会的),这种加密算法将massage伪装为任意一种合法格式,传输到服务器端之后服务器再一个个格式试着解密过去(服务器事先放置了解密密钥),直到成功解密为止。FTE特别的一点是上行(客户端到服务器端)流量和下行(服务器端到客户端)流量可以采用不同的伪装格式,协商的时候就可以选择好想要使用的格式。

“好像还有个中间人攻击的问题。”其实没有了,GFW拿不到服务器端事先放置好的解密密钥,没法获得后来的加密过程中使用的密钥,根本就无法进行中间人攻击。而且客户端还会进行数字签名(采用HMAC-SHA256签名算法[9]),GFW更是无从下手了”“对,同时还可以保证数据包不被篡改。”

说起来也没什么特别的:GFW用正则表达式识别谁是狼谁是小羊,那么FTE就把恶狼(Tor流量)给披上羊皮(进行格式转换,简单来说就是在加密数据的基础上重新构造数据包,让数据包的结构看起来像是被合法协议处理过的数据包),从而成功把GFW给耍了。

实验结果[7]表明FTE成功把那些基于DPI的IDS们耍的团团转,一个个的正则表达式检测算法全都失效了,不过GFW却没那么好对付:实验发现如果被FTE处理过的流量走443端口,就会遭到GFW的主动探测攻击[10],而FTE没有对于客户端的身份认证机制,无法对抗主动探测攻击,就这么被屏蔽了。不过,如果走80端口(也就是伪装成HTTP流量),GFW是无法识别的,可以成功突破封锁。

就像007一样,总是伪装成平民;就像英勇的47(玩过hitman系列的应该清楚),“喂喂,我是自己人”!对抗肮脏的DPI,需要勇气更要智慧;专心于一点,单调但聪明,耶耶,这就是对抗封锁的幕后英雄——FTE!

下一篇,Flashproxy!

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

参考资料:
1,谷歌退出中国大陆事件
https://zh.wikipedia.org/zh/%E8%B0%B7%E6%AD%8C%E9%80%80%E5%87%BA%E4%B8%AD%E5%9B%BD%E5%A4%A7%E9%99%86%E4%BA%8B%E4%BB%B6
2,Firewall Evolution – Deep Packet Inspectionhttp://leetupload.com/database/Misc/Papers/Web%20Papers/Firewall-Evolution-deep-packet-inspection.pdf
3,网络安全入侵检测 A 研究综述http://www.jos.org.cn/1000-9825/11/1460.pdf
4,正则表达式https://zh.wikipedia.org/zh/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
5,http://www.chinagfw.org/2014/03/blog-post_12.html
6,Iran Vows to Unplug Internethttp://www.wsj.com/news/articles/SB10001424052748704889404576277391449002016?mg=reno64-wsj&url=http%3A%2F%2Fonline.wsj.com%2Farticle%2FSB10001424052748704889404576277391449002016.html
7,Protocol Misidentification Made Easy with Format-Transforming Encryptionhttps://kpdyer.com/publications/ccs2013-fte.pdf
8,Comments to NIST concerning AES Modes of Operations:CTR-Mode Encryptionhttp://web.cs.ucdavis.edu/~rogaway/papers/ctr.pdf
9,https://en.wikipedia.org/wiki/Hash-based_message_authentication_code
10,TOR网桥,主动探测攻击和烧钱的GFWhttps://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP
======================
TOR与GFW的PK(4)
————“快来我这里,冲向自由世界!”
开始之前先和大家说一个坏消息:今天翻墙项目fqrouter关闭了[1],很可能是因为GFW对google IP的疯狂封锁导致项目难以继续。在此,本幽灵向fqrouter的作者致敬,同时表示惋惜,毕竟fqrouter迄今为止是移动端最优秀的翻墙工具了。希望fqrouter早日有继承者,继续与该死的GFW战斗直至GFW倒塌!
说起来,GFW可是越来越疯狂了啊,而普通的翻墙工具基本上都是依赖于一个或少数几个长期运行的代理服务器的,这样真的很容易被封锁:代理服务器的IP地址是固定的,GFW只要将这个IP地址加入黑名单中就能让翻墙工具失效。怎么办呢?
你应该猜到了:耶,咱们英勇的Tor团队又想出新招数了!
“既然长期运行的少数代理服务器容易被封锁,那么我们就准备大量的代理服务器吧!”“可是租用服务器的价钱可不低,而且说起来地址还是固定的,不能有效对抗封锁,要知道google那么多IP都被GFW封掉了大半呢!被封锁之后,服务器就没用了!”“哎呀,我们干嘛要去租服务器?我们直接让用户的PC变成服务器不就行了吗?”“你是说网桥中继?我们早就想到这一点了啊,但GFW也封锁了很多网桥啊,被封锁的网桥就起不到突破封锁的作用了啊。”“不,不是长期生存着的网桥中继,而是寿命短暂但数量极多,GFW封锁不过来的代理服务器。”“有这种代理服务器?”
当然有了,就是flash proxy!基于浏览器的短寿但数量极多的代理服务器!(这个flash的意思可不是flash插件,而是“闪现”(游戏迷应该很熟悉这个技能),或者说顿悟)
从这里瞬移到那里,连接自由的英雄;摆脱服务器的束缚,游荡在自由之地;Flash和JavaScript,是侠客也是恶棍[2];向两边发出邀请,一起来玩吧!存在一瞬间,却拥有永远,这就是——flash proxy!(这里面每一句都对应着flash proxy的特性,看完你就会明白的)
flash proxy可不是一般意义上的代理服务器:一般意义上的代理服务器可以主动发起一个连接,也可以监听等待其他主机的连接请求再被动建立连接;而flash proxy只能主动发起连接,无法被动建立连接。[3]
“为什么?”“因为flash proxy是一个依赖于浏览器的存在,所有在浏览器内运行的程序都无法被动建立连接。”“依赖于浏览器的存在?”
flash proxy的实质是网页程序的一部分:最早是Adobe Flash,后来改用JavaScript,只要事先在网页上嵌入这段程序,当任意用户用自己的浏览器访问对应的网站时,浏览器内就会同时开始运行flash proxy,此时这个用户就成了代理服务器了。[3]
“等一下,这需要对应网站的配合吧?”“当然需要了。”“那么,如果GFW封锁了对应网站呢?”“没有关系,因为并不是网站服务器在充当flash proxy,而是访问网站的用户浏览器在充当flash proxy。那么多分散的个人用户,GFW封锁得过来吗?”“GFW一定很生气:)”
“喂喂,有新问题啦!一般的翻墙工具都是客户端发起连接,代理服务器被动建立连接,可是现在flash proxy无法被动建立连接,那么该怎么办啊?”“这还不好办,让flash proxy主动发起连接吗!”“我说,该怎么主动发起连接?你丫上哪知道客户端IP地址去?”
当一个flash proxy开始运行之后,它首先会与一台特别的服务器建立连接(就叫这台服务器“主持人”吧!),采用的是轮询的方式:每隔一段时间就去问一下“喂,主持人,有客户端想要建立连接吗?”如果主持人回答“有,某某(客户端IP地址)想要建立Tor电路,快去帮忙吧”,那么flash proxy就会主动发起并建立与对应的客户端连接(准确来说,是与对应Tor客户端的传输插件建立连接),接着主动发起并建立与任意的Tor中继节点(准确来说也是与安装在节点上的传输插件建立连接),然后就开始代理客户端与Tor中继之间的通信了。此时flash proxy还起到了目录服务器的作用,所以这种情景下客户端不用与目录服务器建立连接了。[3]
“刚刚我想到一个问题:这种基于浏览器的flash proxy寿命可是很短的,用户只要关闭对应网页就会停止运行,那么根本就无法支撑起长时间的Tor电路吧?”“没错,但别忘了有很多这样的proxy呢,事实上每次都会有五个活动的flash proxy同时与一个客户端传输插件建立连接(但其中四个都是空连接,只有一个是真正在代理Tor流量的),如果其中那个真正工作的flash proxy下线了,那么客户端传输插件就会马上切换到其他任意一个上面重新建立Tor电路的,同时一个新的flash proxy就会在主持人的命令下前来建立连接,从而长期保持着(在Tor用户看来)稳定的连接。[3]”
主持人服务器……主持人服务器是怎么知道客户端信息的?
“这么说,客户端在一开始是要和主持人服务器建立连接了?”“没错,这个主持人服务器和Tor网络的目录服务器是有着类似之处的,只不过目录服务器存储节点IP而主持人服务器存储客户端IP。客户端在一开始就会与主持人服务器建立连接,把自己注册进去,然后主持人服务器就可以将客户端地址提供给flash proxy了。”
GFW:“哈哈,我终于找到封锁你们的办法了!只要在客户端一开始和主持人服务器建立连接时切断连接不就可以了吗?主持人服务器也就那么几台,要封锁太容易啦!”
GFW,不要笑得太早!我们早就想到你会用这一招了!
“我们怎么会傻到直接与主持人服务器建立连接呢?看看Rendezvous Protocol的威力吧!”“这什么?会合协议?这些都是什么啊?”
两个人为了避开第三方的追踪,选择了去一个安全的第三方场所会合并交换信息,而不是直接去对方家里,这样第三方就没法知道其中某人的家的位置了,这就是会合的真正含义啊。在这里,会合协议有两种实现形式[3]:
1,借助云存储服务器的力量:这种思路其实就是MEEK[4]的基本思路,客户端先与亚马逊等云服务器建立连接并将自己的IP地址发过去暂时存储起来,主持人服务器再读取存储在云服务器中的IP地址。通常过程是这样的:主持人服务器注册一个云平台账号,申请到存储空间,任何人都可以在这个空间进行写操作,但只有主持人服务器可以进行读操作。云平台太重要,GFW不敢随便封,而封锁主持人服务器的IP地址也没有意义,因为主持人服务器根本就不需要与GFW内的客户端建立连接。(这一过程中云平台就是客户端与主持人服务器的会合处)
2,借助愿意帮忙的网站的力量:客户端首先随机向一个愿意帮忙的网站的服务器发起连接请求(请求一个不存在的页面),将特殊的会合信息嵌入标准HTTP请求中(信息是被加密的,格式为0^32||IP地址,嵌入到会话cookie头部中,GFW根本就无法分辨)。当目标网站服务器接收到这一信息后,就会试图对会话cookie进行解密,如果发现有0^32,就直接把被编码的IP地址传送给主持人服务器,同时向客户端响应200(HTTP服务器头文件响应码之一,表示连接正常)以告知客户端已成功将IP地址注册到主持人服务器上(或者叫做会合请求成功)
现在总结一下整个过程:首先,客户端把自己的IP地址传输给主持人服务器;然后,主持人服务器在flash proxy前来询问时告知目标客户端IP;接着,flash proxy同时向客户端传输插件和中继节点传输插件发起并建立连接,最后开始代理Tor流量,建立Tor环路。(我这回直接偷懒一下,把Tor官网上的原理图[5]搬过来了:)解说一下:第一步,客户端使用安全会合协议将IP地址注册到主持人服务器上;第二步,flash proxy轮询;第三步,主持人服务器通知flash proxy去帮助对应IP地址的客户端;第四步,flash proxy发起并建立与客户端传输插件的连接;第五步,发起并建立与Tor中继节点的传输插件的连接,最终成功建立Tor电路。当一个flash proxy下线之后,客户端传输插件马上切换到另一个flash proxy上继续连接。)
flash proxy在发起连接的时候协议指纹还是比较明显的,不过随着主流浏览器普遍开始支持WEBsocket(flash proxy通信使用的API(应用程序编程接口))后这一点会得到改善,越多普通浏览器流量使用WEBsocket,GFW越不敢进行特征检测。
我们寿命很短,可是我们人多;藏在合法流量中,GFW你快来找啊!主动发起连接,突破该死的封锁;都是英雄啊,flash proxies!
这是该系列的最后一篇了,到此所有流量混淆插件均介绍完毕(我手头还有一份论文,不过那个插件已经停止开发了,而且原理与FTP[6]类似,暂时先不介绍了)!(小声)可能还会进行一些补充吧:)

最后附上科普文链接集合:https://plus.google.com/u/0/109790703964908675921/about
参考资料:
1,
http://www.chinagfw.org/2015/01/fqrouter.html#links
2,Tor Browser的秘密(1)
                                    ——”Big Friend is watching you!”
https://plus.google.com/109790703964908675921/posts/MfMqFXmGMQk
3,Evading Censorship with Browser-Based Proxieshttps://crypto.stanford.edu/flashproxy/flashproxy.pdf
4,TOR与GFW的PK(1)https://plus.google.com/109790703964908675921/posts/CCS4c7jn3t9
5,https://crypto.stanford.edu/flashproxy/
6,TOR与GFW的PK(3)
                         ————披着羊皮的狼
https://plus.google.com/109790703964908675921/posts/WDD6U3k5EGm
======================
最新版Tor Browser Bundle使用教程
最详细的TBB使用教程出炉了!欢迎诸位提出宝贵意见和建议,尤其是小白,哪里看不懂一定要说啊:)
照例附上科普文链接集合:
https://plus.google.com/u/0/109790703964908675921/about

====================
关于TOR使用问题的补充

我写过一堆关于TOR的文章(链接集合
https://plus.google.com/u/0/109790703964908675921/about),现在发现有一些遗漏,特此写一个FAQ供大家参考:

1,如何获得TOR软件?
答:
https://www.torproject.org/download/download-easy.html.en这是官网下载地址,有些人的PC不能翻墙,那么就先百度“代理服务器”找一个代理临时翻一下墙,就可以去下载了,或者百度“科学上网”或“VPN”找一个翻墙工具凑合一下,先出来再下载;一定要去官网,别的地方的软件有可能是被伪装的木马。

2,TOR BROWSER需要安装吗?
答:不需要安装,只有一个解压过程,这是绿色软件,不需要管理员权限就可以运行。

3,TOR可以直接连接吗?
答:墙内无法直接连接,必须加上前置代理或者利用网桥中继或新出的MEEK插件才能连接上。

4,为什么我设置了前置代理还是连不上?
答:设置前置代理之前需要保证这个前置代理是可用的(也就是可以单独拿来翻墙的),如果前置代理是VPN,那就无需任何设置,直接在第一步设置时选择连接即可;如果不是,那么就要选择“配置”选项,在下一步选择设置前置代理,然后填上相应的端口号,自由门是127.0.0.1 8580(HTTP/HTTPS)无界是127.0.0.1 9666(HTTP/HTTPS) shadowsocks是127.0.0.1 1080(SOCKS5)(也可能有服务器的本地端口是自定义的,那么就填写自定义端口)SSH 是127.0.0.1 7070(SOCKS5) 赛风三是127.0.0.1 1080(SOCKS5),GAE类(goagent,wallproxy,还有一些一键翻墙包)翻墙工具没法成为TOR的前置代理,lantern大家自己试吧,我不清楚他的原理,不想贸然使用。
设置之前前置代理就要开着,设置好连接成功后就要和TOR一起一直开着,还有就是不能关闭那个TOR BROWSER(如果你想用其他浏览器的话),关闭了Tor Browser,TOR也会随之关闭。

4,最新版TOR Browser为什么不能编辑删除证书?
答:这是最新版的BUG,迄今为止还没能被修复,大家可以去TOR官网反映BUG,除此之外只能等待了,考虑到共匪的中间人攻击越来越疯狂(这几个月都发生五次国家级中间人攻击了,分别针对google,github,微软hotmail,yahoo以及苹果icloud),建议大家暂时改用没有BUG的firefox或chrome,同时轰走所有天朝证书
https://plus.google.com/109790703964908675921/posts/XfgEeXNQAJy

5,我可以使用其他浏览器,是吧?
答:的确可以,但你需要进行一些相应的隐私设置:首先,firefox下载autoproxy,chrome下载proxyswitchysharp扩展,然后新建情景模式,填上127.0.0.1 9150,选择socksv5,再保存,激活扩展,点击选择刚刚新建的情景模式(名字随便取,建议用TOR),然后再安装上这几款扩展:NoScript(chrome中叫ScriptSafe,激活后请默认禁止加载所有JavaScript,网页要是显示不正常再一个个放行),disconnect,PrivacyBadger,User-Agent Switcher(或者名字类似的,能切换User-agent的),Ghostery,Notify Headers(或者名字类似的,能修改HTTP Headers的),EditThisCookie(方便及时删除cookie),adblock plus,都要启用,同时禁止所有插件运行(chrome在选项里可以禁用插件,firefox直接点击附加组件,在里面可以禁用插件),禁止第三方cookie(都是在选项里选择禁止)以上工作做好之后就能够在很大程度上躲避追踪保护隐私了。

6,为什么你不推荐Vadalia(TOR的图形界面,带有显示节点所在地的功能?)
答:因为Vadalia从2012年开始就再也没有更新过了,只有TOR Browser一直更新着,不过我想推荐一下两个基于TOR的即时更新的项目:Tor Ranger(
http://allinfa.com/toranger-177-tor.html)和BlackBeltPrivacy(http://allinfa.com/blackbelt-privacy-v3201410-tor-waste.html)。还有个Advanced Onion Router(http://allinfa.com/advanced-onion-router-v03020.html),有段时间没更新了,但比Vadalia要新不少,可以代替Vadalia。

7,我想用网桥中继,该怎么设置?
答:前置代理和网桥中继只能二选一,否则很大可能无法正常连接。如果选了网桥中继,那么前一步就不能设置前置代理。在下一步选择“我的ISP封锁了TOR”,进入网桥设置界面,最新版推荐首先尝试那三个MEEK插件,大部分都能连上,如果不行,尝试集成的obfs3网桥,再不行就要想办法获取网桥,看这里
http://allinfa.com/tor-links.html

8,怎样设置torrc文件?
答:打开TOR Browser文件目录下的torrc(Browser->Tor Browser->data->tor,就能看到torrc文件),在最后添加如下语句(一句一行,括号里的是我的解说,不要加进去):
AvoidDiskWrites 1(减少硬盘读写)
SocksListenAddress 127.0.0.1
ControlPort 9151
SocksPort 9150(前面三个分别是本机监听地址,控制端口与本机端口)
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C(控制端口密码验证)
DirReqStatistics 0(防止默认写入相关数据)
ExcludeNodes {cn},{hk},{mo},{sg},{th},{pk},{by},{ru},{ir},{vn},{ph},{my},{cu},{br},{kz},{kw},{lk},{ci},{tk},{tw},{kp},{sy}
ExcludeExitNodes {cn},{hk},{mo},{sg},{th},{pk},{by},{ru},{ir},{vn},{ph},{my},{cu},{br},{kz},{kw},{lk},{ci},{tk},{tw},{kp},{sy}(上面两行都是排除可疑国家的蜜罐节点)
StrictNodes 1(强制执行)
如果使用网桥中继,那么还要加上: UpdateBridgesFromAuthority 1

9,我只用TOR就能保持匿名了吗?
答:不行,使用TOR只是保持匿名的重要手段之一,要想真正做到匿名还要做不少工作,可以好好看看
https://plus.google.com/u/0/109790703964908675921/about里面匿名和浏览器安全与隐私保护这两个分类下的科普。

10,TOR支持移动端吗?
答:android平台上有一个Tor Orbot,墙内无法直连,链接
https://guardianproject.info/apps/orbot/,但我建议对于移动端采取完全不信任的态度,因为移动端在安全领域成熟度远不如PC端,而且墙内移动硬件有后门的可能性很大。不过还是可以想办法提升安全性:不要用国产App,选择国外大品牌的水货。
https://plus.google.com/109790703964908675921/posts/Pt8stBEGX8



https://xijie.wordpress.com/2015/01/11/ghost-assassin%E7%9A%84tor%E4%B8%8Egfw%E7%9A%84pk%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0/