GFW,著名的墙,会将国外许多安全技术网站、博客当成xxx网来处理。特别是屏蔽了google,这对于安全学习资料的搜寻来说几乎是致命的。这篇文章主要是想为建设一种完美的透明“×××”方案提供一些思路和部分解决方案。


一、GFW墙的原理。

    (http://ostrich.cc/?p=251 这哥们对GFW研究分析的可谓入木三分。)

    1、IP地址过滤。

        GFW可以直接在IP层抛弃src、dst为特定IP的数据包

    2、域名过滤。

        dns污染。这个要分两个层次:一个是国内dns服务器对特定域名(黑名单上的)会返回一个错误的随机值;另一个是对于用户使用境外dns服务器的情况,GFW可以在tcp层修改dns应答数据包的返回结果,这样的效果和第一个相同,但是对GFW的开销比较大。也可以采用域名检测技术直接pass掉相应的dns请求包。甚至可以直接墙掉境外的dns服务器IP。

    3、关键字检测配合tcp reset。

        对tcp数据包进行关键字检测(域名或者内容)对GFW的开销是比较大的,由于这种检测不能限制tcp连接的建立,所以当GFW检测到某tcp会话出现黑名单关键字时,会向会话两端发送tcp reset,强制断开tcp链路。


二、×××的技术。

    IP地址过滤——使用代理。

    dns污染——使用远程dns解析。

    关键字(域名)检测——使用加密。


    ssh建立sock5+firefox远程dns解析,可以正常×××。

    ***,应该说是最容易的×××方式。


三、现有×××面临的问题。

    1、最主要的就是一旦挂了***或sock5以后,访问国内的网站会变得非常慢。这个主要是因为IP包需要到境外绕一大圈导致的。

    2、远程dns解析,面临国内cdn(只能路由)的挑战。主要原因是国内网通——电信的网间限速,导致跨网互访会变得非常慢。国内服务商会在网通、电信分别部署镜像服务器,前端利用cdn只能路由,分析用户请求的src ip属于网通还是电信,从而引导路由到对于的镜像服务器,从而避免跨网访问导致的速度超慢的问题。而远程dns解析,从境外dns服务器发送查询到国内的cdn时,cdn无法区分这个境外的ip是属于那个网络,就会随机返回地址。这样绕了一圈,远程dns查询返回的服务器IP很有可能是跨网访问的,从而导致访问国内的服务器变慢。


四、解决方案(初步思路)

    1、使用智能路由。

        主要是针对***×××的方式,可以使用智能路由,属于中国的ip地址都从原网关出去,其他的境外ip都从***网关出去。

        这个目前google code有个项目叫“中国路由chnroutes” 。

      http://code.google.com/p/chnroutes/downloads/list,可以区分境内、境外ip,并分别路由。

        

        这种方式面临的主要问题是,一旦应用了该路由表,那么dns就会从***原本的远程解析,变成了境内的本地解析。无论使用缺省的,还是手动配置境外dns服务器,都逃不过GFW的dns污染和cdn的随机分配错误。


    2、dns分类解析

        这种方案是对不同的域名(支持子域名模糊匹配)使用不同的dns解析服务器。

        可以使用dnsmasq(轻量级的dns缓存和DHCP服务器)。


        这种方案面临的问题是需要配置域名/dns-server,不可能覆盖全面。


    3、将两者结合,可以实现国内的IP和域名使用默认网关和dns,国外的域名和IP使用国外的dns(走***网关)和***网关。


        最佳的实现方案是在用户的网关处进行智能路由和dns分类解析。这样对于用户来说就是完全透明的,不影响访问速度,也实现了透明×××。实际中,在局域网中架设这样一个网关服务器,就可以不更改局域网中每个用户的路由表,从而对整个网络实现完美的全透明×××服务。


        实际配置实现正在研究中。有高手指点一二,欢迎给我留言。

        参考实现文章一篇:http://shumeipai.nxez.com/2013/10/26/raspberry-pi-make-a-***-gateway-router.html