syn flood是一种常见的DOS(denial of service拒绝服务)和Ddos(distributed denial of serivce 分布式拒绝服务)攻击方式。这是一种使用TCP协议缺陷,发送大量的伪造的TCP连接请求,使得被攻击方cpu或内存资源耗尽,最终导致被攻击方无法提供正常的服务。
要明白这种攻击原理,还要从TCP连接的建立说起:
大家都知道,TCP和UDP不同,它提供一种基于连接的,可靠的字节流服务。想要通信的双方,都要首先建立一条TCP连接。这条连接的两端只有通信的双方。TCP连接的建立是这样的:
首先,请求端(发送端)会发一个带有SYN标志位的报文,该报文中含有发送端的初始序号ISN(initinal sequence number)和发送端使用的端口号,该报文就是请求建立连接,
其次,服务器收到这个请求报文后,就会回一个SYN+ACK的报文,同时这个报文中也包含服务器的ISN以及对请求端的确认序号,这个确认序号的值是请求端的序号值+1,表示请求端的请求被接受,
最后,请求端收到这个报文后,就会回应给服务器一个ACK报文,到此一个TCP连接就建立了。
上面也就是典型的TCP三次握手过程(Three-way Handshake)。问题就是在这最后一次的确认里,如果请求端由于某种异常(死机或掉线),服务器没有收到请求端发送的回应ACK。那么第三次握手没有完成,服务器就会向请求端再次发送一个SYN+ACK报文,并等待一段时间后丢弃这个未完成的连接。这个时间长度称为SYN Timeout,一般来说是分钟的数量级(大约30秒到2分钟);一个用户出现异常导致服务器等待一分钟是没有什么问题的。如果有恶意攻击者采用这种方式,控制大量的肉鸡来模拟这种情况,服务器端就要去维护一个大量的半连接表而消耗大量的cpu和内存资源。服务器会对这个半连接表进行一个遍历,然后尝试发送SYN+ACK来继续TCP连接的建立。实际上如果客户的TCP协议栈如果不够强大,最后的结果是服务器堆栈溢出崩溃。即使服务器端足够的强大,服务器也会因为忙于处理攻击者的TCP连接请求而无瑕理会正常的客户的请求,此时从客户端来看,服务器就已经失去响应,这时我们称做服务器遭受了SYN Flood攻击。