`

Nginx防CC攻击

阅读更多

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用。 其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网站服务器中表现较好。
Nginx虽然可以比Apache处理更大的连接数,但是HTTP GET FLOOD针对的不仅仅是WEB服务器,还有数据库服务器。大量HTTP请求产生了大量的数据库查询,可以在几秒之内使数据库停止响应,系统负载升高,最终导致服务器当机。

1.主动抑制 
为了让Nginx支持更多的并发连接数,根据实际情况对工作线程数和每个工作线程支持的最大连接数进行调整。例如设置“worker_processes 10”和“worker_connections 1024”,那这台服务器支持的最大连接数就是10×1024=10240。

worker_processes 10;
events {
    use epoll;
    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;
        }
    }
}       


其中“limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s”的意思是定义一个名称为my_req_zone的存储区域,my_req_zone内容为远程IP地址,my_req_zone大小为10M,my_req_zone中的平均请求速率只能为1个每秒;“location /somedir/”的意思是针对somedir目录应用规则;“limit_req_zone zone= my_req_zone burst=2”的意思是针对上面定义的my_req_zone记录区记录的IP地址在请求指定的目录中的内容时最高2个每秒的突发请求速率。
当有连接触发上诉规则时,Nginx会报“503 Service Temporarily Unavailable”的错误,停止用户请求。返回一个503,对服务器来说影响不大,只占用一个nginx的线程而已,相对来说还是很划算的。
为了测试效果,我将以上代码放入Nginx的配置文件,并编写了一个php文件显示phpinfo;另外还写了一个html文件,其中嵌入了多个iframe调用php文件。当我打开这个html文件了,可以看到只有一个iframe中的php文件正常显示了,其他的iframe都显示503错误。


应用举例(Discuz!)
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;
            include        fastcgi_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();"><font color=#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>



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

1)封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每分钟自动运行:
通过apache自带的ab工具进行服务器压力测试:
ab -n 1000 -c 100 http://www.xxx.com/bbs/index.php
测试完成后,我们就可以看到系统中有IP被封的提示:

[root@xxxxxx ~]#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防御成功。

2)根据特征码屏蔽请求(对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服务器中。

分享到:
评论

相关推荐

    nginx防cc攻击

    FreeBSD, network card... in sysctl: sysctl kern.maxfiles=90000 sysctl kern.maxfilesperproc=80000 ... sysctl kern.polling.burst_max=1000 sysctl kern.polling.each_burst=50 sysctl kern.ipc.somaxconn=32768 ...

    Nginx服务器抵御CC攻击的相关配置讲解.pdf

    Nginx安全防御配置

    配置Nginx实现简单防御cc攻击

    本文主要介绍lua+Nginx下如何快速有效得防御CC攻击。至于如何安装Nginx就不详细介绍了,闲话少说,大家请看示例

    Nginx防止流量攻击的配置详解

    大家都知道服务器资源有限的,但是客户端来的请求是无限的(不排除恶意攻击), 为了保证大部分的请求能够正常响应,不得不放弃一些客户端来的请求,所以我们会采用Nginx的限流操作, 这种操作可以很大程度上缓解...

    防止cc攻击监控脚本

    C攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些。这种攻击你见不到虚假IP,见不到特别大的异常流量,但造成...因此,大家有必要了解CC攻击的原理及如果发现CC攻击和对其的防范措施。

    网站安全狗Linux-Nginx版(32位)v2.4.2.gz

    具有DDOS攻击防护、CC攻击防护、Ftp/SSH防暴力破解、SSH远程登录保护、网站漏洞防护、url地址全检测、防盗链、网站特定资源保护、IP黑白名单等功能,全方位防护服务器安全和网站安全。 并支持云端设置。通过安全...

    Nginx服务器抵御CC攻击的相关配置讲解

     以前防CC攻击的方法  为了防范CC,以前的方法一个是限制每个IP的连接数,这在地址范围很广阔的情况下比较难实现;二是限制代理的访问,因为一般的代理都会在HTTP头中带 X_FORWARDED_FOR字段,但也有局限,有的代理...

    一个简单的防CC攻击Shell脚本分享

    主要介绍了一个简单的防CC攻击Shell脚本分享,主要原理是分析apache或者nginx的访问日志,对大量访问的IP加入iptables进行禁止访问,需要的朋友可以参考下

    (阿里云负载均衡)或者 lvs+Tengine(nginx)+lua防护攻击:线上正式使用,可以修改lua达到自己想要效果

    (阿里云负载均衡)或者 lvs+Tengine(nginx)+lua防护攻击(获取用户真实ip):线上正式使用,可以修改lua达到自己想要效果; 记得修改以下获取真实ip function getClientIp() IP = ngx.var....

    Nginx服务器限制IP访问的各种情况全解析

    限制某个IP同一时间段... cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。 HttpLimitReqM

    服务器安全狗linux版(64位) v2.8.17991.gz

    集成了DDOS攻击检测和防御系统、CC攻击防护、Ftp/SSH防暴力破解、SSH远程登录保护、流量统计、帐户监控和设置、登录监控、系统参数快速设置、系统运行状态直观展示、系统状态实时监控、网页木马扫描功能,全方位防护...

    jxwaf:JXWAF(锦衣盾)是一款开源web应用防火墙

    CC 攻击防护 CC 攻击 IP 处理 IP 黑白名单 业务安全防护 TODO Architecture 架构 JXWAF 由 jxwaf 节点与 jxwaf 管理中心组成: [jxwaf 节点] : 基于 openresty 开发 [jxwaf 管理中心]: Environment 环境 jxwaf 节点 ...

    OpenWAF-v0.0.4

    行为分析引擎包含基于频率的模糊识别,防恶意爬虫,人机识别等防探测模块,防CSRF,防CC,防提权,文件上传防护等防攻击模块,cookie防篡改,防盗链,自定义响应头,攻击响应页面等防信息泄露模块。 除了两大引擎...

    waf:使用Nginx+Lua实现的WAF(版本v1.0)

    WAF 使用Nginx+Lua实现自定义WAF(Web application firewall...支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。 支持URL过

    安全盾防火墙服务器版 v2.0

    安全盾防火墙可以对对网站及服务器的CC与DDOS攻击有着良好的防护与过滤的作用,完美解决因网站被攻击造成的服务器CPU过高,宽带占用过高等问题,V2版更增加了对组合策略的支持,完美解决综合攻击.软件特色默认为自动防护...

    nginx黑名单和django限速,最简单的防恶意请求方法分享

    django项目遭遇cc攻击,不要惊慌,这里推荐两招简单实用的技巧。 项目Nginx作为http接入层,分发到django应用,启动10个uwsgi worker。 今日突然发现,网页打开卡顿,打开server一看,cpu100%。 打开uwsgi的log,...

    ngx_lua_rate:ngx_lua_rate

    ngx_lua_rate 功能 针对不同的url, 采用不同的过滤控制频率 针对不同的url参数, 采用不同的过滤控制频率 采用两级灰度机制, 针对不同的频率做出不同的React 有白名单/黑名单机制 ...防御cc攻击 进入灰1阶段次数统计

    luawaf:一种安全且可私有部署的Web应用程序防火墙(WAF)。

    访问控制功能:IP黑白名单控制,地域黑白名单控制(国家省市),URI等级的CC防御 检测正则升级,支持更多更新的攻击类型检测防护 尝试更改为分布式版本 AI引擎测试,效果并不理想。 新写了Go语言版本的中心控制例程...

    国际网址导航系统-PHP

    【可随意调用】新增任意调动各种api数据接口优化广告调用方式{:ad(1)} 更简单方便 时间各种限制都安排好优化手机版若干新增IP黑名单添加 【黑名单提示】新增防cc攻击 【自定义连续刷新时间 禁止访问时间 友情提示】...

Global site tag (gtag.js) - Google Analytics