本文主要是介绍根据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/iptables
ips=/tmp/ips.txt
block()
{
#将一分钟前的日志全部过滤出来并提取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数量很少 unblock
block
else
block
fi
脚本详解
-
设置日志文件路径和工具路
logfile=/data/log/access.log
ipt=/sbin/iptables
ips=/tmp/ips.txt
这里我们设置了Web访问日志文件的路径、iptables工具的路径以及一个临时文件用于存储提取出的IP地址和访问次数。
-
提取并封禁异常IP
在block
函数中,脚本首先通过grep
和awk
命令提取出一分钟前的日志中的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地址,并使用sort
和uniq
命令进行排序和去重。 -
再次使用
awk
命令筛选出访问次数超过100的IP地址。 -
利用iptables的
-I INPUT
命令将这些IP地址添加到INPUT链的开头,并设置REJECT策略,阻止这些IP地址的访问请求。 -
将被封禁的IP地址和时间戳记录到
/tmp/badip.log
文件中,以便后续跟踪和审查。
-
解封恢复正常的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的计数器清零。
-
定时执行解封和封禁操作
脚本的最后部分是一个条件判断语句,用于在特定的时间(每小时的00分和30分)执行解封操作,并在其他时间执行封禁操作。这样可以确保被封禁的IP地址在半小时后恢复正常访问。
使用方法
-
将以上脚本保存为一个文件(例如:
block_unblock_ips.sh
)。 -
为脚本添加执行权限:
chmod +x block_unblock_ips.sh
。 -
将脚本添加到cron定时任务中,以便每小时自动执行。例如,在crontab文件中添加以下行:
0,30 * * * * /path/to/block_unblock_ips.sh
。这将确保脚本在每小时的00分和30分执行一次。 -
根据需要调整脚本中的日志文件路径、iptables路径以及其他相关配置。
-
运行脚本并观察其效果。如果发现误封或漏封的情况,可以适当调整访问次数的阈值或其他相关参数。
结语
这款自动封禁和解封异常IP的脚本为网站管理员提供了一个有效的工具来应对恶意流量和攻击。通过合理的配置和使用,可以大大降低恶意流量对网站的影响,提高网站的安全性和稳定性。希望这款脚本能成为您网站安全防护的有力武器!
这篇关于根据web访问日志,封禁请求量异常的IP,如IP在半小 时后恢复正常则解除封禁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!