如何用脚本在CentOS服务器上有效防御CC攻击?

在互联网服务器的日常运维中,安全始终是重中之重,对于运行在CentOS系统上的Web服务器而言,除了传统的DDoS攻击外,一种更为隐蔽和棘手的威胁是CC攻击(Challenge Collapsar),CC攻击并非旨在耗尽网络带宽,而是通过模拟大量正常用户对网站动态页面(如登录、搜索、API接口)的持续请求,疯狂消耗服务器资源(如CPU、内存、数据库连接池),最终导致服务器响应缓慢甚至瘫痪,正常用户无法访问,由于CC攻击的流量特征与正常访问极为相似,传统的网络层防火墙难以有效防御,部署应用层的防御策略,例如编写并运行一个CentOS防CC脚本,显得尤为必要。

如何用脚本在CentOS服务器上有效防御CC攻击?

防御机制的核心思想

一个有效的防CC脚本,其核心工作原理可以概括为三个步骤:监控、分析、阻断,它不依赖于网络流量特征,而是聚焦于服务器的访问日志,通过分析日志中的行为模式来识别恶意IP。

  • 日志监控:脚本会持续或周期性地读取Web服务器(如Nginx或Apache)的访问日志文件,这个文件记录了每一个访问请求的详细信息,包括访问者的IP地址、访问时间、请求的URL、返回状态码、User-Agent等。
  • 行为分析:这是脚本的关键环节,脚本会设定一套规则来判断一个IP的行为是否异常,最常见的规则是“单位时间内的请求频率”,一个正常的用户在60秒内可能只会发起10-20个请求,而一个攻击程序可能在同一时间内发起数百甚至上千个请求,脚本通过统计日志,找出在极短时间内请求次数远超正常阈值的IP地址。
  • 动态阻断:一旦某个IP被识别为攻击源,脚本会立即调用系统的防火墙工具(如CentOS 7及以后版本默认的firewalld,或传统的iptables),将该IP地址加入黑名单,并阻止其后续的所有访问,这个阻断可以是临时的,例如封禁1小时,也可以是永久的,具体策略可根据实际需求设定。

一个基于Shell的简易防CC脚本示例

下面提供一个基于Shell的实用脚本,它适用于使用Nginx作为Web服务器、firewalld作为防火墙的CentOS系统,这个脚本的逻辑清晰,易于理解和定制。

我们需要定义一些关键变量,以便于后续修改和维护。

