CC攻击应急:自动拉黑IP的Shell脚本
字数 1253 2025-08-15 21:30:53

CC攻击应急:自动拉黑IP的Shell脚本教学文档

1. 脚本背景与原理

1.1 应用场景

  • 网站无任何防护措施("裸奔"状态)
  • 遭受CC攻击(特别是使用代理IP的攻击)
  • 需要快速应急响应

1.2 核心思路

  1. 通过计划任务定期执行脚本
  2. 统计单位时间内的IP访问量
  3. 设定访问量阈值
  4. 自动拉黑超过阈值的IP地址

2. 脚本详解

2.1 完整脚本代码

#!/bin/bash
# 该脚本可以根据web日志的访问量,自动拉黑IP(加入计划任务,结合计划任务在固定时间段内执行,并根据该时间段内产生的日志进行分析)

# 首先把日志保存到根目录一份,计算日志有多少行
line1=`wc -l /access_log|awk '{print$1}'`
cp /var/log/httpd/access_log /

# 计算现有的日志有多少行
line2=`wc -l /var/log/httpd/access_log |awk '{print$1}'`

# 根据上一次备份的日志和现在拥有的行数差值,作为单位时间内分析日志访问量
tail -n $((line2-line1)) /var/log/httpd/access_log|awk '{print$1}'|sort -n|uniq -c|sort >/1.txt

cat /1.txt|while read line
do
    echo $line >/line
    num=`awk '{print$1}' /line`
    # 设定阀值num,单位时间内操作这个访问量的ip会被自动拉黑
    if (($num>12))
    then
        ip=`awk '{print$2}' /line`
        firewall-cmd --add-rich-rule="rule family=ipv4 source address='${ip}' port port=80 protocol=tcp reject" --permanent
        firewall-cmd --reload
    fi
done

2.2 关键组件解析

  1. 日志处理部分

    • wc -l:计算文件行数
    • awk '{print$1}':提取第一列数据
    • tail -n:获取文件最后n行
    • sort -n|uniq -c|sort:对IP进行排序、计数和再排序
  2. 防火墙操作部分

    • firewall-cmd --add-rich-rule:添加富规则
    • --permanent:使规则永久生效
    • firewall-cmd --reload:重载防火墙配置

3. 部署与测试步骤

3.1 环境准备

  1. CentOS 7系统
  2. 已安装并运行http服务
  3. 防火墙已启用

3.2 部署流程

  1. 将脚本保存为可执行文件(如block_ip.sh
  2. 添加执行权限:chmod +x block_ip.sh
  3. 将脚本加入计划任务(crontab)

3.3 测试方法

  1. 使用nikto等工具模拟大量访问
  2. 验证网页访问是否被阻止
  3. 检查防火墙规则:firewall-cmd --list-all
  4. 查看防火墙配置文件:/etc/firewalld/zones/public.xml

4. 关键参数与自定义

4.1 阈值调整

  • 脚本中默认阈值为12次访问
  • 修改if (($num>12))中的数字以适应不同场景

4.2 日志路径

  • 默认日志路径:/var/log/httpd/access_log
  • 根据实际环境修改为nginx或其他web服务器的日志路径

4.3 防火墙规则

  • 默认阻止80端口的TCP访问
  • 可修改firewall-cmd命令中的端口号和协议类型

5. 进阶扩展

  1. 基于访问特征的拉黑

    • 分析特定URL的访问频率
    • 检测异常User-Agent
  2. IP白名单功能

    • 添加信任IP不进行检测
  3. 自动解封机制

    • 设置拉黑时间限制
    • 定时清理过期规则
  4. 报警机制

    • 集成邮件或短信通知
    • 记录拉黑操作日志

6. 注意事项

  1. 阈值设置

    • 需根据网站正常流量调整
    • 设置过低可能导致误封
    • 设置过高可能无法有效防护
  2. 性能影响

    • 高频执行可能增加服务器负载
    • 建议根据业务需求设置合理的执行频率
  3. 规则管理

    • 定期检查并清理防火墙规则
    • 可通过/etc/firewalld/zones/public.xml管理规则
  4. 日志轮转

    • 确保日志不会无限增长
    • 配置logrotate进行日志切割

7. 总结

该脚本提供了一种简单有效的CC攻击应急方案,特别适合无专业防护设备的场景。通过自动化分析访问日志并动态更新防火墙规则,可以有效缓解CC攻击带来的影响。管理员可根据实际需求调整阈值、检测规则和执行频率,使其更加贴合业务场景。

CC攻击应急:自动拉黑IP的Shell脚本教学文档 1. 脚本背景与原理 1.1 应用场景 网站无任何防护措施("裸奔"状态) 遭受CC攻击(特别是使用代理IP的攻击) 需要快速应急响应 1.2 核心思路 通过计划任务定期执行脚本 统计单位时间内的IP访问量 设定访问量阈值 自动拉黑超过阈值的IP地址 2. 脚本详解 2.1 完整脚本代码 2.2 关键组件解析 日志处理部分 : wc -l :计算文件行数 awk '{print$1}' :提取第一列数据 tail -n :获取文件最后n行 sort -n|uniq -c|sort :对IP进行排序、计数和再排序 防火墙操作部分 : firewall-cmd --add-rich-rule :添加富规则 --permanent :使规则永久生效 firewall-cmd --reload :重载防火墙配置 3. 部署与测试步骤 3.1 环境准备 CentOS 7系统 已安装并运行http服务 防火墙已启用 3.2 部署流程 将脚本保存为可执行文件(如 block_ip.sh ) 添加执行权限: chmod +x block_ip.sh 将脚本加入计划任务(crontab) 3.3 测试方法 使用nikto等工具模拟大量访问 验证网页访问是否被阻止 检查防火墙规则: firewall-cmd --list-all 查看防火墙配置文件: /etc/firewalld/zones/public.xml 4. 关键参数与自定义 4.1 阈值调整 脚本中默认阈值为12次访问 修改 if (($num>12)) 中的数字以适应不同场景 4.2 日志路径 默认日志路径: /var/log/httpd/access_log 根据实际环境修改为nginx或其他web服务器的日志路径 4.3 防火墙规则 默认阻止80端口的TCP访问 可修改 firewall-cmd 命令中的端口号和协议类型 5. 进阶扩展 基于访问特征的拉黑 : 分析特定URL的访问频率 检测异常User-Agent IP白名单功能 : 添加信任IP不进行检测 自动解封机制 : 设置拉黑时间限制 定时清理过期规则 报警机制 : 集成邮件或短信通知 记录拉黑操作日志 6. 注意事项 阈值设置 : 需根据网站正常流量调整 设置过低可能导致误封 设置过高可能无法有效防护 性能影响 : 高频执行可能增加服务器负载 建议根据业务需求设置合理的执行频率 规则管理 : 定期检查并清理防火墙规则 可通过 /etc/firewalld/zones/public.xml 管理规则 日志轮转 : 确保日志不会无限增长 配置logrotate进行日志切割 7. 总结 该脚本提供了一种简单有效的CC攻击应急方案,特别适合无专业防护设备的场景。通过自动化分析访问日志并动态更新防火墙规则,可以有效缓解CC攻击带来的影响。管理员可根据实际需求调整阈值、检测规则和执行频率,使其更加贴合业务场景。