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 技术

(完)