按时间段拉黑Nginx IP地址

功能描述

  • 内网地址白名单
  • 外网地址白名单
  • 设置查找日志时间范围,单位分钟
  • 设置拉黑阈值
  • 不重复添加已经添加过的地址
  • 次日自动释放拉黑名单
  • 判断是否需要执行 nginx -s reload 命令
#!/bin/bash

#   日志存放目录
LOGS=/data/nginx/wwwlogs/
#   Nginx目录
NGINX_BLOCKIP=/data/nginx/vhost/blockip.conf
#   开始查找时间
STERT_TIME=`date -d "-1 minutes" "+%H:%M:00"`
#   结束查找时间
END_TIME=`date "+%H:%M:%S"`
#   设置访问次数,超出设置值拉黑
#   获取系统当前时间
SYS_TIME=`date "+%Y-%m-%d %H:%M:%S"`
#   设置访问次数超过设置次数就拉黑
COUNT="500"
#   设置内网网白名单
FILTER_1="127.0.0.1|localhost|172.16.8.*"
#   设置外网白名单
FILTER_2="47.97.250.22|47.99.91.29|47.111.151.159|116.62.115.60|47.110.254.174|120.26.218.237|120.26.75.197"
#   过滤已经拉过黑的 IP 地址
FILTER_3=`grep -Ev "^$|^[#;]" "${NGINX_BLOCKIP}" | sed "s/;/ /g" | awk '{printf $2 "|"}'`

#判断是否有blockip.conf文件
if [[ ! -f ${NGINX_BLOCKIP} ]];then
  touch ${NGINX_BLOCKIP}
  echo "${NGINX_BLOCKIP} 文件创建成功!"
else
  echo "${NGINX_BLOCKIP} 文件已经存在,无需创建!"
fi

#   批量查询 Nginx 日志
find ${LOGS} -type f -name "*_nginx.log" -exec cat {} \; | 
#   查找指定范围时间日志
awk -F '":"|","|T|\+' '$3 >="'${STERT_TIME}'" && $3 <="'${END_TIME}'"' | 
#   将客户端 IP 地址筛选
awk -F '":"|","' '{print $8}' | 
#   统计 IP 次数排序
sort | uniq -c | sort -rn | 
#   排查白名单中的 IP 地址,FILTER_3 因为拼接问题所以要这样写
grep -Ev "${FILTER_1}|${FILTER_2}|${FILTER_3}null" | 
#   判断是否超出设定值,并输出到nginx配置文件
awk '{if($1>'${COUNT}')print "# '"${SYS_TIME}"' 次数: "$1" \n deny "$2";"}' >> ${NGINX_BLOCKIP}

#   判断 blockip.conf 是否过期,过期自动生成一个新的
if [ $(stat ${NGINX_BLOCKIP} | awk 'NR==6 {print $2}') == $(date +%Y-%m-%d) ];then
    echo $(date "+%Y-%m-%d %H:%M:%S") "不需要删除" >> /root/t.t
else
    echo $(date "+%Y-%m-%d %H:%M:%S") "需要删除" >> /root/t.t
    echo "# ${SYS_TIME}" > ${NGINX_BLOCKIP}
fi

#   判断是否需要加载 Nginx 配置
if [ $( stat ${NGINX_BLOCKIP} | awk 'NR==6 {split($3,arrar,".");print arrar[1]}' ) == $(date +%H:%M:%S) ];then
    echo $(date "+%Y-%m-%d %H:%M:%S") "需要执行 Nginx -s reload 命令" >> /root/t.t
    #   加载Nginx配置
    docker exec -it nginx nginx -s reload
else
    echo $(date "+%Y-%m-%d %H:%M:%S") "无需执行 Nginx -s reload 命令" >> /root/t.t
fi

版权声明:
作者:Akiraka
链接:https://www.akiraka.net/linux/148.html
来源:Akiraka
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
按时间段拉黑Nginx IP地址
功能描述 内网地址白名单 外网地址白名单 设置查找日志时间范围,单位分钟 设置拉黑阈值 不重复添加已经添加过的地址 次日自动释放拉黑名单 判断是否需要执行……
<<上一篇
下一篇>>
文章目录
关闭
目 录