分类: 网络与安全

对TCP连接被重置解决方案的探究——跨过GFW通向自由网络的可行途径

2010年05月25日 星期二 上午 00:19

这个标题有点长——其实开始只想写破折号之前的部分,因为这种技术文章说的隐晦一点没有坏处,但又担心大家不明白是怎么回事,硬着头皮还是补上了后面的部分。

中 国的网络环境很复杂,同时中国也是对互联网高度控制的国家之一,当然仅限于大陆。而控制中国网民自由上网的网络海关正是大名鼎鼎的GFW(Great Fire Wall,长城防火墙),GFW的工作原理就是重置TCP连接,那么在此就不得不提一下TCP协议三次握手的简单原理。

根 据TCP协议的规定,用户和服务器建立连接需要三次握手:第一次握手用户向服务器发送SYN数据包发出请求(SYN, x:0),第二次握手服务器向用户发送SYN/ACK数据包发出回应(SYN/ACK, y:x+1),第三次握手用户向服务器发送ACK数据包发出确认(ACK, x+1:y+1),至此一个TCP连接建立成功。其中x为用户向服务器发送的序列号,y为服务器向用户发送的序列号。

现在 我们来谈谈GFW的工作原理。GFW负责监控全国的TCP连接,当发现敏感词时就会介入,将服务器发回的SYN/ACK包改成SYN/ACK, Y:0,这代表TCP连接被重置,用户便主动放弃了连接,提示连接失败。可以看出,其实GFW就是在欺骗用户,让用户误认为服务器拒绝连接,而主动放弃继 续与服务器连接。

因为GFW是工作在TCP协议层上,这看似坚不可破,可我们不应忽略的是,检测全国TCP连接可不是一个 简单的工作,即便是上千台的分布式计算机也未必有能力逐个TCP连接监控,那么GFW是如何做到的呢?很简单,GFW只在连接发起时监测第一个TCP连 接,这样就可大大提高GWF的工作性能。但就是这样一个提供性能的方法却给GFW留下了一个致命的漏洞,我今天探讨的方案也正是建立在这个漏洞基础上。

首 先我们正常发送SYN数据包到服务器进行第一次握手,之后服务器发回SYN/ACK到用户进行第二次握手,接下来,用户继续发送第一次握手时的SYN数据 包,此时GFW根据TCP协议规则认为本次TCP连接结束,停止了对本次TCP连接用户的监视,而服务器知道TCP连接尚未建立怎么会结束,所以忽略了这 个数据包而不受影响。但我们至此只完成了工作的一半,因为GFW是双向监视的,服务器依然被GFW监控,如果服务器能发回一个连接重置的数据包,GFW也 会停止对服务器的监视。虽说来容易,可服务器并不收用户控制,如何才能让服务器随用户的意愿发送连接重置数据包呢?根据TCP协议规则,如果用户发回的数 据包有错误,服务器就会发回连接重置数据包,前文提到,第三次握手时用户发送的ACK数据包应该是ACK: x+1:y+1,可如果用户发送的是ACK: x+1:y,那么服务器自然会发生连接重置数据包。当GFW收到这个包时,认为服务器也重置了此连接也就不再监视服务器了。但这个连接重置包被用户接收后 不能主动放弃连接,这样就需要用户忽略这个重置数据包,不过用户这边我们说了算,怎么搞都行。至此,GFW不再监视本次TCP的用户和服务器,双方可以自 由通信。

下面我再总结下这个TCP连接的过程:

用户-[SYN, x:0]->GFW-[SYN, x:0]->服务器{第一次握手}

用户<-[SYN/ACK, y:x+1]-GFW<-[SYN/ACK, y:x+1]-服务器{第二次握手}

用户-[RST, x:0]->GFW[认为用户TCP连接结束]-[RST, x:0]->服务器{忽略}

用户-[ACK, x+1:y]->GFW[停止监视用户]-[ACK, x+1:y]->服务器{判断是坏包}

用户{忽略}<-[RST, y:0]-GFW[认为服务器重置连接]<-[RST, y:0]-服务器{重置连接}

用户-[ACK, x+1:y+1]->GFW[停止监视服务器]-[ACK, x+1,y+1]->服务器{第三次握手}

这样,一个三次握手的过程被我们改成了六次握手,成功骗过了GFW,好戏正式开始了。

下 面再来谈谈GFW的一些事吧。GFW并不是我们想象中的那么强大,相反它漏洞百出,非常脆弱。因为GFW是基于分布式的,所以修补漏洞十分困难,如果 GFW更改监视规则而监视所有TCP数据包则会使性能大大降低。另外GFW会记录下访问过敏感信息的ip一段时间,使该ip无法继续与相应服务器连接,那 么这个记录ip的缓存区就一定有上限,自然就有溢出的可能,如果大量ip访问敏感信息,GFW就会因为这个缓存区溢出而无法检视其他的TCP。没错,这个 其实就是DDoS,2010年1月3日前后的“解封”也听说是与北京GFW被DDoS有关。听说GFW有学生参与,而这些筑墙的哈工大和北邮的同学们能力 不一,导致GFW模块质量参差不齐,这也是GFW存在漏洞的重要因素之一。

