TCP SYN flooding是最常用的DoS攻击方式。
TCP连接初始化过程称为三次握手(three-way handshake):A连接发起端发送标志有SYN位的TCP数据包到目的端,用于协商参数,初始化连接;B目的端使用SYN/ACK来表明自己的连接参数并确认发起端的连接参数;C发起端收到SYN/ACK后,使用ACK确认目的端连接参数。这样三次TCP包交换,发起端和接收端之前建立一条TCP连接。当目的端TCP/IP收到一个TCP SYN后,就位将要建立的连接预留资源并等待发起端确定连接参数,这对建立稳定高效的TCP连接是必要的。但是如果向目的主机发送大量的TCP SYN,而不回应TCP ACK,使大量连接处于半开状态(half-open),导致预留资源长时间不能释放(直到超时),最终致使目的端资源耗尽。
而UDP flooding利用了UDP传输的无状态性,通过发送大量拥有伪装IP地址的UDP数据包,填满网络设备(主要是路由器或防火墙)的连接状态表,造成服务被拒绝。
Crikey CRC flooding是新出现的一种DoS攻击方式,目标主要是防火墙等纪录连接状态的网络安全设备。为了加速数据包通过防火墙,防火墙通常不会使用Checksum对数据包进行效验,只是把连接添加到连接状态表中;Crikey CRC flooding在TCP和UDP头部加入错误的Checksum值。当这些数据包到达目的主机时,因为Checksum错误会被拒绝。这样,实际上没有建立起来的连接被纪录到了连接状态表中,如果防火墙大量接受到这样的数据包,最终会导致连接状态表被填满,新的连接请求被拒绝。
防范方法
首先在防火墙上限制TCP SYN的突发上限,因为防火墙不能识别正常的SYN和恶意的SYN,一般把TCP SYN的突发量调整到内部主机可以承受的连接量,当超过这个预设的突发量的时候就自动清理或者阻止,这个功能目前很多宽带路由都支持,如海蜘蛛路由,只不过每款路由设置项的名称可能不一样,原理和效果一样。一些高端防火墙具有TCP SYN网关和TCP SYN中继等特殊功能,也可以抵抗TCP SYN flooding,他们都是通过干涉建立过程来实现。具有TCP SYN网关功能的防火墙在收到TCP SYN后,转发给内部主机并记录该连接,当收到主机的TCP SYN/ACK后,以客户机的名义发送TCP ACK给主机,帮助三次握手,把连接由半开状态变成全开状态(后者比前者占用的资源少)。而具有TCP SYN中继功能的防火墙在收到TCP SYN后不转发给内部主机,而是代替内部主机回应TCP SYN/ACK,如果收到TCP ACK则表示连接非恶意,否则及时释放半连接所占用资源。
UDP SYN限制和TCP SYN限制差不多,一般也是设置UDP SYN的突发连接量,但UDP连接在防火墙上控制相对效果要稍差点,我们可以通过一些客户端软件来实现限制单机UDP并发连接数限制,最新发布的海蜘蛛的海盾2.4版就提供了这个功能,效果也还不错。
Crikey CRC flooding主要目标是网络安全设备,需要为防火墙打上安全补丁,使数据包通过时用checksum进行校验,对于checksum错误的TCP和UDP数据包丢弃;减小连接状态条目老化时间,是不活动的连接数目要及时清除,防止填满连接状态表