1.思路
- 编写封禁IP的shell脚本,实现判定恶意IP逻辑功能,如判定为恶意IP,则加到Nginx配置文件中锁定
- 使用crontab定时判定恶意IP
- 编写解封IP的shell脚本
- 使用crontab定时解封
2.执行脚本
2.1封禁IP判断
#!/bin/bash
#日志路径
nginx_log="/usr/local/nginx/logs"
#锁定配置文件路径
block_file="/usr/local/nginx/conf"
#锁定脚本路径
exec_path="/usr/local/nginx/block"
#日志查询条数
line=5000
#过量条数
max=500
ip_list=$(tail -n $line $nginx_log/access.log | awk '{print $1}' | sort | uniq -cd | awk '{if($1>'"$max"')print $0}' |awk '{print $2}')
#判断这个变量是否为空
if test -z "$ip_list"
then
echo "$(date +'%F %T') 最近$line个请求里没有请求次数超过$max的IP" >>$exec_path/check.log
else
for ip in $ip_list
do
echo "deny $ip;" >> $block_file/banned_ip.conf
echo "$(date +'%F %T') $ip 超过限制,添加到黑名单!" >>$exec_path/check.log
done
/usr/local/nginx/sbin/nginx -s reload
fi
2.2解封
block_file="/usr/local/nginx-new/conf"
exec_path="/usr/local/nginx-new/block"
echo "" >> $block_file/banned_ip.conf
echo "$(date +'%F %T') 已清理锁定IP" >>$exec_path/check.log
/usr/local/nginx/sbin/nginx -s reload
2.3定时任务
#每十分钟执行一次判断
*/10 * * * * /usr/local/nginx-new/block/block.sh
#每天早上5点清空锁定的IP
0 5 * * * /usr/local/nginx-new/block/cleanBlockIp.sh
3.解读
- 本判定脚本为每5000条中超过500次的IP,因生产环境中日志文件过大,故不取每分钟超过60次等方法,此计数不可为累计,会有误判。
- 脚本执行后需有成功与否的相应日志输出,方便后期监测