根据web访问日志,封禁请求量异常的IP,如IP在半小 时后恢复正常则解除封禁

本文主要是介绍根据web访问日志,封禁请求量异常的IP,如IP在半小 时后恢复正常则解除封禁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在网络安全日益受到重视的今天,如何有效防范恶意流量和攻击成为了每个网站管理员必须面对的问题。恶意流量不仅会影响网站的正常运行,还可能导致服务器崩溃,给网站带来不可估量的损失。为了应对这一问题,我们特别推出了一款实用的Bash脚本,能够自动封禁请求量异常的IP,并在半小时后恢复正常时解除封禁。下面,让我们一起来详细了解一下这个脚本的工作原理和使用方法吧!

脚本概述

这款脚本通过分析Web访问日志,自动找出请求量异常的IP地址,并利用iptables进行封禁。当IP在半小时后恢复正常时,脚本会自动解除封禁。这样,既能有效防范恶意流量,又能避免误封正常用户的IP。

完整脚本:

#!/bin/bash ################################################################################ #####根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁 ################################################################################ ####logfile=/data/log/access.log#显示一分钟前的小时和分钟d1=`date -d "-1 minute" +%H%M`d2=`date +%M`ipt=/sbin/iptablesips=/tmp/ips.txtblock(){#将一分钟前的日志全部过滤出来并提取IP以及统计访问次数grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips #利用for循环将次数超过100的IP依次遍历出来并予以封禁for i in `awk '$1>100 {print $2}' $ips`do $ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT echo "`date +%F-%T` $i" >> /tmp/badip.log done}unblock(){ #将封禁后所产生的pkts数量小于10的IP依次遍历予以解封 for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print$1}'|sort -nr` do $ipt -D INPUT $a done $ipt -Z}#当时间在00分以及30分时执行解封函数if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]then #要先解再封,因为刚刚封禁时产生的pkts数量很少 unblockblockelseblockfi

脚本详解

  1. 设置日志文件路径和工具路

logfile=/data/log/access.log  ipt=/sbin/iptables  ips=/tmp/ips.txt

这里我们设置了Web访问日志文件的路径、iptables工具的路径以及一个临时文件用于存储提取出的IP地址和访问次数。

  1. 提取并封禁异常IP

block函数中,脚本首先通过grepawk命令提取出一分钟前的日志中的IP地址,并统计每个IP的访问次数。然后,利用awk命令筛选出访问次数超过100的IP地址,并通过iptables进行封禁。​​​​​​​

block()  {      grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips      for i in `awk '$1>100 {print $2}' $ips`      do          $ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT          echo "`date +%F-%T` $i" >> /tmp/badip.log      done  }

这段代码的工作原理如下:

  • 使用grep命令从日志文件中提取出包含特定时间戳的行。

  • 通过awk命令提取IP地址,并使用sortuniq命令进行排序和去重。

  • 再次使用awk命令筛选出访问次数超过100的IP地址。

  • 利用iptables的-I INPUT命令将这些IP地址添加到INPUT链的开头,并设置REJECT策略,阻止这些IP地址的访问请求。

  • 将被封禁的IP地址和时间戳记录到/tmp/badip.log文件中,以便后续跟踪和审查。

  1. 解封恢复正常的IP

unblock函数中,脚本通过iptables查看当前INPUT链的规则,找出那些被封禁后产生的数据包数量小于10的IP地址,并予以解封。​​​​​​​

unblock()  {      for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print $1}'|sort -nr`      do          $ipt -D INPUT $a      done      $ipt -Z  }

这段代码的工作原理如下:

  • 使用iptables -nvL INPUT --line-numbers命令查看INPUT链的详细规则和行号。

  • 通过grep命令筛选出目标地址为0.0.0.0/0的规则,即那些被封禁的IP地址。

  • 使用awk命令提取出数据包数量小于10的规则的行号。

  • 利用iptables的-D INPUT命令将这些规则从INPUT链中删除,从而解封对应的IP地址。

  • 最后,使用iptables -Z命令将iptables的计数器清零。

  1. 定时执行解封和封禁操作

脚本的最后部分是一个条件判断语句,用于在特定的时间(每小时的00分和30分)执行解封操作,并在其他时间执行封禁操作。这样可以确保被封禁的IP地址在半小时后恢复正常访问。

使用方法

  1. 将以上脚本保存为一个文件(例如:block_unblock_ips.sh)。

  2. 为脚本添加执行权限:chmod +x block_unblock_ips.sh

  3. 将脚本添加到cron定时任务中,以便每小时自动执行。例如,在crontab文件中添加以下行:0,30 * * * * /path/to/block_unblock_ips.sh。这将确保脚本在每小时的00分和30分执行一次。

  4. 根据需要调整脚本中的日志文件路径、iptables路径以及其他相关配置。

  5. 运行脚本并观察其效果。如果发现误封或漏封的情况,可以适当调整访问次数的阈值或其他相关参数。

结语

这款自动封禁和解封异常IP的脚本为网站管理员提供了一个有效的工具来应对恶意流量和攻击。通过合理的配置和使用,可以大大降低恶意流量对网站的影响,提高网站的安全性和稳定性。希望这款脚本能成为您网站安全防护的有力武器!

这篇关于根据web访问日志,封禁请求量异常的IP,如IP在半小 时后恢复正常则解除封禁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990776

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