为什么需要封禁 IP
?
在服务器运维中,保护服务器免受恶意攻击是至关重要的任务之一。
常见的攻击方式之一是使用大量请求来消耗服务器资源,这可能导致服务器性能下降甚至崩溃。
为了应对这种情况,我们需要一种自动化的方法来识别高访问量的IP
段并封禁与之相关的IP
地址,以保护服务器的稳定性和安全性。
脚本的简单介绍
这个脚本是一个自动化的解决方案,用于封禁访问量比较大的IP
。
该脚本通过分析访问日志中的IP
地址并统计其请求量,然后根据设定的阈值决定是否封禁该IP
。
脚本还具备解封之前封禁的IP
的功能,并在完成封禁操作后重新加载Nginx
服务器,以确保封禁规则生效。
脚本如下
脚本
#!/bin/bash
# 把访问量比较大的IP段封掉,同时解封之前封禁的IP,并重新循环
# 筛选时间段(5分钟前至当前时间)
start_time=$(date -d "-5 minutes" "+%d/%b/%Y:%H:%M")
end_time=$(date "+%d/%b/%Y:%H:%M")
log="/tmp/www.itwordsweb.net_ip_block.log"
blocked_ips="/etc/nginx/blockips_new.conf"
block_ip() {
# 截取5分钟以前至当前的日志
awk -v start="$start_time" -v end="$end_time" -F '[][]' '$2 >= start && $2 <= end' "$log" >/tmp/tmp_last_minute.log
# 将所有ip都过滤出来,存到临时文件
awk '{print $1}' /tmp/tmp_last_minute.log >/tmp/tmp_last_minute_ip.log
# 处理IP,只留前面三位,排序、去重,获取多于1500次请求的ip段,这个数字可以根据实际情况来调整
awk -F '.' '{print $1"."$2"."$3"."}' /tmp/tmp_last_minute_ip.log | sort | uniq -c | sort -n | awk '$1 > 1500 {print $2}' >/tmp/bad_ip_minute.list
# 当ip数大于0时,才会将它写入到封禁IP文件中
ip_n=$(wc -l /tmp/bad_ip_minute.list | awk '{print $1}')
if [ ${ip_n} -ne 0 ]; then
cat /dev/null >"$blocked_ips"
for ip in $(cat /tmp/bad_ip_minute.list); do
# 封ip,不能直接封ip段
for ip2 in $(grep "^$ip" /tmp/tmp_last_minute_ip.log | sort -n | uniq); do
echo "deny $ip2;" >>"$blocked_ips"
done
done
echo "allow all;" >>"$blocked_ips"
fi
# 注意nginx的二进制执行路径
ngins_status=$(/usr/sbin/nginx -t)
if [ $? -eq 0 ]; then
# 重新加载nginx
/usr/sbin/nginx -s reload
fi
}
# 检查命令行参数
if [[ $# -ne 1 ]]; then
echo "请输入参数:start"
exit 1
fi
# 根据命令行参数调用相应的函数
if [[ $1 == "start" ]]; then
block_ip
else
echo "参数输入错误。"
exit 1
fi
定时任务
*/5 * * * * /bin/bash /tmp/block_ips.sh block_ip
使用说明
以下是使用该脚本的步骤:
- 在脚本中定义好日志文件路径、封禁
IP
配置文件路径等相关变量。 - 根据实际需求,可以调整脚本中的时间范围和访问量阈值等参数。
- 将脚本添加到定时任务中,以便每隔一定时间自动执行脚本。
- 运行脚本后,它会根据设定的时间范围和阈值分析访问日志,识别出访问量较大的
IP
,并将其封禁在Nginx
配置文件中。 - 脚本会检查
Nginx
配置文件是否正确,并在验证通过后重新加载Nginx
服务器,使封禁规则生效。
请注意,该脚本需要在具有适当权限的环境中运行,以便修改Nginx
配置文件并重新加载服务器。
总结
通过自动化封禁高访问量IP
的Nginx
脚本,我们可以快速响应恶意攻击并保护服务器的稳定性和安全性。
这种自动化的解决方案可以减轻管理员的负担,并提供及时的保护措施。
定期审查和调整脚本中的参数,以确保其适应实际的攻击情况,并保持服务器的安全性。