通过Nginx日志--检测异常访问ip进行封禁

2022-11-21 20:26:09 浏览数 (1)

Nginx日志格式

代码语言:javascript复制
    log_format json '{"@timestamp":"$time_iso8601",'
                    '"clientip":"$remote_addr",'
                    '"request":"$request",'
                    '"http_user_agent":"$http_user_agent",'
                    '"size":"$body_bytes_sent",'
                    '"responsetime":"$request_time",'
                    '"upstreamtime":"$upstream_response_time",'
                    '"upstreamhost":"$upstream_addr",'
                    '"http_host":"$host",'
                    '"url":"$uri",'
                    '"domain":"$host",'
                    '"referer":"$http_referer",'
                    '"status":"$status"}';
    access_log  /var/log/nginx/access.log  json;

脚本内容

可以根据自己需求在进行改进

代码语言:javascript复制
#!/bin/bash
#作者:小胖宇
#博客地址:https://blog.csdn.net/weixin_46152207?spm=1001.2014.3001.5343
#脚本详解:查询出nginx日志中访问量异常的ip进行封禁
#方法有很多可以利用nginx的deny方法,这里采用iptables

#nginx日志位置
nginx_access_log=/var/log/nginx/access.log
ip=/var/log/nginx/ip.txt
#一分钟内ip访问量统计排序
cat /var/log/nginx/access.log | grep `date -d "1 minutes ago"  "%Y-%m-%d"T"%H:%M"`|awk -F '"' '{ print $8 }'  |sort |uniq -c |sort -rn  > ip.txt
for i in `awk '{print $1}' ip.txt`
do
  if [ $i -gt 500 ]; then #设置的阈值为一分钟500
  denyip=`grep $i ip.txt | awk '{print $2}'`
  iptables -I INPUT -s $denyip -j DROP
  echo $denyip > denyip.txt
  fi
done

效果

可以用两种方式进行刷一些日志记录 命令行:循环访问制造大量的记录 也就是通过循环的方式使127.0.0.1作为了异常访问的ip

代码语言:javascript复制
while true; do curl http://127.0.0.1; done

浏览器:

脚本检测是以一分钟之前最为检测范围 错后一分钟执行脚本即可 或者写入计划性任务

结果127.0.0.1不能在进行访问

0 人点赞