从中文来讲,根据ngnix的访问日志进行自动封禁ip的功能
这个主题首先就是两个点 :
- 解析nginx的access.log访问日志,提取IP和判断数量
- 对超过一定访问限制的IP拉入小黑屋
解决方案
一、实现具体算法:用AWK统计access.log
,记录每分钟访问超过60次的ip
awk ‘{print $1}’ access.log | sort | uniq -cd | awk ‘{if($1>60)print $0}’
- awk ‘{print $1}’ access.log 取出access.log的第一列即为ip。
- sort | uniq -cd 去重和排序
- awk ‘{if($1>60)print $0}’ 判断重复的数量是否超过60个,超过60个就展示出来
二、编写完整shell脚本
##########################################
# 根据ngnix的访问日志进行自动封禁ip的功能
# Powered by zhengkai.blog.csdn.net
##########################################
#重置黑名单列表
echo "" > /usr/local/nginx/conf/blacklist.conf
#统计数据功能
ip_list=$(awk '{print $1}' access.log | sort | uniq -cd | awk '{if($1>60)print $0}')
#判断这个变量是否为空
if test -z "$ip_list"
then
#重启ngnix
/usr/local/nginx/sbin/nginx -s reload
#重置日志
echo "" > /usr/local/nginx/logs/access.log
else
#如果不为空 前面加上 deny格式和ip写入黑名单中
echo "deny" $ip_list > /usr/local/nginx/conf/blacklist.conf
#去除掉前面的行数,写入后在读取一次
ip_list2=$(awk '{print $3}' /usr/local/nginx/conf/blacklist.conf)
#清洗格式再次写入正确所需的黑名单数据
echo "deny" $ip_list2";"> /usr/local/nginx/conf/blacklist.conf
#重启ngnix
/usr/local/nginx/sbin/nginx -s reload
#重置日志
echo "" > /usr/local/nginx/logs/access.log
fi
三、 使用crontab等定时任务来触发脚本
crontab -e
* * * * * cd /usr/local/nginx/logs/ && sh ip_blacklist.sh 每一分钟运行一次
systemctl restart crond.service
- 每一分钟运行一次:
* * * * *
,更多用法可以到LINUX - crontab去探索 - 重启一下配置