变量名 含义 示例值
LOG_FILE Nginx访问日志的绝对路径 /var/log/nginx/access.log
DURATION 监控的时间窗口(单位:秒) 60
THRESHOLD 在时间窗口内允许的最大请求次数 100
WHITELIST_IP 白名单IP,用空格隔开,永不封禁 "127.0.0.1 192.168.1.100"
#!/bin/bash
# ==================== 配置区域 ====================
LOG_FILE="/var/log/nginx/access.log"
DURATION=60  # 监控最近60秒的日志
THRESHOLD=100 # 允许的单IP最大请求数
WHITELIST_IP="127.0.0.1" # 白名单,多个IP用空格分隔
# ==================== 核心逻辑 ====================
# 获取当前时间戳和DURATION秒前的时间戳
TIME_END=$(date +"%d/%b/%Y:%H:%M:%S")
TIME_START=$(date -d "$DURATION seconds ago" +"%d/%b/%Y:%H:%M:%S")
# 分析日志,找出在时间窗口内请求超过阈值的IP
# awk的用法:筛选指定时间段内的日志,提取第一列(IP),然后排序并统计每个IP的出现次数
ATTACK_IPS=$(awk -v start="$TIME_START" -v end="$TIME_END" '$4 >= "["start" && $4 < "["end {print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | awk -v threshold="$THRESHOLD" '$1 > threshold {print $2}')
# 检查是否找到了攻击IP
if [ -z "$ATTACK_IPS" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 未发现攻击行为。"
    exit 0
fi
# 循环处理每个攻击IP
for ip in $ATTACK_IPS; do
    # 检查IP是否在白名单中
    if [[ "$WHITELIST_IP" =~ $ip ]]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - IP $ip 在白名单中,跳过封禁。"
        continue
    fi
    # 检查IP是否已被firewalld封禁
    if firewall-cmd --list-rich-rules | grep -q "source address="$ip""; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - IP $ip 已在封禁列表中,无需重复操作。"
        continue
    fi
    # 执行封禁操作
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 发现攻击IP: $ip,正在执行封禁..."
    firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' drop"
    firewall-cmd --reload
    echo "$(date '+%Y-%m-%d %H:%M:%S') - IP $ip 已被成功封禁。"
done

脚本的部署与自动化

要使这个脚本发挥作用,需要将其部署并设置为定时任务。

如何用脚本在CentOS服务器上有效防御CC攻击?

  1. 保存脚本:将上述代码保存为一个文件,例如anti_cc.sh,并放置在合适的目录,如/usr/local/sbin/
  2. 赋予执行权限:在终端中执行 chmod +x /usr/local/sbin/anti_cc.sh
  3. 设置Cron定时任务:使用crontab -e命令编辑当前用户的定时任务,为了实现近实时监控,可以设置脚本每分钟运行一次,在文件末尾添加以下内容:
    */1 * * * * /usr/local/sbin/anti_cc.sh >> /var/log/anti_cc.log 2>&1

    这行代码的含义是:每分钟执行一次anti_cc.sh脚本,并将其所有的输出(包括正常信息和错误信息)重定向到/var/log/anti_cc.log文件中,便于后续排查问题。

策略的优化与注意事项

虽然上述脚本能有效缓解大部分自动化CC攻击,但在实际应用中仍需注意一些细节:

  • 阈值调整THRESHOLD值是脚本的核心,设置过低可能导致误伤,封禁正常访问量大的用户(如公司网关出口IP);设置过高则防御效果不佳,建议在网站正常访问时段,通过分析日志统计出一个合理的基准值,然后在此基础上适当放宽。
  • 白名单机制:务必将自己的固定IP、公司IP、以及搜索引擎爬虫(如Googlebot)的IP段加入白名单,避免误操作导致自己或重要用户无法访问。
  • 日志轮转:确保Nginx的日志轮转策略(logrotate)配置正确,避免日志文件无限增长,影响脚本分析效率和磁盘空间。
  • 局限性:此脚本主要防御的是源IP相对固定的攻击,对于使用了海量代理IP或僵尸网络的分布式CC攻击,效果会打折扣,在这种情况下,应考虑更专业的解决方案。

相关问答FAQs

问题1:这个防CC脚本和专业的WAF(Web应用防火墙)有什么区别?

解答:这个脚本和专业的WAF在防御层级、深度和功能上存在显著差异,这个脚本是一个基于日志分析和IP封禁的“事后”防御工具,它在攻击发生后通过分析行为模式来阻断后续攻击,而WAF(如ModSecurity、Cloudflare WAF)工作在应用层,是一个“事中”防御系统,它能对每一个HTTP请求进行深度检测,不仅能识别CC攻击,还能防御SQL注入、XSS跨站脚本、文件上传漏洞等多种Web应用攻击,WAF拥有更复杂的规则库和行为分析引擎,可以识别更隐蔽的攻击行为,并且通常提供更精细的策略,如弹出验证码、JavaScript人机验证等,而不是简单粗暴地封禁IP,简而言之,这个脚本是一个轻量级、针对性的应急方案,而WAF是一个功能全面、体系化的专业安全产品。

如何用脚本在CentOS服务器上有效防御CC攻击?

问题2:如果我的网站使用了CDN服务,这个脚本还有效吗?

解答:直接使用是无效的,甚至会产生严重误判,当网站部署了CDN(如Cloudflare、阿里云CDN)后,所有到达您服务器的请求的源IP地址都将是CDN的节点IP,而不是真实用户的IP,脚本分析日志会发现所有请求都来自少数几个CDN IP,一旦请求量超过阈值,脚本就会将CDN节点IP封禁,导致所有用户(包括正常用户)都无法通过CDN访问您的网站,要解决这个问题,需要修改Nginx配置,让它记录真实用户的IP,CDN会在HTTP请求头中加入X-Forwarded-ForCF-Connecting-IP等字段来传递真实IP,您需要在Nginx的log_format配置中,将$remote_addr(记录直连IP)修改为记录这些请求头中的值(如$http_x_forwarded_for),这样,防CC脚本才能获取到真实的访客IP并进行有效分析。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-10-04 08:16
下一篇 2025-10-04 08:19

相关推荐

  • 如何在CentOS上创建NFS共享目录?

    在现代化的IT基础设施中,服务器之间的文件共享是一项基础且至关重要的需求,网络文件系统(NFS)作为一种经典、高效且稳定的分布式文件系统协议,被广泛应用于Linux/Unix环境,尤其是在CentOS这样的企业级操作系统中,通过NFS,您可以轻松地将一台服务器(NFS服务器)上的指定目录共享给网络中的一台或多台……

    2025-10-07
    0023
  • CentOS系统无法直接安装.deb文件,如何转换或解决?

    在Linux系统中,软件包的安装方式因发行版而异,CentOS作为基于RPM的发行版,默认使用.rpm格式的软件包,而Ubuntu等基于Debian的发行版则使用.deb格式的软件包,当需要在CentOS系统上安装.deb格式的软件包时,由于依赖关系和包管理器的差异,直接使用rpm命令通常无法成功,本文将详细介……

    2025-10-31
    0044
  • 服务器一年价格_价格详情

    服务器一年的价格因配置、服务商和地区而异。低配服务器可能在几百到几千元,中高配可能在几千到几万元,具体需根据需求和预算选择合适的服务商和产品。

    2024-07-11
    005
  • 如何挑选合适的服装厂网站模板以增强品牌在线展示?

    服装厂网站模板通常包含产品展示、公司介绍、新闻动态、在线咨询等模块,以便于用户了解产品信息和企业文化。设置时需确保布局清晰、导航简便,同时兼顾美观与功能性,提升用户体验和品牌形象。

    2024-08-08
    0015

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信