前言:有时候服务器会遭受到恶意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;

如图:

nginx封锁恶意IP,并且定时取消的两种脚本_第1张图片

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

执行如下:

wKiom1Y8cSGB1v3_AADzehtU7Kk583.jpg

二、使用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,这个在网上还很少有涉及,我会在之后给出完善的线上使用的脚本,请大家关注。