问题场景
继上一篇实现nginx
的日志切割之后,需要解决的问题是ip封禁的问题,不然还是可以拖垮系统。
解决方案
定时抽取日志文件中日访问量大于100的ip地址,将他们写入给名单中。具体的代码实现如下:
#!/bin/bash
log_dir=/usr/local/nginx/logs/access.log
nginx_port=82
day=$(date -d '-1 day' '+%Y%m%d')
nginx_deny_file=$(dirname $log_dir)/nginx_deny.log
if [ ! -f $nginx_deny_file ]; then
touch $nginx_deny_file
fi
# 取出遍历日志文件中访问量>100的ip
for drop_ip in $(grep -v '127.0.0.1' access.log_$day | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if ($1>10) print $2}'); do
num=$(grep $drop_ip $nginx_deny_file | wc -l)
if [ $num -gt 1 ]; then
continue
fi
# 禁止ip访问端口 该方法待验证!!!
iptables -I INPUT -p tcp –-dport $port -s $drop_ip -j DROP
echo ">>>>> $(date '+%Y-%m-%d %H:%M:%S') - 发现异常ip -> $drop_ip" >>$nginx_deny_file
done