TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。
SYN Flood攻击与防御
SYN Flood 指的是攻击者利用工具或者操作僵尸主机,向目标服务器发起大量的TCP SYN报文,当服务器回应SYN-ACK报文时,攻击者不再继续回应ACK报文。这时服务器上存在大量的TCP半连接,服务器的资源会被这些半连接耗尽,无法响应正常的请求。
华为Anti-DDoS解决方案防御SYN Flood攻击的常用方式是源认证,从SYN报文建立连接的“行为”入手,判断是否为真实源发出的请求。源认证方法包括基本源认证和高级源认证两种认证方式。
基本源认证
SYN Flood基本源认证过程如下图所示:
-
当连续一段时间内去往目标服务器的SYN报文超过告警阈值后,Anti-DDoS系统启动源认证机制。源认证机制启动后,Anti-DDoS系统将会代替Web服务器向客户端响应带有错误确认序号的SYN-ACK报文。
-
Anti-DDoS 设备通过校验接收到的对探测报文的响应报文的真实性来确认源 IP 地址的真实性,以防止虚假源攻击。
-
如果没有响应报文,则表示之前的 SYN 报文为攻击, Anti-DDoS 设备不会将该 SYN 报文发给被防护服务器,有效终止了攻击。未匹配白名单的源 IP 地址发出的 SYN 报文则继续被探测。
-
如果有响应报文, Anti-DDoS 设备验证响应报文是否为真实的报文,如果真
实,则表示该源 IP 地址通过源认证, Anti-DDoS 设备将该源 IP 地址加入白名单,在白名单老化前,从此源 IP 地址发出的 SYN 报文都直接被 Anti-DDoS设备转发。
基本源认证方式存在一定的局限性,如果网络中存在某些设备会丢弃带有错误确认序号的SYN-ACK报文,或者有的客户端不响应带有错误确认序号的SYN-ACK报文,基本源认证就不会生效。这时还可以使用高级源认证来验证客户端的真实性。
高级源认证
SYN Flood高级源认证过程如下图所示:
-
当在连续一段时间内去往目标服务器的 SYN 报文超过告警阈值时,Anti-DDoS系统启动源认证机制。源认证机制启动后,Anti-DDoS系统将会代替Web服务器向客户端响应带有正确确认序号的SYN-ACK报文。
-
Anti-DDoS系统通过观察客户端的响应情况,来判断客户端的真实性。
-
如果这个源是虚假源,是一个不存在的地址或者是存在的地址但却没有发送过SYN报文,其不会做出任何响应。
-
如果这个源是真实客户端,其会向服务器发送ACK报文,并对收到的SYN-ACK报文进行确认。Anti-DDoS系统收到ACK报文后,将该客户端的源IP地址加入白名单。同时,Anti-DDoS系统会向客户端发送RST报文,要求重新建立连接。后续这个客户端发出的SYN报文命中白名单直接通过。
无论是基本源认证还是高级源认证,其原理都是Anti-DDoS系统发送SYN-ACK报文来对源进行认证。Anti-DDoS系统收到SYN报文后会反弹SYN-ACK报文。如果网络中存在海量的SYN报文,同样Anti-DDoS系统也会反弹出去海量的SYN-ACK报文,这样势必会造成网络拥塞更加严重。为了避免这个问题,减少反弹的SYN-ACK报文对网络拥塞的影响,Anti-DDoS系统提供了首包丢弃功能。
首包丢弃
TCP 的可靠性保证了面向连接(三次/四次握手),还体现在超时与重传机制。TCP规范要求发送端每发送一个报文,就启动一个定时器并等待确认信息;如果在定时器超时前还没有收到确认,就会重传报文。
首包丢弃功能就是利用了 TCP 的超时重传机制,Anti-DDoS 系统对收到的第一个SYN报文直接丢弃,然后观察客户端是否重传。如果客户端重传了SYN报文,再对重传的SYN报文进行源认证,即反弹SYN-ACK报文,这样就可以大大减少了反弹报文的数量。
实际部署时,将首包丢弃和源认证结合使用。防御SYN Flood攻击时,先通过首包丢弃功能过滤一些攻击报文,当重传的 SYN 报文超过告警阈值后,再启动源认证。这样可以减少反弹的 SYN-ACK报文的数量,缓解网络拥塞情况。
SYN-ACK Flood攻击与防御
通信双方通过三次握手建立一个TCP连接的过程时,SYN-ACK报文出现在第二次握手中,是用来确认第一次握手的。一方收到SYN-ACK报文后,首先会判断该报文是不是属于三次握手范畴之内的报文。如果还在进行第一次握手便又收到了第二次握手的报文,向对方发送RST报文,告知对方其发来的报文有误,不能建立连接。
SYN-ACK Flood攻击是攻击者利用工具或者操控僵尸主机,向目标服务器发送大量的SYN-ACK报文,这些报文都属于凭空出现的第二次握手报文,服务器忙于回复RST报文,导致资源耗尽,无法响应正常的请求。
华为 Anti-DDoS 解决方案使用源认证方式防御 SYN-ACK Flood 攻击,其原理是Anti-DDoS系统向发送SYN-ACK报文的源地址发送SYN报文,相当于发起了第一次握手,以探测该地址是否真实存在。
SYN-ACK Flood源认证过程如下:
-
在连续一段时间内去往目标服务器的SYN-ACK 报文超过告警阈值后,Anti-DDoS系统启动源认证机制。源认证机制启动后,Anti-DDoS 系统向发送 SYN-ACK 报文的源地址发送SYN报文。
-
Anti-DDoS设备通过源IP地址对探测报文的响应报文校验源是否真实存在,以防止虚假源攻击。
-
如果没有响应报文,则表示之前的SYN-ACK报文为攻击, Anti-DDoS设备不会将该SYN-ACK报文发给被防护目标,有效终止了攻击。
-
如果有响应报文, Anti-DDoS设备验证响应报文是否为探测报文的回应报文,如果是,则Anti-DDoS设备将该源IP地址加入白名单,同时会向源地址发送RST报文,断开自己和这个源地址的连接。在白名单老化前,从此源IP地址发出的SYN-ACK报文都直接被Anti-DDoS设备转发。
ACK Flood 攻击与防御原理
在 TCP 三次的握手过程中,ACK 报文出现在第三次握手时,用以确认第二次握手中的SYN-ACK报文。ACK Flood攻击指的是攻击者利用工具或者操控僵尸主机,向目标服务器发送大量的 ACK 报文,服务器忙于回复这些凭空出现的第三次握手报文,导致资源耗尽,无法响应正常的请求。
华为Anti-DDoS解决方案使用会话检查的方式防御ACK Flood攻击。一次正常的TCP连接建立过程,必须先有SYN报文,接着是 SYN-ACK 报文,然后才是 ACK 报文。只有ACK 报文命中了会话,才能说明该报文是正常交互过程中的报文,是真实的报文。
Anti-DDoS系统对ACK报文进行会话检查时,支持基本和严格两种模式。
1.基本模式
使用基本模式时,Anti-DDoS系统对ACK报文进行会话检查,如果ACK报文没有命中会话,Anti-DDoS 系统会允许第一个 ACK 报文通过,并建立会话,以此来对后续ACK报文进行会话检查;如果ACK报文命中了会话,则继续检查报文的序号,允许序号正确的报文通过,序号不正确的报文则被丢弃。
基本模式允许第一个 ACK 报文通过,检查条件比较宽松。如果攻击者发送变源或变端口的 ACK 报文,基本模式会允许报文通过并建立会话,这样会导致攻击报文被放过,影响防御效果。为此,Anti-DDoS 系统还提供了严格模式,检查条件更加严格,防御效果也会更好一些。
2.严格模式
严格模式指的是Anti-DDoS系统对ACK报文进行会话检查时,如果ACK报文没有命中会话,系统直接丢弃报文;如果 ACK 报文命中会话,并且序号正确,系统允许报文通过。
严格模式的检查条件比较苛刻,没有命中会话的 ACK 报文都会被丢弃。在旁路部署动态引流的场景,由于报文来回路径不一致,正常业务的 ACK 报文会因为没有命中会话而被丢弃,因此对正常业务有一定的影响。
FIN/RST Flood攻击与防御
TCP交互过程中还存在FIN报文和RST报文,FIN报文用来关闭TCP连接,RST报文用来断开TCP连接。这两种报文也可能会被攻击者利用来发起DDoS攻击,导致目标服务器资源耗尽,无法响应正常的请求。
华为Anti-DDoS解决方案同样使用会话检查的方式防御FIN/RST Flood攻击。如果FIN/RST报文没有命中会话,系统直接丢弃报文;如果FIN/RST报文命中会话,系统则根据会话创建原因和会话检查结果来判断该报文是否通过。
-
如果会话是由SYN报文或SYN-ACK报文创建的,则允许该FIN/RST报文通过。
-
如果会话是由其他报文创建的(例如 ACK 报文),则进一步检查报文序号是否正确,允许序号正确的报文通过,序号不正确的报文则被丢弃。