分类: 网络与安全

对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. kafka-python的gevent模式和kafka的兼容性

    使用gevent会杀死kafka的consumer线程:据查:kafka-python对gevent的支持不是太好,可以使用pykafka:但是可以kafka-python可以结合eventlet使用 ...

  2. Chapter 4 -- Throwables

    TODO: rewrite with more examples Guava's Throwables utility can frequently simplify dealing with exc ...

  3. 细思极恐-你真的会写java吗?

    导语 自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗 ...

  4. NoSQL数据存储

    些数据库并不是关系型的,不支持 SQL.它们用来处理庞大的数据集.支持更加灵活的 数据定义以及定制的数据操作.这些被统称为 NoSQL(not only SQL) . dbm family dbm格式 ...

  5. Longest Palindromic Substring leetcode java

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  6. 深入理解Javascript window对象

    首先看我们的源代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  7. 微信小程序表单校验WxValidate.js使用

    WxValidate插件是参考 jQuery Validate 封装的,为小程序表单提供了一套常用的验证规则,包括手机号码.电子邮件验证等等,同时提供了添加自定义校验方法,让表单验证变得更简单. 首先 ...

  8. sklearn文本特征提取

    http://cloga.info/2014/01/19/sklearn_text_feature_extraction/ 文本特征提取 词袋(Bag of Words)表征 文本分析是机器学习算法的 ...

  9. [Angular CLI] Build application without remove dist folder for Docker Volume

    When we develop the Angular app inside Docker container, we can simulate Production envioment by bui ...

  10. [Algorithm] Reservoir Sampling

    Given a stream of elements too large to store in memory, pick a random element from the stream with ...