Home > gfw > 西厢计划第三季 – Ignore the Great Firewall

西厢计划第三季 – Ignore the Great Firewall

本文google docs 链接:https://docs.google.com/document/d/1-PurF8_pJoLVJ7IqMfy5pdATjzR1_B5gqSlc2B5VPcY/edit?hl=en_US

本文最后更新时间:2011年7月27日

This post is inspired by http://obmem.info/?p=615

By ‘ignore’ instead of ‘bypass’, we mean working without intermedia server.scholarzhang is a great attempt, but currently it hardly work. scholarzhang contain three parts: zhang(client-side connection obfuscation), cui(server-side connection obfuscation), gfw(drop gfw dns hijacking packets) (ref 项目计划). On the client, we need to run zhang & gfw. The difficult part is that, GFW send RST packages to both ends, client & server, and Mr. zhang is trying to save reuse the connection after server received RST package(ref), 我估计 CUI 也是在尝试做类似的事情. The limitations are summarized in 项目计划:

“首先作为开发者,对于这个项目,应该消除幻觉,着眼缺点。西厢的弱点在README.wiki的局限一节已经描述得比较清楚,主要是两种问题:不稳定和易变。不稳定可能造成在使用过程中可能出现连接失败的情况,易变可能造成GFW升级之后如果西厢不升级便无法使用。不稳定是由于张某和崔某实际上做的是通过协议hacking弥补GFW造成的破坏,要求一种RFC规定的理想状况,原理就是不稳定的;而西厢的原理部分所依赖的GFW指纹和漏洞机制是易变的,需要即时更新。因此,“没有银弹”,西厢也不是对GFW的银弹,我看到自由亚洲的报道夸大其事,我想开发者关注的应该是bug才对。 “

However, if Miss Cui make a move to help Zhang in, and this will make the task much easier. In fact, Ignoring the Great Firewall of China and 西厢计划原理小解 both mention a way to ignore GFW: just ignore and drop the RST packges sent by GFW.

“大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。”

正常的 tcp 连接的创建和结束过程中,都不需要用到 Reset。客户端直接drop 掉 Reset,一般不会有问题,至少是可以正常上网的;服务器上如果直接这么做,可能会产生一定的资源消耗。但是这种方式显然比最初始的西厢计划更有效。

具体操作方法

在客户端和服务器上分别用 root 执行:
iptables -A INPUT -p tcp -m tcp –tcp-flags RST RST -j DROP
如果用的是 FreeBSD的 ipfw,命令换用:
ipfw add 1000 drop tcp from any to me tcpflags rst in
如果客户端用的windows,拿西厢项目中的 windows 客户端试试。

另外,客户端还可以丢弃掉gfw 发送的扰乱的 ack+rst 包,具体参考最后更新的说明:
iptables -A INPUT -p tcp -m tcp –tcp-flags RST,ACK RST,ACK -j DROP

在 google code 上已经新建项目,西厢计划第三季。项目后续会在这里更新。更详细的操作方法,参考项目wiki

局限

1. 无法应对 IP 封锁。如果 ping IP 都超时,基本无法离开中间服务器绕墙。

2. 在多次触碰敏感词之后,GFW 会直接阻断两端通信,从而导致后续的数据无法传输。

可能的问题

1) 如何让服务器识别 GFW 发送的 Reset 包,而正常处理其它 Reset。很有可能的情况是,西厢 CUI 模块已经解决了这个问题,甚至服务器上直接安装 CUI 即可达到预期效果。
2) Windows 客户端的开发。linux 环境上安装 zhang 和 gfw 是相对容易的,西厢目前也有windows 客户端,但我不清楚目前可用性如何。(如果用方便翻墙作为理由推广linux 倒也不错)
3) 也是最麻烦的问题:这个方法如何推广。如果是个人的vps 上的博客域名被污染,只需要打一条命令就可以搞定;但是如何说服 facebook 在他们服务器上安装这些东西呢?这需要对 CUI 模块做认真的后续开发、测试,以及文档完善。这些准备工作做好了,如果国外的互联网公司认为中国用户足够重要,也自然会考虑这些事情。当然,客户端的推广同样重要。本文最开始打算用英文写,也是希望国外互联网公司能方便地找到这里。

匿名性

原始的西厢计划小组成员基本是匿名参与。此次我基本上实名了。如有感兴趣的同学欢迎加入。如果遇到政府的压力,我会考虑移民出国。另外,如果本方案有国外网站使用,我也会发布一个项目捐赠方式。

测试结果(7月24日更新)

本文发布当天我没有做测试。今天才找到一朋友的vps 做测试。GFW 有一个惩罚机制,大概是你连上国外服务器的,被发现触碰关键词(访问一个被污染的域名,或者交互数据中有明文的敏感词),发送 RST 之后,会在一段时间内(目前感觉大概是30秒),可能会封禁两端的通信,效果如同 ip被封禁。但是,这种惩罚机制的触发条件不太稳定。我在 Ubuntu 11.04 上的测试结果是:

  1. curl 100% 触发惩罚规则 – User-Agent: curl/7.21.3 (i686-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18\r\n
  2. chrome  和 firefox 在连续地发送大约6次http 请求撞墙之后,gfw 似乎会随机阻断若干请求,但是没触发封禁通信的处罚。

总体上来说,目前结果比较乐观。

另外,我测试的域名是 liruqi.me,这个域名已指向一个会丢弃 RST 包的主机上,供大家测试。

Advertisements
Categories: gfw
  1. Stuart
    July 22, 2011 at 2:58 pm

    事实上这种方法是不可行的,因为GFW还会发送错误的ack包扰乱链接而不是RST。这事实上是在西厢计划基础上的退步而不是进步。

    • August 3, 2011 at 11:38 am

      从代码中看出了这个问题。说的是 type2 吧,正在想办法把这个也 drop 掉。

    • August 12, 2011 at 8:04 am

      我现在观察到的错误ack 也是带 rst的, 似乎直接判断 rst 也可以 drop 掉.

  2. July 24, 2011 at 3:34 pm

    平板电脑你那边做的如何,有机会额合作吗????

  3. Keres
    July 25, 2011 at 7:03 am

    可以通过wipfw在windows实现RST+ACK的丢弃吗,怎操作……

    • July 25, 2011 at 7:15 am

      我昨天在win7上尝试安装,没成功。

    • August 12, 2011 at 8:05 am

      windows 上我把客户端做出来了, 你看看西厢3 的项目安装文档.

  4. cst
    August 9, 2011 at 9:07 am

    GFW一直是half stream吗?
    我怎么记得以前不是呢

    • August 9, 2011 at 10:18 am

      Half stream 是什么意思?

      • August 9, 2011 at 4:39 pm

        tcp链接不是双向的吗。half就是半向的意思, 利用第三方服务器通过ipsec隧道绕道到,发现还是会受到rst的包。

        猜测gfw是半向监控,只要看到一方的syn包然后在发现http包 就开始丢rst了。 而不是收到2边的syn包后才开始监控的。

        ps 目前如何处理 gfw的dns包呢?

    • August 9, 2011 at 4:53 pm

      其实我现在并没有猜测gfw的工作方式,而是单纯地希望通过寻找规律,客户端服务器同时丢弃掉干扰的数据报。如果大家都这么做,相当于是对gfw ddos攻击。

      gfw的dns包目前是利用原始西厢计划的gfw模块丢弃。脚本中有注释。

      • cst
        August 10, 2011 at 5:08 am

        恩 看了下 不知道西厢怎么在 centos下 弄 提示
        configure.ac:32: /usr/bin/m4: Warning: excess arguments to builtin `patsubst’ ignored
        autom4te: /usr/bin/m4 failed with exit status: 1
        aclocal: autom4te failed with exit status: 1
        autoreconf: aclocal failed with exit status: 1

  5. XericZephyr
    August 25, 2011 at 4:59 pm

    一个问题是 当RST + ACK包被丢弃了之后 不用再重新发送一个正常的ACK包以完成握手么?

    那么用ipTable 具体是怎么做的? 我对ipTable 不是很熟悉
    希望能耐心解释 。。

    • August 31, 2011 at 12:57 am

      RST 包基本都是 gfw 发出来的. 跟服务器状态无关.

      发起连接的三次握手是
      syn –>

      rst 在tcp 协议中是单方面希望尽快中断连接, 一般浏览器和服务器都不会发的.

  6. September 11, 2011 at 7:59 am

    liruqi :
    RST 包基本都是 gfw 发出来的. 跟服务器状态无关.
    发起连接的三次握手是
    syn –>
    rst 在tcp 协议中是单方面希望尽快中断连接, 一般浏览器和服务器都不会发的.

    偶要说RST是很常见的。

  7. hanfu
    March 27, 2012 at 3:05 am

    建议大家把TTL考虑进去。因为GFW位于中间,对于正常的两端来说,到达peer与到达GFW的跳数是不同的。设置恰当的TTL可以发送一些GFW能收到但peer收不到的报文;-)

  1. July 22, 2011 at 11:48 pm
  2. July 23, 2011 at 7:30 am
  3. July 23, 2011 at 9:31 pm

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: