一种常见的DoS(拒绝服务)攻击方式
原理:
在TCP三次握手的过程中,服务器为响应SYN报文段(即TCP三次握手中的第一个数据包),需要分配并初始化SYNACK报文段。
但有这样一种攻击:攻击者发送大量TCP SYN报文段,却不完成第三次握手。也就是当这个服务器返回ACK以后,A不再进行确认。那这个连接就处在了一个挂起的状态(SYN_RCVD),浪费系统资源。此外服务器收不到再确认的一个消息,还会重复发送ACK给A,这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
防御措施:
SYN cookie:
机制:
在TCP服务器接收到TCP SYN分组并返回TCP SYNACK分组时,不分配一个专门的数据区,而是根据这个SYN分组计算出一个cookie值。这个cookie作为将要返回的SYNACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,服务器则生成一个具有套接字的全开的连接。
cookie的计算:
服务器收到一个SYN包,计算一个消息摘要mac。MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。在Linux实现中,MAC函数为SHA1。
mac = MAC(A, k);
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
k为服务器独有的密钥,实际上是一组随机数。
t为系统启动时间,每60秒加1。
MSSIND为MSS对应的索引。
评价:
SYN Cookie技术由于在建立连接的过程中不需要在服务器端保存任何信息,实现了无状态的三次握手,从而有效的
防御了SYN Flood攻击。但同时也提供了另一种拒绝服务攻击方式:攻击者发送大量的ACK报文,服务器忙于计算验证。
另外,SCTP协议应该就是应用了类似的机制实现了四次握手。
- 优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用。