TCP SYN 洪水(又名 SYN 洪水)是一种 分布式拒绝服务 ( DDoS ) 攻击,它利用正常 TCP 三向握手的一部分 来消耗目标服务器上的资源并使其无响应。本质上,使用 SYN flood DDoS,攻击者发送 TCP 连接请求的速度比目标机器处理它们的速度更快,从而导致网络饱和。
攻击描述
当客户端和服务器建立正常的 TCP “三次握手”时,交换看起来像这样:
- 客户端通过向服务器发送 SYN(同步)消息来请求连接。
- 服务器通过向客户端发送 SYN-ACK(同步确认)消息来确认。
- 客户端以 ACK(确认)消息进行响应,并建立连接。
在 SYN 泛洪攻击中,攻击者经常使用虚假 IP 地址向目标服务器上的每个端口发送重复的 SYN 数据包。服务器在没有意识到攻击的情况下,接收到多个明显合法的建立通信请求。它使用来自每个开放端口的 SYN-ACK 数据包来响应每次尝试。
恶意客户端要么不发送预期的 ACK,要么——如果 IP 地址被欺骗——从一开始就不会收到 SYN-ACK。无论哪种方式,受到攻击的服务器都将等待对其 SYN-ACK 数据包的确认一段时间。
在此期间,服务器无法通过发送 RST 数据包来关闭连接,连接保持打开状态。在连接超时之前,另一个SYN 数据包将到达。这使得越来越多的连接处于半开状态——事实上,SYN 泛洪攻击也被称为“半开”攻击。最终,随着服务器的连接溢出表填满,对合法客户端的服务将被拒绝,服务器甚至可能出现故障或崩溃。
虽然上面描述的“经典”SYN 洪水试图耗尽网络端口,但 SYN 数据包也可用于DDoS 攻击,试图用假数据包堵塞管道以实现网络饱和。数据包的类型并不重要。尽管如此,还是经常使用 SYN 数据包,因为它们在默认情况下被拒绝的可能性最小。
缓解方法
尽管现代操作系统能够更好地管理资源,这使得连接表溢出变得更加困难,但服务器仍然容易受到SYN 洪水攻击。
有许多常用技术可以缓解 SYN 洪水攻击,包括:
- 微块——管理员可以在服务器内存中为每个传入的 SYN 请求分配一个微记录(少至 16 个字节),而不是一个完整的连接对象。
- SYN cookie——使用加密散列,服务器发送其 SYN-ACK 响应,其中包含由客户端 IP 地址、端口号和可能的其他唯一标识信息构成的序列号 (seqno)。当客户端响应时,这个哈希值包含在 ACK 数据包中。服务器验证 ACK,然后才为连接分配内存。
- RST cookie——对于来自给定客户端的第一个请求,服务器故意发送无效的 SYN-ACK。这应该会导致客户端生成一个 RST 数据包,告诉服务器有问题。如果收到,服务器知道请求是合法的,记录客户端,并接受来自它的后续传入连接。
- 堆栈调整——管理员可以调整 TCP 堆栈以减轻 SYN 洪水的影响。这可以涉及减少超时直到堆栈释放分配给连接的内存,或者有选择地丢弃传入的连接。
显然,上述所有方法都依赖于目标网络处理大规模 DDoS 攻击的能力,流量以每秒数十千兆(甚至数百千兆)为单位。Imperva 缓解了 38 天的 SYN 泛洪和 DNS 泛洪 多向量 DDoS 攻击。
Imperva DDoS 保护 利用 Anycast 技术 来平衡其高性能清理中心全球网络中传入的 DDoS 请求。凭借其全球网络的综合能力,Incapsula 可以经济高效地超过攻击者资源,从而使 DDoS 攻击无效。该服务可按需扩展,提供充足的资源来应对最大规模的 DDoS 攻击。
为确保业务连续性,Imperva 过滤算法不断分析传入的 SYN 请求,使用 SYN cookie 有选择地将资源分配给合法访问者。这实现了透明的 DDoS 缓解,没有停机时间,任何其他业务中断的延迟。