网络安全技术之TCP三次握手及原生缺陷

来源:互联网 发布:单代号搭接网络计划sts 编辑:程序博客网 时间:2024/05/29 07:00

概述

总结一下TCP中3次握手过程,以及其原生的缺陷引起的SYN Flood的介绍
【1】TCP三次握手
【2】SYN Flood

1、TCP连接建立——三次握手

几个概念:
【1】seq:序号,占4个字节,范围[0,4284967296],由于TCP是面向字节流的,在一个TCP连接中传送字节流中的每一个字节都按照顺序编号,此外序号是循环使用的
【2】ACK: 仅当ACK=1时确认字段才有效,当ACK=0时确认字段无效,并且TCP规定,在连接建立后所有的传送报文段都必须要把ACK置为1
【3】SYN:同步序列号,用来发起一个连接。当SYN=1而ACK=0时表明这是一个请求报文段;若对方同意连接,则响应报文中SYN=1,ACK=1
【4】FIN :用来释放一个连接,当FIN=1表示此报文段的发送方数据已经发送完毕,并要求释放链接

1.1、3次握手过程

服务端的TCP进程先创建**传输控制块**TCB,准备接受客户端进程的连接请求,然后服务端进程处于LISTEN状态,等待客户端的连接请求,如有,则作出响应。
1、客户端的TCP进程也首先创建传输控制块TCB,然后向服务端发出连接请求报文段,该报文段首部中的SYN=1,ACK=0,同时选择一个初始序号 seq=i。TCP规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户端进程进入SYN—SENT(同步已发送)状态,这是 TCP连接的第一次握手。
2、服务端收到客户端发来的请求报文后,如果同意建立连接,则向客户端发送确认。确认报文中的SYN=1,ACK=1,确认号ack=i+1,同时为自己选择一个初始序号seq=j。同样该报文段也是SYN=1的报文段,不能携带数据,但同样要消耗掉一个序号。这时,TCP服务端进入SYN—RCVD(同步收到)状态,这是TCP连接的第二次握手。
3、TCP客户端进程收到服务端进程的确认后,还要向服务端给出确认。确认报文段的ACK=1,确认号ack=j+1,而自己的序号为seq=i+1。 TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,因此,如果不携带数据,则下一个报文段的序号仍为seq=i+1。这 时,TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态。这是TCP连接的第三次握手,可以看出第三次握手客户端已经可以发送携带数据的报文段了。
当服务端收到确认后,也进入ESTABLISHED(已建立连接)状态
这里写图片描述
- 总结:客户端的connect在三次握手的第二次返回,而服务端的accept在三次握手的第三次返回。

1.2、关于第三次握手的解释

前两次握手比较容易理解,第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判
比如:客户端发送了一个连接请求报文段A到服务端,但是在某些网络节点上长时间滞留了,而后客户端又超时重发了一个连接请求报文段B该服务端,而后 正常建立连接,数据传输完毕,并释放了连接。但是请求报文段A延迟了一段时间后,又到了服务端,这本是一个早已失效的报文段,但是服务端收到后会误以为客户端又发出了一次连接请求,于是向客户端发出确认报文段,并同意建立连接。那么问题来了,假如这里没有三次握手,这时服务端只要发送了确认,新的连接就建立了,但由于客户端没有发出建立连接的请求,因此不会理会服务端的确认,也不会向服务端发送数据,而服务端却认为新的连接已经建立了,并在一直等待客户端发送数据,这样服务端就会一直等待下去,直到超出保活计数器的设定值,而将客户端判定为出了问题,才会关闭这个连接。这样就浪费了很多服务 器的资源。而如果采用三次握手,客户端就不会向服务端发出确认,服务端由于收不到确认,就知道客户端没有要求建立连接,从而不建立该连接。

2、 缺陷引起的SYN Flood

2.1、SYN Flood 攻击

SYN- Flood攻击是当前网络上最为常见的Dos攻击,也是最为经典的拒绝服务攻击,它就是利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量 的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。这种攻击早在1996年就被发现,但至今仍然显示出强大的生命力。很多操作系统,甚至防火墙、路由器都无法有效地防御这种攻击,而且由于它可以方便地伪造源地址,追查起来非常困难。它的数据包特征通常是,源端送了大量的SYN包,并且缺少三次握手的最后一步握手ACK回复。
原理:攻击者首先IP伪造地址对服务器发起SYN请求,服务器回应(SYN+ACK)包,而真实的IP会认为,我没有发送请求,不作回应。服务 器没有收到回应,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries)。这样的话,对于服务器的内存,带宽都有很大的消耗。攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难。
这里写图片描述

2.2、SYN Flood 防护措施

主要通过以下3种方式:

1. 无效连接监视释放

这种方法不停的监视系统中半开连接和不活动连接,当达到一定阈值时拆除这些连接,释放系统资源。这种绝对公平的方法往往也会将正常的连接的请求也会被释放掉,”伤敌一千,自损八百“

2. 延缓TCB分配方法

SYN Flood关键是利用了,SYN数据报文一到,系统立即分配TCB(传输控制块)资源,从而占用了系统资源,因此有两种技术来解决这一问题

Syn Cache技术
这种技术在收到SYN时不急着去分配TCB,而是先回应一个ACK报文,并在一个专用的HASH表中(Cache)中保存这种半开连接,直到收到正确的ACK报文再去分配TCB

Syn Cookie技术
Syn Cookie技术则完全不使用任何存储资源,它使用一种特殊的算法生成Sequence Number,这种算法考虑到了对方的IP、端口、己方IP、端口的固定信息,以及对方无法知道而己方比较固定的一些信息,如MSS、时间等,在收到对方的ACK报文后,重新计算一遍,看其是否与对方回应报文中的(Sequence Number-1)相同,从而决定是否分配TCB资源

3. 使用SYN Proxy防火墙

原理:
防火墙提供一种SYN代理功能,对试图穿越的SYN请求进行验证之后才放行,当确认了链接的有效性后才向才向内部服务器才起SYN请求,所有无效链接均无法到达内部服务器。防火墙采用的验证链接的有效性方法可以是Syn Cookie技术