热门课程

免费试听

上课方式

开班时间

当前位置: 首页 -   文章 -   新闻动态 -   正文

SYN Flood 的基本原理

知了堂姐
2024-07-08 17:22:16
0

SYN Flood 是当前最流行的 DoS(拒绝服务攻击)与 DDoS(分布式拒绝服 务攻击)的方式之一,这是一种利用 TCP 协议缺陷,发送大量伪造的 TCP 连接 请求,从而使得被攻击方资源耗尽(CPU 满负荷或内存不足)的攻击方式。要 明白这种攻击的基本原理,还是要从 TCP 连接建立的过程开始说起:大家都知道,TCP 与 UDP 不同,它是基于连接的,也就是说:为了在服务 端和客户端之间传送 TCP 数据,必须先建立一个虚拟电路,也就是 TCP 连接, 建立 TCP 连接的标准过程是这样的: 首先,请求端(客户端)发送一个包含 SYN 标志的 TCP 报文,SYN 即同步 (Synchronize),同步报文会指明客户端使用的端口以及 TCP 连接的初始序 号;

第二步,服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 的报 文,表示客户端的请求被接受,同时 TCP 序号被加一,ACK 即确认 (Acknowledgement)。

第三步,客户端也返回一个确认报文 ACK 给服务器端,同样 TCP 序列号被 加一,到此一个 TCP 连接完成。 以上的连接过程在 TCP 协议中被称为三次握手(Three-way Handshake)。 问题就出在 TCP 连接的三次握手中,假设一个用户向服务器发送了 SYN 报文后 突然死机或掉线,那么服务器在发出 SYN+ACK 应答报文后是无法收到客户端 的 ACK 报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再 次发送 SYN+ACK 给客户端)并等待一段时间后丢弃这个未完成的连接,这段 时间的长度我们称为 SYNTimeout,一般来说这个时间是分钟的数量级(大约 为 30 秒-2 分钟);一个用户出现异常导致服务器的一个线程等待 1 分钟并不是 什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为 了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的 CPU 时间和内存,何况还要不断对这 个列表中的 IP 进行 SYN+ACK 的重试。实际上如果服务器的 TCP/IP 栈不够强 大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器

端也将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的正常请求(毕竟 客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响 应,这种情况我们称作:服务器端受到了 SYN Flood 攻击(SYN 洪水攻击)。 从防御角度来说,有几种简单的解决方法,第一种是缩短 SYN Timeout 时间, 由于 SYN Flood 攻击的效果取决于服务器上保持的 SYN 半连接数,这个值 =SYN 攻击的频度 x SYN Timeout,所以通过缩短从接收到 SYN 报文到确定这 个报文无效并丢弃改连接的时间,例如设置为 20 秒以下(过低的 SYN Timeout 设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。

第二种方法是设置 SYN Cookie,就是给每一个请求连接的 IP 地址分配一个 Cookie,如果短时间内连续受到某个 IP 的重复 SYN 报文,就认定是受到了攻 击,以后从这个 IP 地址来的包会被一概丢弃。 可是上述的两种方法只能对付比较原始的 SYN Flood 攻击,缩短 SYN Timeout 时间仅在对方攻击频度不高的情况下生效,SYN Cookie 更依赖于对方使用真实 的 IP 地址,如果攻击者以数万/秒的速度发送 SYN 报文,同时利用 SOCK_RAW 随机改写 IP 报文中的源地址,以上的方法将毫无用武之地。 

大家都在看

2021前端还好找工作吗?

2024-07-08 浏览次数:0

什么是 CSRF 攻击?如何避免?

2024-07-08 浏览次数:0

java就业要求有哪些?Java就业难别慌

2024-07-08 浏览次数:0

没有基础学java难吗?基础差的人怎么学Java

2024-07-08 浏览次数:0

教你使用UmiJS框架开发React

2024-07-08 浏览次数:0

数据结构的三种基本类型包括哪三种?最常用的是什么

2024-07-08 浏览次数:0
最新资讯