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 攻击相关推荐

  1. python实现cc攻击_网站如何防CC攻击–巧用nginx

    最近跟大佬练习网站攻防.本来做好了防ddos的准备,没想到大佬花了几分钟就写了个node.js的脚本,直接对我的服务器发起了cc攻击,瞬间服务器cpu跑满,2秒即502.在感叹大佬的技术之外,我也顺便 ...

  2. cc攻击可以消耗服务器性能,服务器简易防CC攻击设置

    本人服务器前段时间受到了DDos和CC攻击,DDoS流量型攻击只能靠带宽来扛住,但CC攻击可以从服务器和应用层面防御和减轻影响.本文介绍受到攻击后,本人在服务器上采取的简易防CC攻击设置. Nginx ...

  3. php防止cc攻击代码,防cc攻击PHP防CC攻击实现代码

    这种时候您的统计系统(可能是量子.百度等)当然也是统计不到的.不过我们可以借助于一些防攻击的软件来实现,不过效果有时并不明显.下面我提供一段PHP的代码,可以起到一定的防CC效果. 主要功能:在3秒内 ...

  4. 使用Discuz!自带参数防御CC攻击以及原理,修改Discuz X 开启防CC攻击后,不影响搜索引擎收录的方法...

    这部份的工作,以前花的时间太少. 希望能产生一定的作用. http://www.nigesb.com/discuz-cc-attacker-defence.html http://bbs.zb7.co ...

  5. 防CC攻击 软件防火墙和WEB防火墙大比较

    本文讲的是 :   防CC攻击 软件防火墙和WEB防火墙大比较 ,   CC攻击是一种成本极低的DDOS攻击方式,只要有上百个IP,每个IP弄几个进程,那么可以有几百上千个并发请求,很容易让服务器资源 ...

  6. 网站防CC攻击软件防火墙和WEB防火墙大比较

    CC攻击是一种成本极低的DDOS攻击方式,只要有上百个IP,每个IP弄几个进程,那么可以有几百上千个并发请求,很容易让服务器资源耗尽,从而造成网站宕机:防御CC攻击,硬件防火墙的效果不怎么明显,因为C ...

  7. Linux系统防CC攻击自动拉黑IP增强版Shell脚本

    Linux系统防CC攻击自动拉黑IP增强版Shell脚本 文章目录 一.Shell代码 二.执行脚本 三.效果测试 四.附加说明 前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原 ...

  8. Linux系统防CC攻击自动拉黑IP增强版(Shell脚本)

    这篇文章主要介绍了Linux系统防CC攻击自动拉黑IP增强版(Shell脚本),需要的朋友可以参考下 前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存 ...

  9. 微信商城游戏被宝塔防CC攻击拦截

    今天遇到一个错误,微信商城一个游戏,极个别客户进游戏被宝塔拦截报错,提示信息如下: 后找到原因如下:因为url中带微信openid,而这个客户的openid中带"–"这个符号,所以 ...

最新文章

  1. 激光雷达(LiDAR)点云数据知多少?
  2. JAVA GUI重要知识点学习心得
  3. 两种计算和输出n内5要么9除尽互惠
  4. CodeForces - 1066C Books Queries(思维)
  5. 图像处理傅里叶变换的理解及其matlab实现
  6. android ota更新app,企业 OTA 更新  |  Android 开源项目  |  Android Open Source Project
  7. matplotlib.pyplot.savefig(*args, **kwargs)保存图片$close()关闭图片
  8. [转载] python中字典copy_python深度复制字典,copy方法与deepcopy方法
  9. [转载]遗传算法介绍
  10. 自定义微信小程序弹框
  11. 让IE中的IFrame透明
  12. Linux安装fcitx输入法
  13. thinkpad指点杆(trackpoint)在WPS的word文档中失效的解决办法
  14. 客快物流大数据项目(三十):软件下载后存放位置
  15. 计算机c盘满了怎么移到d盘去,Win10电脑c盘满了怎么转移到d盘?
  16. 如何解决Cannot send session cache limiter – headers already sent 错误
  17. 带你了解Google搜索引擎的竞价排名是怎样实现的?
  18. TimerTask的简单使用
  19. 自制小笔记_C#后期相关问题解决方案
  20. R语言笔记-R语言数据挖掘方法及应用--1

热门文章

  1. 7-2 jmu-分段函数l (20分)
  2. Java中数组行列互换
  3. 华南师范大学(双一流)徐雪珠副研究员2021年招收化学化工类优秀硕士研究生...
  4. 华天谋企管咨询---如何提升6s管理活动中的执行力?
  5. Print2Flash与FlashPaper功能对比详情
  6. Node.JS中调用JShaman,加密JS代码
  7. 汉语句子的意群和重音_五重音而不是字节-数据存储和检索方法
  8. 麒麟信安携手中望软件打造全国产操作系统+CAD解决方案
  9. Facebook生产的垃圾Fairseq——神一般的传参工具
  10. 小学六年级计算机考试试卷答案,小学六年级英语毕业考试试卷及答案