此方法用于被动分析nginx日记找出请求数较大的IP,并用iptables封掉,如需主动限制,可参考通过nginx限制ip连接数防CC。
#!/bin/bash
#Created by https://www.haiyun.me
num=100 #上限
cd /home/wwwlogs
for i in `tail access.log -n 1000|awk '{print $1}'|sort|uniq -c|sort -rn|awk '{if ($1>$num){print $2}}'`
#读取最新1000条记录,如果单IP超过100条就封掉。
do
iptables -I INPUT -p tcp -s $i --dport 80 -j DROP
done
加入crontab计划任务
crontab -e
*/5 * * * * sh /path/file.sh #5分钟执行一次
这样会不会出现重复封ip的情况呢?
不会,恶意IP封掉就不能访问web服务了,可根据网站流量适量调整执行周期及读取日志行数。
tail access.log -n 1000|awk '{print $1}'|sort|uniq -c|sort -rn|awk '{if ($1>$num){print $2}}'
不能执行
改成以下就OK了
tail access.log -n 1000|awk '{print $1}'|sort|uniq -c|sort -rn|awk '{if ($1>'$num'){print $2}}'