根据ngnix的访问日志进行自动封禁ip的功能

从中文来讲,根据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}’

  1. awk ‘{print $1}’ access.log 取出access.log的第一列即为ip。
  2. sort | uniq -cd 去重和排序
  3. 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去探索
  • 重启一下配置

猜你喜欢

转载自blog.csdn.net/moshowgame/article/details/128744799