您的位置:首页 > 运维架构 > Nginx

nginx封锁恶意IP,并且定时取消的两种脚本

2015-11-06 17:25 555 查看
前言:有时候服务器会遭受到恶意IP访问,导致服务器负载很大,这个时候需要把这个IP封锁掉,以下两种脚本即可实现这种功能。封锁IP有两种方式:1,直接通过nginx即可,在配置文件中加入include blockip.conf;2,通过防火墙,加入防火墙规则,使固定的IP不能访问。
两种方式都是在日志文件中检索出访问量异常的IP,并作处理。

这里的脚本功能实现的是,当某个IP访问服务器大于我们设定的一个值后,封锁此IP,当然这个功能在实际中需要对百度、谷歌等爬出识别出来,这个脚本不处理,只要大于我们设定的值,就封锁,更加完善的线上脚本,我会在之后的博客中给出。

网上的脚本都是封锁IP,但是这里我们需要实现定时取消封锁IP的功能,原理就是定时启动两一个脚本,实现对封锁IP的解锁,具体配置如下:

一,nginx封锁IP
脚本逻辑:两个脚本,一个脚本检索出访问量大于固定值的IP,并把这个IP加入到nginx的封锁配置文件中,使用at任务,定时(如一个小时)启用另一个脚本,实现对封锁IP的解锁。步骤如下:
1、打开nginx配置文件:
vim /usr/local/nginx/conf/nginx.conf #这个配置文件根据自己的路径进行配置
2、在server段加入如下语句:
include blockip.conf;
如图:



3、在nginx配置文件的同一路径中新建文件:blockip.conf
touch blockip.conf #现在文件中先不用写入内容
4、编辑脚本,脚本内容如下:
#!/bin/bash
max=5 #我们设定的最大值,当访问量大于这个值得时候,封锁
confdir=/usr/local/nginx/conf/blockip.conf #nginx封锁配置文件路径
logdir=/usr/local/nginx/logs/access.log #nginx访问日志文件路径
echo "">$confdir #先把封锁配置文件中的内容清空
cat $logdir|awk '{print $1}'|sort|uniq -c|sort -n|while read line #截取IP段
do
a=(`echo $line`)
if [ $a -ge $max ] #比较每个访问IP是否大于设定的max值
then
echo "deny ${a[1]};">>$confdir #把“deny IP;”语句写入封锁配置文件中
fi
done
service nginx reload #重置nginx服务
at now+1 hours -f /root/unblockip.sh 一小时后启动解锁执行文件,路径自己定,unblockip.sh文件一定要设置执行权限:chmod +x unblockip.sh
5、以上是检索脚本,解锁脚本如下:
#!/bin/bash

sed -i 's/^/#&/g' /usr/local/nginx/conf/blockip.conf #把nginx封锁配置文件中的内容注释掉
service nginx reload #重置nginx服务,这样就做到了解锁IP
执行如下:



二、使用iptables封锁
封锁逻辑:两个脚本,一个检索出访问量大于我们设定值得IP,并把这个IP添加到防火墙规则中,实现IP封锁,定时(如一小时)后,使用at服务调用另一个脚本,这个脚本把iptables规则清楚,实现对封锁IP的解锁,脚本如下:
1、封锁IP脚本
#!/bin/bash
max=100 #我们设定的最大值,当访问量大于这个值得时候,封锁
logdir=/usr/local/nginx/logs/access.log #nginx封锁配置文件路径
cat $logdir|awk '{print $1}'|sort|uniq -c|sort -n|while read line #截取IP段
do
a=(`echo $line`)
if [ $a -ge $max ] #比较每个访问IP是否大于设定的max值
then
iptables -I INPUT -p tcp --dport 80 -s ${a[1]} -j DROP #把访问量大于设定值的IP加入的防火墙规则中
fi
done
at now+2 minutes -f /root/unipblock.sh #两分钟后(这个可以自己设置)调用另一个脚本,解锁IP
2、解锁IP脚本
iptables -F #这个脚本就是清楚iptables规则

注释:这两个脚本在线上使用的时候会有问题,比如,每次清除iptables规则,那么之前封锁的IP就会被解锁,所以还有需要改善的地方,这里贴出来,就是给大家提供一种思路,定时取消封锁的IP,这个在网上还很少有涉及,我会在之后给出完善的线上使用的脚本,请大家关注。

本文出自 “Let's Linux” 博客,请务必保留此出处http://tsoagta.blog.51cto.com/9747076/1710420
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: