在互联网服务器的日常运维中,安全始终是重中之重,对于运行在CentOS系统上的Web服务器而言,除了传统的DDoS攻击外,一种更为隐蔽和棘手的威胁是CC攻击(Challenge Collapsar),CC攻击并非旨在耗尽网络带宽,而是通过模拟大量正常用户对网站动态页面(如登录、搜索、API接口)的持续请求,疯狂消耗服务器资源(如CPU、内存、数据库连接池),最终导致服务器响应缓慢甚至瘫痪,正常用户无法访问,由于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
脚本的部署与自动化
要使这个脚本发挥作用,需要将其部署并设置为定时任务。
- 保存脚本:将上述代码保存为一个文件,例如
anti_cc.sh
,并放置在合适的目录,如/usr/local/sbin/
。 - 赋予执行权限:在终端中执行
chmod +x /usr/local/sbin/anti_cc.sh
。 - 设置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是一个功能全面、体系化的专业安全产品。
问题2:如果我的网站使用了CDN服务,这个脚本还有效吗?
解答:直接使用是无效的,甚至会产生严重误判,当网站部署了CDN(如Cloudflare、阿里云CDN)后,所有到达您服务器的请求的源IP地址都将是CDN的节点IP,而不是真实用户的IP,脚本分析日志会发现所有请求都来自少数几个CDN IP,一旦请求量超过阈值,脚本就会将CDN节点IP封禁,导致所有用户(包括正常用户)都无法通过CDN访问您的网站,要解决这个问题,需要修改Nginx配置,让它记录真实用户的IP,CDN会在HTTP请求头中加入X-Forwarded-For
或CF-Connecting-IP
等字段来传递真实IP,您需要在Nginx的log_format
配置中,将$remote_addr
(记录直连IP)修改为记录这些请求头中的值(如$http_x_forwarded_for
),这样,防CC脚本才能获取到真实的访客IP并进行有效分析。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复