Nginx 防护CC攻击的两种方法

Nginx 防护CC攻击的两种方法

centoscentos 软件安全防护 2015年5月25日javascript

235 0 0php

Linux就该这么学

CC攻击能够归为DDoS攻击的一种。他们之间都原理都是同样的,即发送大量的请求数据来致使服务器拒绝服务,是一种链接攻击。CC攻击又可分为代理CC攻击,和肉鸡CC攻击。代理CC攻击是黑客借助代理服务器生成指向受害主机的合法网页请求,实现DOS,和假装就叫:cc(ChallengeCollapsar)。而肉鸡CC攻击是黑客使用CC攻击软件,控制大量肉鸡,发动攻击,相比来后者比前者更难防护。由于肉鸡能够模拟正经常使用户访问网站的请求。伪形成合法数据包。防护CC攻击能够经过多种方法,禁止网站代理访问,尽可能将网站作成静态页面,限制链接数量等。html

 

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用。 其特色是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网站服务器中表现较好。java

Nginx虽然能够比Apache处理更大的链接数,可是HTTP GET FLOOD针对的不只仅是WEB服务器,还有数据库服务器。大量HTTP请求产生了大量的数据库查询,能够在几秒以内使数据库中止响应,系统负载升高,最终致使服务器当机。node

本文主要介绍CentOS+Nginx下如何快速有效得防护CC攻击。至于如何安装Nginx就不详细介绍了,有兴趣的读者能够在Nginx官方网站(http://www.nginx.org/)下载源代码进行编译。若是你使用的是Centos5,也可使用rpm包进行安装(http://centos.alt.ru/repository/centos/5/i386/nginx-stable-0.7.65-1.el5.i386.rpm)。
 mysql

 

主动抑制方法

为了让Nginx支持更多的并发链接数,根据实际状况对工做线程数和每一个工做线程支持的最大链接数进行调整。例如设置“worker_processes 10”和“worker_connections 1024”,那这台服务器支持的最大链接数就是10×1024=10240。linux

 

worker_processes 10;nginx

events {web

use epoll;sql

worker_connections 10240;

}

 

 

Nginx 0.7开始提供了2个限制用户链接的模块:NginxHttpLimitZoneModule和NginxHttpLimitReqModule。NginxHttpLimitZoneModule能够根据条件进行并发链接数控制。

例如能够定义如下代码:
 

 

http {

limit_zone   my_zone  $binary_remote_addr  10m;

server {

location /somedir/ {

limit_conn   my_zone  1;

}

}

}

 

 

其中“limit_zone my_zone $binary_remote_addr 10m”的意思是定义一个名称为my_zone的存储区域、my_zone中的内容为远程IP地址、my_zone的大小为10M;“location /somedir/”的意思是针对somedir目录应用规则;“limit_conn my_zone 1”的意思是针对上面定义的my_zone记录区记录的IP地址在指定的目录中只能创建一个链接。

NginxHttpLimitReqModule能够根据条件进行请求频率的控制。例如能够定义如下代码:
 

 

http {

limit_req_zone  $binary_remote_addr  zone=my_req_zone:10m   rate=1r/s;

...

server {

...

location /somedir/ {

limit_req_zone   zone= my_req_zone  burst=2;

}

 

Discuz!是使用比较多的一个php论坛程序。以Discuz!7.0为例,程序目录下有比较多的能够直接访问的php文件,但其中最容易受到攻击的通常有index.php(首页)、forumdisplay.php(板块显示)、viewthread.php(帖子显示)。攻击者通常会对这些页面发起大量的请求,致使HTTP服务器链接数耗尽、mysql数据库中止响应,最终致使服务器崩溃。为了防止上述页面被攻击,咱们能够设定如下的规则进行防护:
 

 

http {

limit_zone   myzone_bbs  $binary_remote_addr  10m;

limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s;

...

server {

...

location ~ ^/bbs/(index|forumdisplay|viewthread).php$ {

limit_conn   myzone_bbs  3;

limit_req zone=bbs burst=2 nodelay;

root   html;

fastcgi_pass   unix:/dev/shm/php-cgi.sock;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;

includefastcgi_params;

}

}

}

 

应用这条规则后,bbs目录下的index.php、forumdisplay.php和viewthread.php这些页面同一个IP只许创建3个链接,而且每秒只能有1个请求(突发请求能够达到2个)。虽然这样的规则通常来讲对正常的用户不会产生影响(极少有人在1秒内打开3个页面),可是为了防止影响那些手快的用户访问,能够在nginx中自定义503页面,503页面对用户进行提示,而后自动刷新。在Nginx中自定义503页面:
error_page   503   /errpage/503.html;

503页面的源代码:

 

 

<html>

< head>

< title>页面即将载入....</title>

< meta http-equiv=content-type c>

< META NAME="ROBOTS" C>

< /head>

< body bgcolor="#FFFFFF">

< table cellpadding="0" cellspacing="0" border="0" width="700" align="center"height="85%">

<tr align="center" valign="middle">

<td>

<table cellpadding="10" cellspacing="0" border="0" width="80%" align="center"style="font-family: Verdana, Tahoma; color: #666666; font-size: 11px">

<tr>

<td valign="middle" align="center" bgcolor="#EBEBEB">

<br /><b style="font-size: 16px">页面即将载入</b>

<br /><br />你刷新页面的速度过快。请少安毋躁,页面即将载入...

<br /><br />[<a href="javascript:window.location.reload();"><fontcolor=#666666>当即从新载入</font></a>]

<br /><br />

</td>

</tr>

</table>

</td>

</tr>

< /table>

< /body>

< /html>

< SCRIPT language=javascript>

function update()

{

window.location.reload();

}

setTimeout("update()",2000);

< /script>

 

 

被动防护方法

虽然主动防护已经抵挡了大多数HTTP GET FLOOD攻击,可是道高一尺魔高一丈,攻击者会总会找到你薄弱的环节进行攻击。因此咱们在这里也要介绍一下被动防护的一些方法。

封IP地址

访问者经过浏览器正常访问网站,与服务器创建的链接通常不会超过20个,咱们能够经过脚本禁止链接数过大的IP访问。如下脚本经过netstat命令列举全部链接,将链接数最高的一个IP若是链接数超过150,则经过 iptables阻止访问:
 

 

#!/bin/sh

status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" --'{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`

NUM=`echo $status|awk '{print $1}'`

IP=`echo $status|awk '{print $2}'`

result=`echo "$NUM > 150" | bc`

if [ $result = 1 ]

then

echo IP:$IP is over $NUM, BAN IT!

/sbin/iptables -I INPUT -s $IP -j DROP

fi

 

运行crontab -e,将上述脚本添加到crontab每分钟自动运行:
* * * * * /root/xxxx.sh

经过apache自带的ab工具进行服务器压力测试:

# ab -n 1000 -c 100 http://www.xxx.com/bbs/index.php

测试完成后,咱们就能够看到系统中有IP被封的提示:

 

 

#tail /var/spool/mail/root

Content-Type: text/plain; charset=ANSI_X3.4-1968

 Auto-Submitted: auto-generated

 X-Cron-Env: <Shell=/bin/sh>

 X-Cron-Env: <HOME=/root>

 X-Cron-Env: <;PATH=/usr/bin:/bin>

 X-Cron-Env: <LOGNAME=root>

 X-Cron-Env: <USER=root>

IP:58.246.xx.xx is over 1047, BAN IT!

 

至此,又一次HTTP GET FLOOD防护成功。

根据特征码屏蔽请求(对CC攻击效果较好)

通常同一种CC攻击工具发起的攻击请求包老是相同的,并且和正常请求有所差别。当服务器遭遇CC攻击时,咱们能够快速查看日志,分析其请求的特征,好比User-agent。下面的是某一次CC攻击时的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate几乎没有正常的浏览器会在User-agent中带上“must-revalidate”这样的关键字。因此咱们能够以这个为特征进行过滤,将User-agent中带有“must-revalidate”的请求所有拒绝访问:
 

 

if ($http_user_agent ~ must-revalidate) {

return 403;

}

 

本文主要介绍了nginx下的HTTP GET FLOOD防护,若是有不对的地方,但愿你们能够向我提出。同时,也但愿你们可以触类旁通,把这种思路应用到apache、lighttpd等常见的web服务器中。

相关文章
相关标签/搜索