根据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的脚本为网站管理员提供了一个有效的工具来应对恶意流量和攻击。通过合理的配置和使用,可以大大降低恶意流量对网站的影响,提高网站的安全性和稳定性。希望这款脚本能成为您网站安全防护的有力武器!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值