FLOOD攻击是最常见的DDOS攻击方式,通过发送海量的syn_ack,syn,ack,fin等报文,占用服务器资源,致使服务不可用。常见的FLOOD攻击包括syn_flood攻击、synack/ack/reset Flood 攻击等。本文简单介绍了FLOOD攻击的常见类型以及对应的防御措施。
一、syn_flood攻击与防御
syn_flood攻击 :SYN-Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。这种攻击早在1996年就被发现,但至今仍然显示出强大的生命力。很多操作系统,甚至防火墙、路由器都无法有效地防御这种攻击,而且由于它可以方便地伪造源地址,追查起来非常困难。
Syn_flood防御:针对syn_flood 有2种比较通用的防护机制
1. cookie源认证:
原理是syn报文首先由DDOS防护系统来响应syn_ack。带上特定的sequence number (记为cookie)。真实的客户端会返回一个ack 并且Acknowledgment number 为cookie+1。 而伪造的客户端,将不会作出响应。这样我们就可以知道那些IP对应的客户端是真实的,将真实客户端IP加入白名单。下次访问直接通过,而其他伪造的syn报文就被拦截。下面为防护示意图:
2.reset认证:
Reset认证利用的是TCP协议的可靠性,也是首先由DDOS防护系统来响应syn。防护设备收到syn后响应syn_ack,将Acknowledgement number (确认号)设为特定值(记为cookie)。当真实客户端收到这个报文时,发现确认号不正确,将发送reset报文,并且sequence number 为cookie + 1。
而伪造的源,将不会有任何回应。这样我们就可以将真实的客户端IP加入白名单。
通常在实际应用中还会结合首包丢弃的方式结合源认证一起使用,首包丢弃原理为:在DDOS防护设备收到syn报文后,记录5元组,然后丢弃。正常用户将重传syn报文,防护设备在收到报文命中5元组,并且在规定时间内,则转发。当重传syn报文到达一定阀值时,在启用上述的源认证。这样就能减少反射syn_ack报文的数量,缓解网络拥堵,同时对防护不产生影响。
二、synack/ack/reset flood 攻击和防御
synack flood攻击: syn_ack报文出现在连接建立的第2个报文,用来确认第一次握手的syn包。当服务器收到syn_ack报文后会在系统里查询是否属于3次握手的范畴。如果属于则回复ack,并将连接设为连接状态。若没有查到相关信息,则回复reset。(这里window协议实现与Linux有所不同,这里仅讨论Linux)。当攻击者发送大量的syn_ack进行攻击时,服务器将会为处理这些报文而消耗大量的资源。
也许你发现这里可能还有另一种潜在的危害,就是当服务器主动外联时,发送完syn,等待synack包时,收到了攻击者发送的synack报文而导致,连接建立失败。其实严格意义上说这种情况是存在的。可这种情形发送在攻击的报文五元组匹配并且seq-ack也正确匹配的情况。概率极低,忽略不计。
synack flood 防御:
1. 如果服务器没有主动发起连接的需求,直接将所以syn_ack包丢弃即可。
2. 如果有对外连接的需求,则可利用源认证的方式防御,具体防护原理为: 向syn_ack的目标IP,端口发送syn报文,能在固定时间内返回,并且序列号匹配则说明该IP,端口确实提高了服务,加入白名单。多次未防护的加入黑名单。
三、其他包类型的flood攻击:
主要的攻击原理都为利用大量的无效数据包,消耗服务器资源。由于攻击报文命中五元组和序列号的概率极低,所以对正常连接破坏有限(服务器资源充足的情况下)。
针对这些类型的攻击的处理方式也正是利用上面的特点。在连接建立的时候,利用syn_reset ,syn_cookie认证,认证通过之后,为每个tcp连接建立一个会话,保存五元组和序列号信息,只有匹配的包才转发到服务器,不匹配的丢弃。
不同类型FLOOD攻击原理不同,我们在进行FLOOD攻击防御时,需要根据不同攻击类别进行针对性防御。