【网络篇】TCP SYN Flood Attack(洪水攻击)
文章目录
SYN Flood Attack是什么?
SYN Flood Attack(SYN洪水攻击)是一种典型的 DoS(Denial of Service,拒绝服务)攻击。攻击者通过发送大量伪造的TCP连接请求(SYN包),耗尽目标服务器的资源,使其无法为正常用户提供服务,从而达到"搞崩服务器"的目的。
核心特征:
- 攻击目标:TCP协议的三次握手过程
- 攻击手段:利用TCP协议的半连接状态
- 攻击效果:服务器资源耗尽,服务不可用
SYN Flood Attack的阶段
SYN Flood攻击发生在 TCP三次握手过程中,具体来说是攻击者恶意利用第二次握手和第三次握手之间的"半连接"状态。
攻击者通过不断发起新的SYN请求但不完成第三次握手,使服务器维持大量半连接状态,最终耗尽系统资源。
SYN Flood Attack原理
正常TCP三次握手流程
详细步骤:
- 第一次握手:客户端发送SYN包(seq=x)给服务器,服务器收到后建立半连接,将连接信息放入SYN队列。资源影响:每个半连接占用约300字节内核内存(存储TCP控制块、序列号、窗口大小等),同时占用SYN队列的一个槽位。正常场景下单个连接资源消耗微不足道,但大量半连接会迅速耗尽内存和队列容量。
- 第二次握手:服务器回复SYN-ACK包(seq=y, ack=x+1)给客户端。资源影响:服务器启动超时定时器(默认约60秒),定时器占用内核定时器资源;若客户端未回复ACK,服务器会重传SYN-ACK(默认最多5次),每次重传消耗CPU时间片和网络带宽。
- 第三次握手:客户端回复ACK包(ack=y+1)给服务器,服务器收到后建立全连接,连接从SYN队列移到Accept队列。资源影响:SYN队列槽位释放,连接资源转移至Accept队列,等待应用程序调用accept()处理。此时连接才真正完成资源分配,进入正常通信阶段。
SYN Flood攻击流程
资源影响分析:
| 攻击步骤 | 服务器资源消耗 | 具体影响 |
|---|---|---|
| 攻击者发送伪造SYN | 内存 + SYN队列槽位 | 每个伪造SYN消耗约300字节内核内存,SYN队列(默认128~1024个槽位)迅速填满 |
| 服务器回复SYN-ACK | CPU + 网络带宽 | 每次回复消耗CPU时间片,大量回复占用出站带宽 |
| 攻击者不回复ACK | 定时器 + 重传资源 | 每个半连接锁定资源60秒(默认超时),期间最多重传5次SYN-ACK |
| 重复大量SYN请求 | 全部资源 | 内存耗尽、队列溢出、CPU满载,正常连接无法建立 |
攻击危害分析
资源消耗机制
正常情况下的连接异常处理:
- 单个客户端掉线/掉电:服务器在回复SYN-ACK后未收到ACK,会进行重传
- 等待约60秒(默认超时时间)后,服务器丢弃该半连接
- 资源占用有限,影响可控
SYN Flood攻击下的资源消耗:
- 大量半连接占用:攻击者发送海量SYN包,每个SYN包都会在服务器端创建一个半连接
- 资源分配:每个半连接都需要分配内存、CPU时间片等系统资源
- 队列溢出:SYN队列有大小限制,当半连接数量超过队列容量时,新的合法连接也无法建立
- 系统崩溃:资源耗尽导致服务器无法处理任何请求,服务完全不可用
攻击特点
- 伪造源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、目标IP、源端口、目标端口、时间戳等信息,通过加密算法计算出一个Cookie值
- 发送SYN-ACK:服务器将计算出的Cookie值编码到TCP序列号中,发送给客户端
- 客户端回复ACK:客户端按照TCP协议规范,将收到的序列号+1作为确认号回复给服务器
- 验证Cookie:服务器收到ACK后,将确认号-1得到原始Cookie值,验证其合法性
- 建立连接:验证通过后,服务器才分配资源建立全连接
SYN Cookie的优势
- 无状态防御:服务器不需要为每个SYN包保存状态信息
- 资源节约:只有合法的连接才会消耗服务器资源
- 兼容性好:对正常客户端透明,不影响合法连接建立
- 抗攻击能力强:能有效抵御大规模SYN Flood攻击
连接队列详解
🔴 红色标注说明:图中红色高亮部分为SYN Flood攻击影响的关键路径。攻击者(红色节点)发送大量伪造SYN包,通过红色粗箭头注入SYN队列(红色边框),导致SYN队列被半连接填满,正常客户端的SYN请求无法入队,最终服务拒绝。
队列说明:
- SYN队列(半连接队列):存储处于SYN_RECV状态的连接,即已完成第一次握手,等待第三次握手的连接。攻击影响:队列容量有限(默认值通常为128~1024),攻击者发送大量伪造SYN包可迅速填满该队列。
- Accept队列(全连接队列):存储已完成三次握手,等待应用程序accept()的连接。攻击影响:由于SYN队列被填满,新连接无法完成三次握手,Accept队列将长期处于空置状态,应用程序无连接可处理。
正常流程:
- 客户端发送SYN → SYN队列添加记录(占用一个槽位)
- 服务器回复SYN-ACK(启动超时定时器)
- 客户端回复ACK → SYN队列移除记录,Accept队列添加记录(释放SYN队列槽位)
- 应用程序调用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包。
实践建议
- 监控指标:
- 监控SYN队列使用率
- 监控新建连接速率
- 设置半连接数量告警阈值
- 多层防御:
- 网络层:防火墙规则、DDoS防护
- 系统层:SYN Cookie、参数优化
- 应用层:连接验证、速率限制
通过综合运用这些防御措施,可以有效缓解甚至完全防御SYN Flood攻击,保障服务的稳定运行。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)