中国のファイアーウォールを回避する西廂計画

中国のファイアーウォールを回避する西廂計画は、クライアントを中国の古典小説西廂記の壁を越えて崔鶯鶯に会いに行った張生にたとえて「張生」と呼び、サーバーを「崔鶯鶯」と呼ぶ。西廂計画では張生が重要な働きをする。ファイアーウォールはTCPプロトコルの3度のハンドシェイクをチェックしない特性を利用してresetパケットを強制的に挿入してインターネットを規制するが、西廂計画はこの特性を巧妙に利用して、クライアントとサーバーからファイアーウォールが見たいと望むデータパケットを送って規制を回避する。これらはすべてTCPプロトコル内で行われることで、もしTCPプロトコルがチェックをするのであれば西廂計画もありえないし、ファイアーウォールも存在しないことになる。現在、西廂計画はアルファ版であり、理論を論証する論文段階にあるが、作者自身は開発を継続するつもりはないようだ。それでも別のネットの習熟した人間がかかわれば、早く完成品が日の目を見ることになるかもしれない。

最近推上最流行的一个关键词是”西厢计划”, 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。

http://blog.youxu.info/2010/03/14/west-chamber

西厢其实并没有对墙做任何事,只是巧妙的利用了TCP协议的规则。正如墙利用了三次握手的不校验这个特点(这不是漏洞,而是特点)强行插入reset包一样,西厢也利用了这个特点,让客户端和服务器发送出了墙希望看到的数据包。这里的强大之处在于,一切都是在规则之内的。所以说,如果我们从更高的角度看来,墙和西厢是一种东西,TCP协议如果进行了校验,那就不会有西厢,同样也不会有墙。如果没有墙,也不会有西厢这种用法。

http://blog.devep.net/virushuo/2010/03/15/post_71.html
http://code.google.com/p/scholarzhang/wiki/README