宏观描述:
SYN洪水是一种典型的DoS(Denial of Service,拒绝服务)攻击。攻击效果是将服务器的TCP资源耗尽,从而停止响应正常的TCP连接请求。
具体过程:
此过程是发生在TCP建立连接的三次握手过程中。假设A是客户端,B是服务器。首先A发送SYN消息给B建立请求,然后B反馈SYN-ACK消息,此刻连接处于半开状态。由于B不确定自己发送的SYN-ACK消息是否已送达或者A再次反馈的ACK消息是否丢在半路,所以会给这个半开连接预设一个超时时间,如果这期间仍然没有收到A的ACK消息,那么就会重新发送SYN-ACK消息给A,然后会重试有限次数后放弃连接。
然而,就是因为服务器为了维护半连接状态,会耗费一定的服务器内核资源,一旦攻击方A利用肉机不断的发送大量SYN消息而响应ACK消息,或者伪造SYN消息中的Source IP使得B的SYN-ACK消息石沉大海,服务器维护半开状态直至资源耗尽,那么就会形成所谓的SYN Flood攻击。
解决方案:
(1)提高TCP端口连接容量(提高半开连接队列大小的上限),减少半开连接的资源占用时间(减少等待ACK时间和重试次数)。不推荐这种方式,因为这样会影响部分正常的TCP连接,也会降低不畅网络环境下正常用户的连接成功率。而且这种策略容易被攻击者识别,从而改变攻击策略就能轻松化解。
(2)部署支持IP防伪的路由器,将伪造IP地址的SYN消息过滤掉,此种方式过于理想,不推荐使用,毕竟攻击者可能攻击前都不需要肉机。
(3)SYN Cache,首先构造一个全局的Hash Table,用来缓存服务器的所有半开连接信息,连接成功则从缓存中清除相关信息。我们知道,每个Hash Table中包含多个bucket(桶),每个bucket都有容量限制。这是Key的生成策略就依赖于SYN消息中的Source IP或Port等信息,生成策略需要用到特殊的算法,以此可以将所有的半开连接信息均匀地分布到各个bucket中。这样只有攻击者将所有的bucket都填满,而且速度也需要足够快(正常半开连接还未建立就被踢出bucket)才能起到攻击效果。即使有这样的攻击行为,估计也会早早被发现。推荐使用。
(4)SYN Cookie,首先服务器会将半开连接信息编码成Cookie,用作B给A的消息编号,会随着SYN-ACK消息一同反馈给A,如此一来,服务器在完全建立连接前不保存任何消息,也就不会耗费资源。这也有一些缺点,由于服务器不保存半开连接信息,就丧失了重发SYN-ACK的能力,一方面降低了正常连接的成功率,另一方面可能会让通信双方对于是否成功建立请求会有误解,当然,如果真的遇到这种问题,就只能交给上层策略来另外处理了。