最近,我分析了一下日志,发现有同一个ip不断地请求我的短信接口,然后就写一个脚本来自动分析日志对这些IP进行屏蔽,本文介绍如何利用nginx屏蔽ip来实现防止攻击,当然也可以通过iptable来实现。
首先,在nginx的安装目录下面,新建屏蔽ip文件,命名为blockip.conf,以后新增加屏蔽ip只需编辑这个文件即可,格式如下:
deny 165.91.122.67;
再在nginx的配置文件nginx.conf中加入include website/blockip.conf;
下面是我的脚本check_log.sh
#! /bin/bash
log_nginx="/var/log/nginx"
blockfile="/usr/local/nginx/conf/website"
#取出日志中符合条件的ip写入ip.txt,并过滤掉重复的
grep "app/user/getCode" $log_nginx/access.log | awk '{print $1}' | sort -rn |uniq -c |awk '{print $2}' > /home/shell/ip.txt
for ip in `cat /home/shell/ip.txt`
do
result=$(grep $ip $blockfile/blockip.conf)
#判断ip是否已经被屏蔽
if [ -z "$result" ]; then
#分析ip请求的次数
count=$(grep $ip $log_nginx/access.log|grep "app/user/getCode"|wc -l)
#请求次数大于等于20次就进行屏蔽
if [ $count -ge 20 ]; then
echo "deny $ip;" >> $blockfile/blockip.conf
fi
fi
done
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
因为做了日志分割,我这里access.log都是当天的日志,不然分析一次整个日志,较消耗系统资源的(日志较大的情况下),不是很建议。
为了实现分析屏蔽自动化,在这里写个计划任务
*/15 * * * * /home/shell/check_log.sh 每15分钟分析一次
0 0 */3 * * cat /dev/null > /usr/local/nginx/conf/website/blockip.conf 每三天放行所有屏蔽的IP