但最终技术无罪,只是技术被政治所利用才是最大的悲哀。其实不止是中国,美国用来做网络深度检测的CNCI,预算300亿美元,是GWF的多少倍。区别只在于中国的执事者做事太笨拙而又没有底线,导致普通人也能看出破绽。

最后,对这个方案的探索体现了人们对技术的热衷,而对FQ的研究则体现了人们对事实与自由的追求。而不论是从对技术热衷的角度还是从对事实与自由追求的角度,我都很愿意成为他们中的一员。

参考文献:

[1]深入理解GFW,http://gfwrev.blogspot.com/2010/03/gfw.html (墙外)

[2] “西厢计划”原理小解,http://blog.youxu.info/2010/03/14/west-chamber/

[3]简述TCP三次握手过程,并说明为什么要3次握手,http://hi.baidu.com/it_hawk/blog/item/d053ab346830783e5ab5f54e.html

对TCP连接被重置解决方案的探究的更多相关文章

  1. Http权威指南(TCP连接)

    1.HTTP请求的过程 世界上几乎所有的HTTP通信都是由TCP/IP承载的,当发生HTTP请求时,实际上经过了以下几个步骤: ①浏览器从请求的URL中解析主机名 ②浏览器查询这个主机名的IP地址 ③ ...

  2. 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为

    初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...

  3. TCP 连接重置漏洞 - CVE-2004-0230讲解

    TCP 连接重置漏洞 - CVE-2004-0230: IPv6 实施中存在一个拒绝服务漏洞,该漏洞可能允许攻击者向受影响系统发送特制的 TCP 消息. 成功利用此漏洞的攻击者可能会导致受影响系统重置 ...

  4. TCP 连接关闭及TIME_WAIT探究

    这里主要记录一下TCP连接在关闭的时刻,有哪些细节问题.方便在以后的程序设计中能够注意这些细节, 以避免出现这些错误.首先我们来看一下TCP的状态转换图.如<unix网络编程>卷一所示如下 ...

  5. 简述TCP连接的建立与释放(三次握手、四次挥手)

    在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...

  6. 超出TCP连接端口数限制(MaxUserPort)引起的服务器问题

    昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80 ...

  7. 服务器后台TCP连接存活问题

    0. 背景 公司的服务器后台部署在某一个地方,接入的是用户的APP,而该地方的网络信号较差,导致了服务器后台在运行一段时间后用户无法接入,那边的同事反馈使用netstat查看系统,存在较多的TCP连接 ...

  8. “VS2013无法连接远程数据库”解决方案

    “VS2013无法连接远程数据库” 解决方案:以管理员身份登录CMD,输入netsh winsock reset并回车(注意,必须是已管理员身份运行,这个重置LSP连接) 或 netsh winsoc ...

  9. TCP连接的状态详解以及故障排查

    我们通过了解 TCP各个状态 ,可以排除和定位网络或系统故障时大有帮助. 一.TCP状态 LISTENING :侦听来自远方的TCP端口的连接请求 . 首先服务端需要打开一个 socket 进行监听, ...

随机推荐

  1. Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决 中文乱码

    properties文件中想注释中文,但是写出来后却是 :# /4djf/234/4354/r23df/324d  这种效果 是因为字符编码默认没有设置造成的,以前总是安装插件解决此问题, 但是却牺牲 ...

  2. CF 329C(Graph Reconstruction-随机化求解-random_shuffle(a+1,a+1+n))

    C. Graph Reconstruction time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  3. go语言之进阶篇主协程先退出

    1.主协程先退出 示例: package main import ( "fmt" "time" ) //主协程退出了,其它子协程也要跟着退出 func main ...

  4. Android -- Serializable和Parcelable需要注意的

    Serializable 静态变量序列化不会被保存 public class Test implements Serializable { private static final long seri ...

  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十五)Spark编写UDF、UDAF、Agg函数

    Spark Sql提供了丰富的内置函数让开发者来使用,但实际开发业务场景可能很复杂,内置函数不能够满足业务需求,因此spark sql提供了可扩展的内置函数. UDF:是普通函数,输入一个或多个参数, ...

  6. Thinkphp5 使用odbc连接到sqlserver

    在PHP中访问mssql有两个方式 1.安装相应的驱动,如sqlsrv 2.直接使用PHP自带的ODBC驱动(不需要安装)   本文直接使用自带的ODBC驱动 在使用前请确定PHP开启了php_pdo ...

  7. JSP中利用JSTL标签对日期格式化

    数据库:Mysql 开发语言:JAVA 页面类型:JSP 对Mysql中的日期类型格式化,在JSP中,如何办呢,很多人说在JAVA后台去日期格式化,无奈了,于是找到了比较靠谱的答案 需要先引入JSTL ...

  8. Node.js中 express-session的奇怪问题

      var session = require('express-session');   app.use(cookieParser()); 行 登录以后访问的时候有时候会报这样的错误: The la ...

  9. STL 笔记(四) 迭代器 iterator

    stl 中迭代器能够理解为面向对象版本号的广义指针,提供了对容器中的对象的訪问方法,能够遍历容器全部元素.也能够訪问随意元素.stl 迭代器有下面五种: Input iterators   仅仅读,输 ...

  10. HtmlAgilityPack 详细使用

    使用HtmlAgilityPack抓取网页数据 http://www.cnblogs.com/yxlblogs/p/3499420.html http://www.cnblogs.com/xdpxyx ...