2008年9月25日星期四

防火长城架构

防火长城架构
本文按署名·非商业用途·保持一致授权
作者: ,发表于2008年08月26日00时54分

前几天看到一篇文章:如何忽略防火长城。这篇文章是我迄今为止看到过的技术性最强的和GFW相关的文章。

我一直以为,GFW这个系统是安装在每个出口主干路由器里的,所有的封包都在路由器里被监测和分析,然后直接在路由里采取一定的策略,例如丢弃封包。但是这篇文章指出,GFW是独立于路由器的。ISP的出口路由器上并不存在GFW这个系统,仅存在一个封包转发器。如果是GFW在和路由同一个内网通过混杂模式来获取封包数据,甚至不需要封包转发程序,但是这样的设计会导致扩展性下降。

整个过程是这样的:客户端发出封包,主干路由接收到后,并不会对这个封包做任何处理。这个封包无论是否存在非法内容,都会被传送到服务器端。但是与此同时,路由器会把这个包复制一份到GFW。GFW接受到拷贝的封包之后,如果发现有违禁内容,就会同时向客户端和服务器端发出几个flag为 rst(REST)的封包。也就是说,客户端和服务器端,所有的封包传递,都是按正常来进行的,只不过如果存在违禁内容,GFW就会发送干扰包,导致客户端或者服务器端异常中断连接。

那篇文章还提到了一个跨越GFW的方法,就是在客户端和服务器端都利用iptables等防火墙工具来过滤rest包。GFW之所以要往两端发送 REST,也正是因为可以通过这种简单的手段来忽略GFW。如果只发送REST给客户端,那么我要穿墙,就太简单了,只需要自己过滤REST包就OK。但是两端都发送的话,导致穿墙成本增加。因为像flickr,他们估计就不愿意为了我一个人而去给服务器增加这个防火墙规则,当然如果全体大陆人民去要求,他们还是会考虑的。而要设置这样的防火墙,也不是每个用户都能做到的,例如我妈妈就做不到。

GFW这样的架构,可以很方便的对GFW进行改进和升级,增加硬件,而不需要对出口路由进行修改。而新的出口路由加入,也不需要对其植入GFW。而路由器不需要进行复杂的关键词过滤逻辑处理,几乎没有性能上的下降。这种平行的设计,使得GFW扩展性很好,简直就是低耦合设计的一个典范。

我看完文章之后利用tcpdump和curl也做了一下试验,通过tcpdump的抓包来看,确实如文中所说,有REST包的回馈。而且一次就发送3或者4个。可惜我没有国外的服务器,否则就可以验证一下文章所提到的翻墙方法了。

那篇文章给出的防火墙规则:
linux的话
iptables -A INPUT -p tcp –tcp-flags RST RST -j DROP
如果是BSD家族(包括mac osx),一般可以
ipfw add 1000 drop tcp from any to me tcpflags rst in

我上面提到的REST包,就是TCP包的头部信息里,RST位被置为1。具体可以看维基百科的TCP条目。

所谓的混杂模式,就是网卡不过滤经过的包,全部接纳扔给操作系统。我们一般用的网卡都会过滤掉mac地址不属于本机的包的,这个是在link层完成的,而不是IP这层。现在很多机房里的监测系统,都是利用混杂模式来实现的。

没有评论: