Total Pageviews

Wednesday 29 July 2015

打造自用的Meek中继反射器

背景

Tor的Meek混淆插件最近比较好用, 由于Amazon、GAE和Azure上都有现成的中继装置, 直接让Tor启用Meek连接即可。
不过博主喜欢折腾, 用现成的东西感觉不是那么爽, 因此多方尝试折腾出一个自用的Meek反射器, 不用每次走Amazon的渠道了。

Meek基本原理介绍

首先启用了Meek的Tor链路是这样的状态:
本地Tor客户端->本地Meek客户端->服务器端Meek->服务器端Tor网桥
由本地的Meek客户端将Tor的数据包封装并发送到服务器端的Meek, 服务器端解析并将数据塞给服务器端的Tor, 由服务器端的Tor处理数据。
从本地Meek到服务器端的Meek连接便是Meek技术的核心所在, 即所谓的“Domain Fronting”技术。
本地Meek客户端->Google云服务器->GAE上的Meek服务器

现有Meek网桥的简单分析

(以下内容为博主个人猜想,可能有重大谬误...)
博主研究了Meek-Server的代码后发现, 需要在服务器搭建Tor并配置为网桥之后, 再让Meek-Server在Tor的前端接入Tor的流量。
那么就奇怪了, 难道所有的云服务器端都是部署了Tor的中继服务器?
查看Meek-client的Git仓库, 可以看到有多个版本的Server端部署代码, 包括AppEngine、php甚至是nginx的配置。
博主懂得一点php, 所以斗胆观摩了一下php的代码, 发现内容上其实只是把接收到的数据包转发给一个特定的地址。
再继续观摩AppEngine和nginx的配置, 发现它们的思路都是一样的, 转发到下面这个地址:
http://meek.XXXX.com:1234
于是博主猜测真正的情况是这样的: 其实GAE、Azure和AWS上现有的Meek中继都不是真正处理数据的服务器, 它们只是起到一个反射器(reflector)的作用, 将收到的数据包转发到真正的Meek服务器上, 上述的地址就是真正的Meek服务器。

个人反射器的搭建

搞定了原理之后, 就可以着手打造自己的Meek中继反射器了。
其实方法很简单, 照着仓库里的README把东西部署上去即可。
例如php版本需要一个能执行CURL的php空间, 把代码上传到空间上, 记录下URL, 就可以配置本地的torrc进行使用了。
这里假设配置好之后Internet上访问的URL是这个:
http://foo.com/bar.php
那么在torrc里的配置应该是这样的东西:
Bridge meek 0.0.2.0:1 url=http://foo.com/bar.php
这里的更改让Meek把数据包发送到以上的地址, 由服务器端的php代码(或者是nginx的反向代理)转发请求到真正的Meek服务器上。
没有front是因为这里不需要Meek的“domain fronting”技术, 本来这个地址就没有被干掉, 此外, 如果这个域名被干掉的话, 那么用这个域名搭建的任何东西也都没什么意义。

收益分析

基于自定义URL的Meek反射器可以提供比较稳定的连接, 毕竟不是大量使用的话不会受到干扰或者封禁。
另外就是树大招风, 像Google这种整个玉米被搞死的情况Meek也是无能为力的。 对于自定义URL则风险比较小。
当然这么做的一个坏处是把Meek用歪了, 废掉了Domain Fronting技术, 只是纯粹的做一个数据包的转发。
管它呢, 技术还是要能够实现功能最重要.
from http://scutlaoyi.github.com/webTool004-how-to-build-a-meek-reflector.html
--------------------

Linux下Tor的安装和Meek的配置(非Browser Bundle模式)


博主喜欢折腾东西, 比如说好好的Tor Browser Bundle不用, 非要装一个纯的Tor来玩, 于是各种好玩的事情便纷至沓来。

关于Tor和Meek的基本介绍

TOR
Tor就不怎么说了, 都懂。 三层代理支持, 只有出口节点知道访问内容, 只有入口节点知道访问的IP。
纯Tor目前连接不上, 目录服务器被Block掉了。 导致的后果就是Tor无法直接连接Tor电路。
网桥
目前可用的办法是让Tor连接到中继网桥上, 中继网桥相当于跳板, 将客户端的请求转发到Tor电路中。
常规的中继网桥流量明显, 容易被盯上和封锁, 因此有了几款流量混淆插件。
obfs2/3/4, ScrambleSuit, 当然还有今天的主角Meek。
流量混淆插件可以将非常明显的Tor数据包伪装成普通的包, 防止被流量检测器盯上。
网桥存在问题在于经常会被动态Block, 由于正常用户需要通过各种方式获取可用的网桥信息, 博主猜是他们也用各种类似办法获取网桥, 一旦发现新的就统统干掉。
此外通过分析数据流量和目标地址, 估计也有一些办法可以判定某些目标地址是网桥节点, 只要被盯上就会被干掉。
归根结底就是网桥无法长期稳定使用。
Meek
最后是Meek。
Meek是最近一个牛逼虎虎的插件, 用Meek可以让Tor连接到被封锁的网络上。
Meek的原理简单来说是内容的欺骗, 首先把真正需要访问的地址(Tor网桥地址)塞进HTTPS包内部Header中, 在HTTPS包的外部把目标URL填写为没有被干掉的普通地址, 在传输的过程中由于目标地址正常, 所以数据包可以成功到达服务器。
到达正常服务器, 解析出HTTPS内容, 在包的内部Header中发现HOST字段, HOST字段指向了真正需要访问的被封锁的URL。 由正常服务器将包再次转发。 由于这时候包已经成功到达敌国, 在敌国的传输不会受到干扰, 因此数据包正常到达真正的目标服务器。
相当于拿一个正常的服务器作为跳板转发请求。
Meek现在据称还处于测试阶段, Tor的开发者们把Meek部署到三个大型的服务商里, 分别是亚马逊的AWS, 微软的Azure, 还有谷歌的GAE。 这些大型的服务商都提供了上述的HTTPS解析能力。

Tor的安装

最简单的办法是照着教程做, 直接从torproject上面拉最新版:
https://www.torproject.org/docs/debian.html.en
源码编译也是可以的。 注意glibc之类的依赖, 博主手气不好, 手动编译经常失败。

Meek的下载和安装

从Tor的Git仓库中拉一个最新版本的代码:
git clone https://git.torproject.org/pluggable-transports/meek.git
把代码搞到手之后就可以准备编译了。 代码是用go写的, 博主由于不认识go, 搞了很久才把客户端编译好。
这里需要了解的一点是meek-client是基于Tor的一个库写的, 在代码中也可以看到工程的头部引用了Tor的一个go库。 因此直接进入目录里编译的话会报错。
解决方案是让go拉取Tor的对应库:
go get git.torproject.org/pluggable-transports/goptlib.git
当然在这之前还必须把环境变量配置一下, 例如GOPATH什么的。
最后进入meek-client编译:
go build
如果ok的话可以拿到一个叫做meek-client(没有任何后缀)的可执行文件, 拿出来用即可。
这里假设把meek-client放到/tmp/meek-client里。

Tor的配置

接下来需要配置Tor让它走meek通道, 编辑/etc/tor/torrc, 加入下述几行:
UseBridges 1
Bridge meek 0.0.2.0:1 url=https://meek-reflect.appspot.com/ front=www.google.com
ClientTransportPlugin meek exec /tmp/meek-client --log /tmp/meek-client.log
解释一下:
首先是配置使用Bridge。
然后配置Bridge信息, 是Meek类型的Bridge。
关键的来了, 配置front为Google的玉米, 配置meek服务器的地址为一个appspot的地址。
front便是写在HTTPS请求外层的所谓“合法”地址, 如果Google没有被干掉的话。 url为meek服务器的地址, 也就是请求数据包最终发送到的地址。
最后一行配置了meek本地客户端的信息, 可执行文件的地址, 以及log日志的打印地址。
如此配置之后得到的效果是, 所有本地的Tor数据包首先发送到Meek-client, 由Meek-client封装成为HTTPS包发送到Google, Google解析HTTPS包的内容, 拿到包头的HOST数据, 发现是给appspot的, 再由Google负责转发到对应的appspot地址。
在appspot上等着的是Meek服务器端, 由该服务器解析并将数据传入Tor电路。

神坑

使用apt一类的包管理器安装Tor有一个坑, 由于Tor安装到系统里, 可以使用Service一类的命令启动Tor。
但是配置了Meek插件之后调用
service tor restart
启动Tor会一直报权限不足, 即使用Root也是。
最后在stackoverflow上找到答案, 原来是Tor的Service有bug, 搞定了Meek插件的安装之后, 可以直接通过命令启动:
tor
from http://www.scutlaoyi.tk/webTool003-how-to-use-tor-with-meek.html
 ---------------------------------

meek网桥的技术原理

转载自网络,并做了相应修改
首先,tor从使用者本机直到出口节点的传输是强加密的,别人无法偷窥你的真实网络流量。除非tor软件本身出现严重安全漏洞或者碰到的出口节点是蜜罐
虽然无法偷窥你的真实上网内容,但是如果有ISP、GFW监控你的流量,可以判断出你在使用tor,判断流量类型不等于解密内容;而流量混淆把tor流量伪装成其它的上网流量,让监控者看不出你在用tor。
出于软件架构方面的考虑,流量混淆的功能不是做到tor的核心软件中,而是以插件的方式来提供。因为混淆流量的方式是多种多样的,用插件来扩展就无需频繁改动核心模块的代码。
在meek之前,tor开源社区已经出过好几款流量混淆插件。以obfsproxy为例:
图中的tor client和obfsproxy client在你本机,他们要正常工作就需要先连接到obfsproxy server。虽然GFW无法区分被obfsproxy混淆过的流量,但是因为全球的obfsproxy server数量是有限的,GFW可以把所有的obfsproxy server都加入IP黑名单。如此一来,就足以让obfsproxy失效。
meek client也是跟tor client
一起运行在你本机。下面这张是meek的示意图:
从图中可以看出,meek跟obfsproxy的主要差异在于meek server 并不是直接暴露出来的。换句话说,你本机不需要直连meek server,而是直接连接云计算平台的服务器。如此一来,即便GFW知道meek server的IP,封杀这些IP也没有意义。
只因aws、azure云计算平台绑定国内各个公司业务较多,GFW又不敢轻易封杀。这就是meek插件可以突破GFW的关键所在。关于更多tor原理细节请搜索:tor的常见问题解答
---------------

相关:
https://briteming.blogspot.com/2016/06/meek-server.html
https://briteming.blogspot.com/2016/07/http-transportmeek.html
如何搭建obfs4