TCP分三个阶段
- 连接建立(三次握手)
- 数据传输
- 连接释放(四次挥手)
TCP工作过程
TCP连接建立阶段
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP数据传输阶段
- seq为本次发送的数据中的第一个字节的标号
- ack为希望下一次收到的数据中第一个字节的标号
TCP连接释放
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
TCP Flood 攻击
据统计,有90%的DoS攻击使用的是TCP协议,而SYN洪泛优势其中最常见的一种攻击。下面就以SYN Flood代表TCP Flood对这类攻击的基本原理进行描述。
安全缺陷
在3次握手进行的过程中,服务器需要保持所有未完成的握手信息(称为半开连接,即收到了TCP-SYN并发送了SYN-ACK,但第三次握手信息(ACK)未收到的状态)直到握手完成或超时(不同的系统超时长度的设置不同,一般情况下在75秒左右)以后丢弃该信息。而且,半开连接的数量是有限的,比如很多OS设置为1024个,当服务器的半开连接栈用完,服务器将不再接受其他的连接请求。
攻击原理
SYN Flood 攻击就是攻击者向攻击目标发送大量伪造的TCP 连接请求报文,即 SYN 包; 而当攻击目标收到连接请求时,就会在目标的 TCP 协议栈分配资源, 并记录其信息到半连接队列中,同时回应 ACK + SYN; 此时, 攻击者却不再发送ACK 确认报文以完成第三次握手, 而是将继续发送大量的SYN 连接请求包。这样不仅会导致被攻击者在短时间内需要为大量半连接分配内存资源,还会使得系统对后续到来的SYN 包在自身的半连接队列中查找是否有此包的握手信息,从而消耗大量 CPU 资源, 最终造成被攻击者无法向正常用户提供所需服务。
防御策略
-
基于退让的防御策略
a)缩短半连接队列的保持时间。
b)增大半连接队列的大小。
c)负载均衡策略。
-
基于 TCP 协议栈缺陷的防御策略
a)SYN Cookie 技术
Cookie 机制是服务器收到客户端的连接请求后, 系统可简单记录该连接信息,形式即如源 IP、 源端口、 时间戳的三元组。但并不会为其分配资源, 而是根据这个 SYN 包的相关信息计算生成某一 Cookie 值, 并将其作为 ACK + SYN 包的序列号返回给客户端。在接到 ACK 报文时, 就可以第一时间验证报文的三元组信息,如果信息满足条件则进行 Cookie 验证, 否则直接丢弃。
b)SYN Cache 技术
该方法通过一个专用的 HASH 表( Cache) 来保存半连接信息,直至收到 ACK 信息才为连接分配系统资源 (TCB) .
c)SYN Proxy 技术
只有在 SYN 代理确认连接的有效性后, 才向内部服务器发起连接请求。所以当攻击发生时, 攻击造成的危害就将转移到至该代理上,借此以保护服务器端。是基于 SYN Cookie 和SYN Cache 的,这也是对 SYN Cookie 的另一种改进。只是需要注意,一旦代理被攻击破坏, 其保护的服务器也都将无法向外界提供服务,这也成为 SYN Proxy 方法的瓶颈所在。