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

前言:有时候服务器会遭受到恶意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,这个在网上还很少有涉及,我会在之后给出完善的线上使用的脚本,请大家关注。

时间: 2024-12-22 21:13:47

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

检查多个IP是否ping通的两种脚本

前言:一下两个脚本,实现对多个地址不连续的ip进行ping测试,两个脚本的功能是一样的,脚本如下: 第一个脚本: #!/bin/bash cat iplist|while read line  #iplist是存放IP的文档,与脚本放在一个路径,格式为每行一个IP地址 do ping -c2 $line>/dev/null if [ $? = 0 ] then echo "$line is up!" else echo "$line is down" fi d

nginx 重定向跳转和不跳转两种需求

背景:在日常运维中经常会碰到需要从一个链接跳转到另一个链接的情况,此类需求分为两种情况,一种是浏览器url变,一种是浏览器url不变. 一.Url变,使用nginx rewirte模块 rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记. flag标记分为下面4仲: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redire

两种方法设置nginx并发限制下面的白名单策略

前言: 今天,公司主站突然出现IDE创建应用没反应的问题,经过预发布环境.非代理环境下面的服务测试,均没有问题,定位问题出现在前端.而我们前端有两层代理,一是青松抗D系统,一是我们自己的nginx代理系统.通过web页面测试发现控制台曝出下面的错误: 503 Service Temporarily Unavailable 那么可以断定的确是nginx这一层出现了问题.想想以前的nginx的配置修改及青松系统的接入,找到如下原因: 1. nginx设置单个IP的访问次数: limit_req_zo

Nginx 拒绝指定IP访问

来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/   闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看了之前的日志,无奈鄙站被攻击者盯上了,不断的有不同的IP试图上传木马.看来坏人还是有的.由于不想让鄙站沦为肉鸡,所以就想写个简单的脚本,来阻止攻击者的IP访问. 攻击者: 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-conte

nginx 配置禁用ip地址访问

做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描.拉取.注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables . Nginx 的deny指令或者是程序来ban掉这些恶意请求. iptables 需要root权限配置 下面介绍使用nginx 来配置ip禁用 首选需要我们熟悉nginx 的deny指令 allow 语法:     allow address | CIDR | unix: | all; 默认值:     - 配置段:     http, server

在Nginx下针对IP和目录限速

从Nginx配置与应用详解专题的投票结果来看,Nginx已经是目前仅次于APache和MS IIS的Web服务器.Nginx优秀的高并发支持和高效的负载均衡是我们选择它的理由.但有时我们希望它能做的更多.本文将向您介绍如何在Nginx下对IP和目录进行限速,在某种应用场景下,这也是个常见需求. Nginx可以通过HTTPLimitZoneModule和HTTPCoreModule两个目录来限速. 示例: limit_zone one $binary_remote_addr 10m;     lo

Nginx实现基于ip的访问控制(Ngx_http_access_module模块)

Nginx实现基于ip的访问控制功能:(Ngx_http_access_module) 官方文档:http://nginx.org/en/docs/http/ngx_http_access_module.html 官方示例: The ngx_http_access_module module allows limiting access to certain client addresses.限定资源只被指定的客户端访问. Example Configuration: location / {

python分析nginx日志的ip,url,status

Python 脚本如下: #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'lvnian' #!/usr/bin env python # coding: utf-8 import MySQLdb as mysql import sys, os db = mysql.connect(user="root",passwd="[email protected]",db="intest",

Nginx 限制单个IP的并发连接数及对每个连接速度(限速)

使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击. 再lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/nginx.conf 文件 1.1.8以上版本的nginx的设置: 查找: 复制内容到剪贴板 代码: #limit_conn_zone $binary_remote_addr zone=perip:10m; ,将前面的#去掉,没这一行的,话加上 复制内容到剪贴板 代码: limit_conn_zone