注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

关于tcp Syn flood 攻击的一个防范参考方案  

2014-07-13 14:09:09|  分类: linux安全技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    根据linux的工作机制,可以防范tcp Syn flood 攻击的入手之处于如下几个方面:
          1)提高记录tcp_syn的hash大小,笔者系统默认tcp_max_syn_backlog为256;修改为2048;

  # sysctl -w net.ipv4.tcp_max_syn_backlog=2048

        # sysctl -w    net.core.netdev_max_backlog=3000

 2)打开系统关于tcp_syn攻击的防止开关,即只对有cookies记录的请求进行处理;

  #sysctl -w net.ipv4.tcp_syncookies=1

3)减少tcp_syn握手重试的次数,改为3,默认为5次;

  #sysctl -w net.ipv4.tcp_synack_retries=3

  #sysctl -w net.ipv4.tcp_syn_retries=3

4)减小hash表中同一条syn消息生存周期,为tcp_syn的hash表提供快速的清理.

       #net.ipv4.tcp_fin_timeout=30
               #net.ipv4.tcp_keepalive_time=1800

5)使用防火墙控制列表来防止SYN的攻击,在一定程度上减缓了syn的攻击

 #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

 说明: syn--limit 1/s 限制syn并发数每秒1次,当然可以根据情况调整.

6)防端口扫描限制,根据第5项情况调整

 # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

7)防止ping洪泛无限制

 # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

       8) 打开tcp传输内存重复共用开关

             #sysctl -w net.ipv4.tcp_tw_reuse=1
             #sysctl -w net.ipv4.tcp_tw_recycle=1

       9)   sysctl -w fs.file-max = 372901       #整个系统所有可打开文件总数的限制, 可按256/4M(每M64个文件句柄)内存计算值。

************************************************

检测系统遭遇tcp_syn攻击的方法与原理

************************************************

     说明:如下命令可以列举出当前系统TCP半连接的情况列表,如果从一台主机过来的联接请求太多,我们的系统就可被攻击了,此时就需要进行处理了.

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr

      说明:其中uniq命令主要用于将相同行消除;sort即用于将内容进行排队;

               awk -F:表示用awk交替所提交的字符串用":"分隔;

   

*******************************
tcp_syn洪水攻击原因分析
*******************************
产生的基本原理
先从TCP连接建立的过程开始说起:
        TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:
       首先说一下SYN的攻击原理:

  在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

  第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 本来完成三次握手,客户端与服务器开始传送数据.

  如果用户与服务器发起连接请求只进行到第二次握手而不再响应服务器,服务器就会不停地等待用户的确认,如果过多这样的连接就会把服务器端的连接队列占满就会导致正常的用户无法建立连接。
       以上的连接过程在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洪水攻击)。
关于tcp Syn flood 攻击的一个防范参考方案 - itoedr - itoedr的it学苑
参考图示
 
解决方法分析
从防御角度来说,有几种简单的解决方法:
第一种是缩短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报文,同时利用随机改写IP报文中的源地址,以上的方法将毫无用武之地。例如SOCK_RAW返回的套接字通过适当的设置可以自己完全控制IP头的内容从而实现IP欺骗。
其它方法......
  评论这张
 
阅读(55)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017