当前位置: > Linux服务器 > nginx >

nginx 自动屏蔽攻击者ip

时间:2020-01-03 11:46来源:linux.it.net.cn 作者:IT
脚本的大体实现思路:
过滤最近30分钟的日志,通过去重,过滤出访问网站的客户ip,在30分钟内访问某些接口超过500次的,自动写到black_ip文件里。nginx使用deny ip; 的方式拒绝提供服务。

因为日志没有做切割,所以使用tail -n 40000 的方式获取最近30分钟的日志,由于我们网站的日志量不是很大,我过滤的40000行的数据完全覆盖了最近30分钟的日志数据。需要注意。
还有就是这台服务器上运行着多个网站,所以用了一个for循环,生成每个网站的black_ip文件。

#!/bin/bash
date_Y_m_d=`date +%Y-%m-%d`
date_30m_ago=`date -d  '30 minute ago' +%H:%M`
date_now=`date +%H:%M`
log_path='/var/logs/xxx/access'
log_file=$(ls *.log)
black_ip_file=/usr/local/nginx/conf/black_ip_file
tmp_black_ip=/tmp/black_ip.log
black_ip_all=/usr/local/nginx/conf/black_ip_all.conf
nginx_cmd=/usr/local/nginx/sbin/nginx

cd ${log_path}

for i in $log_file;do

  tail -n 40000 $i|egrep 'api|apis|app|web' |sed -n "/${date_Y_m_d}T${date_30m_ago}/,/${date_Y_m_d}T${date_now}/p" | jq .client|awk '{ip[$1]++}END{for (i in ip) print ip[i],i}'|awk '{if ($1 > 500) print "deny "$2";" }' |tee ${tmp_black_ip}

  project_name=$(echo $i|awk -F '.' '{print $1}')

  ## 留存记录,定期检查大于1000 的ip 放入iptables里永久拒绝
  cat ${black_ip_file}-${project_name}.conf >> ${black_ip_all}

  grep -v -f ${black_ip_file}-${project_name}.conf ${tmp_black_ip} |tee ${black_ip_file}-${project_name}.conf

done

##重启nginx

${nginx_cmd} -s reload

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容