SYN Flood Attack是什么?

SYN Flood Attack(SYN洪水攻击)是一种典型的 DoS(Denial of Service,拒绝服务)攻击。攻击者通过发送大量伪造的TCP连接请求(SYN包),耗尽目标服务器的资源,使其无法为正常用户提供服务,从而达到"搞崩服务器"的目的。

核心特征

  • 攻击目标:TCP协议的三次握手过程
  • 攻击手段:利用TCP协议的半连接状态
  • 攻击效果:服务器资源耗尽,服务不可用

SYN Flood Attack的阶段

SYN Flood攻击发生在 TCP三次握手过程中,具体来说是攻击者恶意利用第二次握手和第三次握手之间的"半连接"状态。

正常TCP连接 客户端发送SYN 第一次握手 服务器回复SYN-ACK 第二次握手 客户端发送ACK 第三次握手 连接建立成功 全连接状态 SYN Flood攻击 攻击者发送SYN 伪造源IP 服务器回复SYN-ACK 等待ACK 攻击者不回复ACK 连接保持半开 服务器资源被占用 等待超时 SYN Flood攻击阶段

攻击者通过不断发起新的SYN请求但不完成第三次握手,使服务器维持大量半连接状态,最终耗尽系统资源。

SYN Flood Attack原理

正常TCP三次握手流程

服务器 客户端 服务器 客户端 正常连接建立 建立半连接 加入SYN队列 🔴 分配内存约300字节 占用SYN队列槽位 等待ACK超时重传 🔴 占用CPU时间片 保持定时器资源 建立全连接 SYN队列出队 Accept队列入队 ✅ 释放SYN队列槽位 ✅ 转移至Accept队列 SYN (seq=x) SYN-ACK (seq=y, ack=x+1) ACK (ack=y+1)

详细步骤

  1. 第一次握手:客户端发送SYN包(seq=x)给服务器,服务器收到后建立半连接,将连接信息放入SYN队列。资源影响:每个半连接占用约300字节内核内存(存储TCP控制块、序列号、窗口大小等),同时占用SYN队列的一个槽位。正常场景下单个连接资源消耗微不足道,但大量半连接会迅速耗尽内存和队列容量。
  2. 第二次握手:服务器回复SYN-ACK包(seq=y, ack=x+1)给客户端。资源影响:服务器启动超时定时器(默认约60秒),定时器占用内核定时器资源;若客户端未回复ACK,服务器会重传SYN-ACK(默认最多5次),每次重传消耗CPU时间片和网络带宽。
  3. 第三次握手:客户端回复ACK包(ack=y+1)给服务器,服务器收到后建立全连接,连接从SYN队列移到Accept队列。资源影响:SYN队列槽位释放,连接资源转移至Accept队列,等待应用程序调用accept()处理。此时连接才真正完成资源分配,进入正常通信阶段。

SYN Flood攻击流程

服务器 攻击者(伪造IP) 服务器 攻击者(伪造IP) SYN Flood攻击 半连接 🔴 消耗CPU发送SYN-ACK 🔴 等待ACK期间持续占用资源 🔴 资源被锁定60秒 🔴 定时器重传消耗CPU 半连接 ...重复大量SYN请求... 半连接 🔴 系统资源完全耗尽 🔴 服务不可用 SYN (seq=x1) SYN-ACK (seq=y1, ack=x1+1) 不回复ACK SYN (seq=x2) SYN-ACK (seq=y2, ack=x2+1) 不回复ACK SYN (seq=xN) SYN-ACK (seq=yN, ack=xN+1) 不回复ACK

资源影响分析

攻击步骤 服务器资源消耗 具体影响
攻击者发送伪造SYN 内存 + SYN队列槽位 每个伪造SYN消耗约300字节内核内存,SYN队列(默认128~1024个槽位)迅速填满
服务器回复SYN-ACK CPU + 网络带宽 每次回复消耗CPU时间片,大量回复占用出站带宽
攻击者不回复ACK 定时器 + 重传资源 每个半连接锁定资源60秒(默认超时),期间最多重传5次SYN-ACK
重复大量SYN请求 全部资源 内存耗尽、队列溢出、CPU满载,正常连接无法建立

攻击危害分析

资源消耗机制

正常情况下的连接异常处理

  • 单个客户端掉线/掉电:服务器在回复SYN-ACK后未收到ACK,会进行重传
  • 等待约60秒(默认超时时间)后,服务器丢弃该半连接
  • 资源占用有限,影响可控

SYN Flood攻击下的资源消耗

  1. 大量半连接占用:攻击者发送海量SYN包,每个SYN包都会在服务器端创建一个半连接
  2. 资源分配:每个半连接都需要分配内存、CPU时间片等系统资源
  3. 队列溢出:SYN队列有大小限制,当半连接数量超过队列容量时,新的合法连接也无法建立
  4. 系统崩溃:资源耗尽导致服务器无法处理任何请求,服务完全不可用

攻击特点

  • 伪造源IP:攻击者通常使用虚假IP地址,使服务器无法追踪真实来源
  • 分布式攻击:可能来自多个攻击源同时发起攻击(DDoS)
  • 低成本高效果:攻击者只需发送SYN包,不消耗大量带宽,但能造成严重破坏

