仅做参考
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_FILE5、创建自动删除日志定时任务(日志分割后会产生很多日志文件)
#!/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 {} \;