查看: 662|回复: 1

syn flood是当前最流行的dos(拒绝服务攻击)

 关闭 [复制链接]

签到天数: 84 天

连续签到: 0 天

[LV.6]常住居民II

发表于 2008-4-9 07:55 | 显示全部楼层 |阅读模式
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给客户端)并等待一段时间后丢弃这个未 完成的连接,这段时间的长度我们称为syn timeout,一般来说这个时间是分钟的数量级(大约为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报文中的源地址,以上的 方法将毫无用武之地。

[s:2]
PCOS系统下载站:http://zhuangji.wang

签到天数: 84 天

连续签到: 0 天

[LV.6]常住居民II

 楼主| 发表于 2008-4-9 07:55 | 显示全部楼层

syn flood是当前最流行的dos(拒绝服务攻击)

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给客户端)并等待一段时间后丢弃这个未 完成的连接,这段时间的长度我们称为syn timeout,一般来说这个时间是分钟的数量级(大约为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报文中的源地址,以上的 方法将毫无用武之地。

[s:2]
PCOS系统下载站:http://zhuangji.wang

本版积分规则