首页 > 资源分享 > 宝塔中Apache环境实现站点的日志分析与自动封禁(防爬虫方案)

宝塔中Apache环境实现站点的日志分析与自动封禁(防爬虫方案)

时间:2026-01-08浏览次数:86

仅做参考


1、先分割站点日志文件(不分割的话,日志文件过大,后面定时任务脚本执行的时候会导致服务器IO过高)
在站点配置文件更改分割日志文件配置:

 #ErrorLog "/www/wwwlogs/yuming.cn-error_log"
 #CustomLog "/www/wwwlogs/yuming.cn-access_log" combined
 ErrorLog "|/www/server/apache/bin/rotatelogs -l /www/wwwlogs/yuming.cn-error_log.%Y%m%d%H%M 60"
 CustomLog "|/www/server/apache/bin/rotatelogs -l /www/wwwlogs/yuming.cn-access_log.%Y%m%d%H%M 60" combined


2、创建IP黑名单文件

宝塔面板 → 文件 → /www/server/apache/conf/ → 新建文件:

文件名:blocked_ips.txt

内容:留空

3、配置Apache加载黑名单

宝塔面板 → 网站 → 目标站点 → 配置文件,在 <Directory> 段内添加:

<Directory "/www/wwwroot/yumingcn/Public">
        SetOutputFilter DEFLATE
        Options FollowSymLinks
        AllowOverride All
        DirectoryIndex index.php index.html index.htm default.php default.html default.htm
        <RequireAll>
            Require all granted
            Include /www/server/apache/conf/blocked_ips.txt
        </RequireAll>
</Directory>

4、创建自动封禁脚本定时任务

宝塔面板 → 计划任务 → 添加计划任务

任务类型:Shell脚本

任务名称:Apache自动封禁恶意IP

执行周期:N分钟 → 1分钟

脚本内容:

#!/bin/bash
# 日志路径(按需修改)
#LOG_PATH="/www/wwwlogs/yuming.cn-access_log"

# 自动查找最新的日志文件
LOG_PATH=$(ls -t /www/wwwlogs/yuming.cn-access_log.* | head -n 1)

# 如果找不到新格式日志,回退到默认文件
if [ -z "$LOG_PATH" ]; then
    LOG_PATH="/www/wwwlogs/yuming.cn-access_log"
fi

# 黑名单文件
BLOCKED_FILE="/www/server/apache/conf/blocked_ips.txt"
# 阈值:1分钟内超过100次请求就封禁
THRESHOLD=100

# 临时文件
TEMP_FILE="/tmp/ip_ban_$$.txt"

# 分析最近1分钟的日志
grep "$(date -d '1 minute ago' +%Y:%H:%M)" $LOG_PATH | awk '{print $1}' | sort | uniq -c | sort -rn | \
while read count ip; do
    if [ $count -gt $THRESHOLD ]; then
        # 检查是否已封禁
        if ! grep -q "Require not ip $ip" $BLOCKED_FILE; then
            echo "Require not ip $ip" >> $TEMP_FILE
            echo "$(date +%F\ %T) 封禁IP: $ip (请求: $count 次)" >> /www/wwwlogs/block_ip.log
        fi
    fi
done

# 合并到主文件
if [ -s $TEMP_FILE ]; then
    cat $TEMP_FILE >> $BLOCKED_FILE
    # 重载Apache使配置生效
    /www/server/apache/bin/apachectl graceful
fi

# 清理
rm -f $TEMP_FILE


5、创建自动删除日志定时任务(日志分割后会产生很多日志文件)

#!/bin/bash
# 删除旧日志脚本

LOG_DIR="/www/wwwlogs"

YESTERDAY=$(date -d "yesterday" +%Y%m%d)
# 删除昨天的日志(按需调整)
find "$LOG_DIR" -name "yuming.cn-access_log.$YESTERDAY*" -exec rm -vf {} \;
find "$LOG_DIR" -name "yuming.cn-error_log.$YESTERDAY*" -exec rm -vf {} \;

# 删除7天前的所有访问和错误日志
#find "$LOG_DIR" -name "yuming.cn-access_log.*" -mtime +6 -exec rm -vf {} \;
#find "$LOG_DIR" -name "yuming.cn-error_log.*" -mtime +6 -exec rm -vf {} \;