服务器, 未分类, 运营维护

巧用Nginx的日志功能配合IPTABLES实现防范基础CC攻击(2013年11月24日8:24:13更新)

Log File

相信不少人都被CC过,我也不例外,因此一直以来想尽各种办法降低PHP所占的资源。

PHP所耗的资源算压下去了,带宽却满了……

之前也看过有人使用Nginx的第三方模块limit req2实现防CC攻击,自己也弄过,但效果没想象中的好,只用了几十分钟我就抛弃了……

昨天其中考试结束后,突然灵机一动,想到一个新的防CC方法。回家后经过多次调试,几经完善,已经基本能正常使用了。

这其中利用了Nginx的日志功能,还有自己写的一个Shell Script。本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

Apache的请移步这里:Apache:只有访客IP的日志格式

首先给Nginx添加一个只有访客IP的日志格式,在nginx.conf的http层加入以下代码:

重启nginx,就会多一个名为iponly的日志格式。本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

顺便提一下:$remote_addr是HTTP请求头,此变量包含访客真实IP地址。更详细的介绍请移步:多重代理时如何防止伪造X-Forwarded-For且获取真实IP

然后修改需要开启防CC的网站配置文件,在server层加入以下代码:

除非nginx对日志目录有写入权限,否则要把这一步也执行了:

然后重启nginx,这样该站点就会多一个只记录访客IP的日志。其中的/var/log/nginx/iponly.log是日志的路径,可以自行更改。

刷新一下网站,看看日志文件里面有没有出现真实IP地址。有的话就代表一切正常。

接下来是最关键的一步,写监控该日志文件的Shell Script。本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

2013年11月24日修改,可同时封禁多个IP:

因为要该Shell Script一直执行,因此我使用while…do…done制作了一个“死循环”。
在第六行写了一个函数ban_ip(),是使用iptables对IP进行封禁,并且完成后给我的邮箱发一封邮件。标题为:“IP和封禁时间”。内容为IP封禁时间和iptables的filter表。本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

为何与200对比?经过我多次测试,发现五秒内200请求数是比较正常的。当然你可以改小或者改大一点。

保存以上代码后,赋予x(执行)权限。

要实现该Shell Script在后台类似daemon,就需要使用nohup这个东西了:

>/dev/null 2>&1表示把执行该shell script所输出的信息(shell script中的几个echo,我调试是时候用的。)重定向至/dev/null里面。

最后面的&代表后台执行。本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

这样的话,即使注销了登录,该Shell Script也一样会在后台执行。

到此文章首发为止,暂未出现误封的情况:

Result

 

看了下日志,就知道此IP不怀好意了:Log File

 

经过多次测试,效果是不错的,但该方法也有不足:仅限于防那些单IP连接数较大的CC攻击。遇到成百上千个IP的攻击,且每IP连接数只有一两个的话,那恐怕安全宝什么的都无能为力了(貌似阿里云的云盾可以,会看到域名后面有尾巴)……本文出自微宇宙(http://zhensheng.im),转载者死一户口本。

Comments are closed.