在本篇文章中,我们将探讨一个在Linux系统管理中非常实用的Shell脚本编写任务,即如何编写一个脚本来根据Web访问日志封禁请求量异常的IP,并在半小时后若IP恢复正常则解除封禁。
这样的脚本对于防范DDoS攻击等网络攻击非常有用。
脚本设计思路
在设计这个Shell脚本时,我们主要需要处理以下几个部分:解析Web访问日志,封禁异常IP,定时解除封禁。
- 解析Web访问日志:我们需要解析Web服务器的访问日志,找出请求量异常的IP,这可以通过
awk
和sort
命令配合来实现。 - 封禁异常IP:找出异常IP后,我们需要使用iptables来封禁这些IP。
- 定时解除封禁:封禁后,我们需要设置一个定时任务,在半小时后解除封禁,这可以通过
at
命令来实现。
脚本编写
由于该任务涉及到的内容较多,我们分为两个脚本来实现。
一个是用来封禁异常IP的ban_ip.sh
,另一个是用来解除封禁的unban_ip.sh
。
以下是封禁异常IP的ban_ip.sh
:
#!/bin/bash
# 定义请求量阈值
threshold=1000
# 解析Web访问日志,找出请求量超过阈值的IP
ip_list=$(awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk -v t=$threshold '{if($1>t)print $2}')
# 封禁异常IP
for ip in $ip_list
do
iptables -I INPUT -s $ip -j DROP
# 在半小时后解除封禁
echo "iptables -D INPUT -s $ip -j DROP" | at now + 30 minutes
done
以下是解除封禁的unban_ip.sh
,这个脚本会被at
命令调用:
#!/bin/bash
# 解析参数,获取要解除封禁的IP
ip=$1
# 解除封禁
iptables -D INPUT -s $ip -j DROP
脚本测试
将上述两个脚本保存为ban_ip.sh
和unban_ip.sh
,并赋予其执行权限chmod +x ban_ip.sh unban_ip.sh
。
然后你可以直接运行ban_ip.sh
来封禁异常IP,并在半小时后解除封禁。
结语
在Linux系统管理中,根据Web访问日志封禁和解封请求量异常的IP是一项非常重要的任务。