SYN Flood 攻击
# SYN Flood 攻击
需要先了解 TCP 连接的三次握手机制,可参考:TCP 协议
# 背景
- Client 发送 SYN 包给 Server 后,Server 回给 Client 的 SYN-ACK 一直没收到 Client 的 ACK 确认
- 此时这个连接既没建立起来,也不能算失败
- 需要有一个超时时间让 Server 将这个连接断开,否则这个连接就会一直占用 Server 的 SYN 连接队列中的一个位置
- 大量这样的连接就会将 Server 的 SYN 连接队列耗尽,让正常的连接无法得到处理
- 目前 Linux 下默认会进行 5次 重发 SYN-ACK 包
- 重试的间隔时间从 1s 开始,下次的重试间隔时间是前一次的双倍
- 5次 的重试时间间隔为 1s, 2s, 4s, 8s, 16s,总共 31s
- 第 5次 发出后还要等 32s 就知道第 5次 超时了,所以总共需要
1s + 2s + 4s+ 8s+ 16s + 32s = 63s
,TCP 才会把断开这个连接 - 由于 SYN 超时需要 63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的 SYN 包给 Server(俗称 SYN flood 攻击),用于耗尽 Server 的 SYN 队列
# 什么是 SYN 攻击
- 攻击客户端在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复确认包,并等待客户端的确认
- 由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪
- SYN 攻击是一种典型的 DoS 攻击
# 如何检测 SYN 攻击
- 当在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击
- 在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击
# 如何防御 SYN 攻击
- SYN 攻击不能完全被阻止,除非将 TCP 协议重新设计
- 我们所做的是尽可能的减轻 SYN 攻击的危害,常见的防御 SYN 攻击的方法有如下几种:
- 缩短超时(SYN Timeout)
- 时间增加最大半连接数
- 过滤网关防护 SYN
- cookies 技术
(完)