当网站遭受大量恶意IP的非正常连接攻击时,快速封锁源IP地址是应急响应的核心措施。以下脚本提供了一种典型的自动化解决方案——它从服务器日志中提取可疑IP,检测是否已被封禁,若未封禁则通过iptables添加DROP规则进行阻断,并永久保存规则。整个流程由循环控制,每间隔一秒执行一次,确保实时响应与防护。
#!/bin/bash
touch all
for i in `seq 1 100` // 循环控制,共执行100次
do
sleep 1 // 每次循环间隔1秒
ip=`tail -30 /var/log/a.log |grep HTTP/1.1|awk '{print $1}'|sort -n|uniq` // 从日志尾部提取最近30行中HTTP/1.1请求的IP,去重后作为可疑IP列表
if [ -z "$ip" ];then // 若IP列表为空,则跳过
echo "ok" >>/dev/null
else
for m in `echo $ip` // 若有可疑IP,则逐个处理
do
n=`grep -l "^$m$" /root/all` // 检查IP是否已被记录在all文件中(已封禁)
if [ $? -eq 1 ];then // 若未封禁,则执行阻断
echo iptables -A INPUT -s $m -p tcp --dport 80 -j DROP
echo "iptables -A INPUT -s $m -p tcp --dport 80 -j DROP"
iptables -A INPUT -s $m -p tcp --dport 80 -j DROP // 使用iptables丢弃该IP对80端口的TCP连接
echo $m >>/root/all // 将IP追加到all文件,避免重复封禁
fi
done
fi
service iptables sa ve // 保存iptables规则,确保重启后生效
done
该脚本的核心逻辑非常清晰:首先通过循环控制执行次数(本文设为100次,可根据实际需求调整),每次循环间隔1秒。关键步骤是从日志文件/var/log/a.log中提取最近30行中包含HTTP/1.1的请求,提取IP地址并去重——这些IP即为可疑的非正常连接来源。若IP列表不为空,则遍历每个IP,检查是否已存在于/root/all文件中(即历史封禁记录)。若未记录,则执行iptables命令将其加入INPUT链的DROP规则,同时将IP追加到/root/all文件,避免重复封禁。最后,调用service iptables sa ve保存规则,确保服务器重启后规则依然生效。
值得注意的是,脚本通过tail -30只截取日志尾部的最新30行,这种方式适用于连接频率较高的攻击场景。若攻击行为较为分散,可根据实际需要调整行数。此外,grep -l "^$m$"用于精确匹配IP地址,避免误匹配。整个脚本结构清晰,适合作为临时应急措施,也可集成到系统的定时任务中持续运行,实现自动化IP封禁。