SYN Flood Attack的防御措施

防御SYN Flood攻击的核心思路是:不为每个SYN包立即分配完整资源,而是先验证连接的合法性。只有当客户端完成完整的TCP三次握手后,才为其分配完整的连接资源。

防御策略分类

1. 操作系统层面优化

  • 调整TCP参数:减小SYN超时时间、增大SYN队列长度
  • 启用SYN Cookie:最有效的防御手段之一
  • TCP连接监控:实时监控半连接数量,异常时触发防护机制

2. 网络设备防护

  • 防火墙规则:限制单个IP的连接频率
  • 负载均衡:分散攻击流量到多个服务器
  • DDoS防护设备:专业设备识别并过滤恶意SYN包

3. 应用层防护

  • 连接验证:在应用层增加握手验证
  • 速率限制:限制新连接建立速率
  • IP黑名单:封禁恶意IP地址

具体防御手段:SYN Cookie

工作原理

客户端发送SYN

服务器收到SYN

计算Cookie值
基于源IP、端口、时间戳等

发送SYN-ACK
序号=加密的Cookie

客户端回复ACK
确认号=Cookie+1

服务器验证Cookie
确认号-1 = 原始Cookie?

分配资源
建立全连接

丢弃连接
不分配资源

详细流程

  1. 收到SYN包:服务器收到客户端的SYN请求
  2. 计算Cookie:服务器基于源IP、目标IP、源端口、目标端口、时间戳等信息,通过加密算法计算出一个Cookie值
  3. 发送SYN-ACK:服务器将计算出的Cookie值编码到TCP序列号中,发送给客户端
  4. 客户端回复ACK:客户端按照TCP协议规范,将收到的序列号+1作为确认号回复给服务器
  5. 验证Cookie:服务器收到ACK后,将确认号-1得到原始Cookie值,验证其合法性
  6. 建立连接:验证通过后,服务器才分配资源建立全连接

SYN Cookie的优势

  • 无状态防御:服务器不需要为每个SYN包保存状态信息
  • 资源节约:只有合法的连接才会消耗服务器资源
  • 兼容性好:对正常客户端透明,不影响合法连接建立
  • 抗攻击能力强:能有效抵御大规模SYN Flood攻击

连接队列详解

渲染错误: Mermaid 渲染失败: Cannot set properties of undefined (setting 'style')

🔴 红色标注说明:图中红色高亮部分为SYN Flood攻击影响的关键路径。攻击者(红色节点)发送大量伪造SYN包,通过红色粗箭头注入SYN队列(红色边框),导致SYN队列被半连接填满,正常客户端的SYN请求无法入队,最终服务拒绝。

队列说明

  • SYN队列(半连接队列):存储处于SYN_RECV状态的连接,即已完成第一次握手,等待第三次握手的连接。攻击影响:队列容量有限(默认值通常为128~1024),攻击者发送大量伪造SYN包可迅速填满该队列。
  • Accept队列(全连接队列):存储已完成三次握手,等待应用程序accept()的连接。攻击影响:由于SYN队列被填满,新连接无法完成三次握手,Accept队列将长期处于空置状态,应用程序无连接可处理。

正常流程

  1. 客户端发送SYN → SYN队列添加记录(占用一个槽位)
  2. 服务器回复SYN-ACK(启动超时定时器)
  3. 客户端回复ACK → SYN队列移除记录,Accept队列添加记录(释放SYN队列槽位)
  4. 应用程序调用accept()从Accept队列获取连接(释放Accept队列槽位)

攻击影响

  • 🔴 SYN Flood攻击使SYN队列迅速填满(每个伪造SYN占用一个槽位,持续约60秒)
  • 🔴 新连接无法进入SYN队列,导致服务拒绝(正常用户的SYN包被丢弃)
  • 🔴 系统资源被大量半连接占用(内存、CPU、定时器资源全面耗尽)
  • 🔴 即使攻击停止,已占用的半连接仍需等待超时释放,恢复时间较长

其他防御技术

1. SYN Proxy(SYN代理)

在客户端和服务器之间增加代理层,由代理完成三次握手验证后再将合法连接转发给真实服务器。

2. 首包丢弃策略

随机丢弃部分SYN包,如果是攻击者伪造的SYN,由于源IP虚假,不会重传;如果是正常客户端,会重传SYN包。

3. 连接速率限制

限制单个IP地址在单位时间内的新建连接数,防止单个攻击源发起大量连接。

4. 流量清洗

通过专业的DDoS防护服务,在流量进入服务器前清洗掉恶意SYN包。

实践建议

  1. 监控指标
  • 监控SYN队列使用率
  • 监控新建连接速率
  • 设置半连接数量告警阈值
  1. 多层防御
  • 网络层:防火墙规则、DDoS防护
  • 系统层:SYN Cookie、参数优化
  • 应用层:连接验证、速率限制

通过综合运用这些防御措施,可以有效缓解甚至完全防御SYN Flood攻击,保障服务的稳定运行。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