如何防止Apache服务器被CC攻击?模块配置与调优
摘要:# Apache服务器防CC攻击:别让“小请求”拖垮你的大业务 我前两天帮朋友处理一个电商站点的故障,那场面真是让人哭笑不得。网站打开慢得像在拨号上网,后台一看,CPU和内存全跑满了。一开始以为是促销活动太火爆,结果仔细一查——好家伙,每分钟几万个请求,…
Apache服务器防CC攻击:别让“小请求”拖垮你的大业务
我前两天帮朋友处理一个电商站点的故障,那场面真是让人哭笑不得。网站打开慢得像在拨号上网,后台一看,CPU和内存全跑满了。一开始以为是促销活动太火爆,结果仔细一查——好家伙,每分钟几万个请求,全来自那么几十个IP,都在反复请求同一个商品详情页。典型的CC攻击(Challenge Collapse),说白了就是用大量“看起来正常”的请求,活活把你的服务器“累死”。
很多刚入行的朋友可能会觉得,CC攻击不像DDoS那么“声势浩大”,应该好对付。其实吧,这种想法最危险。CC攻击成本低、伪装性强,专挑你业务逻辑里最耗资源的地方打(比如搜索、登录、下单接口),很多所谓的高配服务器,PPT上很猛,真被针对性的CC打起来,几分钟就露馅了。
如果你的Apache服务器还在用默认配置“裸奔”,心里应该有点数了。今天,咱们不聊空泛的理论,就结合我这些年踩过的坑和有效的配置,把Apache防CC这件事,掰开揉碎了讲明白。
一、先搞懂:CC攻击到底在“打”你哪里?
别急着改配置,方向错了,再折腾也白搭。CC攻击的核心目的,是耗尽服务器的连接资源和计算资源。
- 连接资源:Apache的
MaxClients(或MaxRequestWorkers)决定了它能同时处理多少个连接。攻击者用大量IP或代理,快速建立并保持连接,把名额占满,真用户就挤不进去了。 - 计算资源:攻击者频繁请求那些需要执行数据库查询、复杂运算的动态页面(比如
/search.php?keyword=xxx)。每个请求都让CPU飙高一点,积少成多,服务器直接“卡死”。
所以,防护思路就两条:1. 别让无效连接占着茅坑;2. 别让恶意请求过度消耗CPU。 下面,我们就围绕这两点,对Apache动手术。
二、核心模块调优:给你的Apache穿上“防弹衣”
1. mod_evasive —— 专治各种“请求轰炸”
这模块名字就霸气——“规避”。它就像个敏锐的保安,能实时监测单个IP的请求频率,一旦发现异常(比如一秒内请求同一个页面几十次),立马采取行动:可以延迟响应、直接屏蔽,或者记入日志。
关键配置(通常在httpd.conf或单独配置文件中):
<IfModule mod_evasive20.c>
DOSHashTableSize 3097 # 哈希表大小,管理IP用的,访问量大可以调高
DOSPageCount 2 # 规定时间内对同一页面的请求次数阈值(关键!)
DOSSiteCount 50 # 规定时间内对同一网站的总请求次数阈值
DOSPageInterval 1 # 页面计数的时间间隔(秒)
DOSSiteInterval 1 # 站点计数的时间间隔(秒)
DOSBlockingPeriod 10 # 封锁IP的时间(秒)
DOSEmailNotify admin@yourdomain.com # 报警邮件(记得配)
DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP" # 触发后执行的命令,比如拉黑IP
</IfModule>
重点解读:
DOSPageCount 2和DOSPageInterval 1这个组合非常严格,意思是1秒内同一个IP请求同一个页面超过2次,就触发防护。对于纯静态站或API,可以适当放宽,但动态站(尤其是带登录、搜索的)建议从严。- 一定要配
DOSSystemCommand,光延迟响应不够,得让防火墙(如iptables)直接把恶意IP掐掉,这才是根治。很多教程不提这步,效果差一大截。 - 这个模块会消耗一定内存和CPU来追踪IP,对于访问量巨大的站,需要根据服务器性能调整
DOSHashTableSize。
2. mod_ratelimit / mod_qos —— 给流量“限速”
如果说mod_evasive是抓坏人的警察,那这俩就是交通管制员,防止某些“车道”(URL或IP)流量过大。
mod_ratelimit:更简单直接,可以针对特定目录或文件类型限制下载速度。对于防止攻击者疯狂爬取你站上的大文件(如图片、视频)特别有用。<Location /downloads/> SetOutputFilter RATE_LIMIT SetEnv rate-limit 200 # 限制速度为200KB/秒 </Location>mod_qos:功能更强大,能基于服务器整体状态做动态限流。比如,当服务器并发连接数超过500时,自动对新来的、访问特定路径的请求返回503(服务暂不可用),优先保障核心业务。# 当并发连接超过80%时,对/media/目录的请求,50%概率返回503 QS_SrvRequestRate 0-500%/5 /media/ 503 50%说白了,这就是“丢车保帅”。真遇到大规模攻击,确保你的首页、支付页面还能活,比死扛所有请求要明智得多。
3. mod_security (WAF模块) —— 规则定胜负
这是个功能强大的Web应用防火墙。你可以为它编写精细的规则,比如:
- 拦截User-Agent为空的请求(很多攻击脚本会这样)。
- 拦截短时间内携带大量不同参数的请求(典型CC特征)。
- 拦截对
wp-login.php等常见后台页面的高频访问。
它的威力取决于规则库的质量和维护。新手建议从OWASP核心规则集开始,但一定要在测试环境先跑,否则一个错误规则可能把正常用户也拦了。
三、Apache基础配置加固:把“篱笆”扎紧
光靠模块不够,Apache自己的“阀门”也得拧好。
- 调整超时时间:
Timeout 30(默认60)。给正常请求30秒足够了,恶意连接占着不干活?早点断掉。 - 限制请求体:
LimitRequestBody 1048576。限制单个请求最大1MB,防止有人用超大POST请求来耗资源。 - 禁用不必要的方法:
<LimitExcept GET POST HEAD>。如果你的站只用GET/POST,就把PUT、DELETE等方法全拒了。 - 优化
MaxClients/MaxRequestWorkers:这个值不是越大越好! 盲目调高,CC攻击来时死得更惨。计算公式大概是:MaxClients ≈ 可用内存 / 单个Apache进程平均内存占用。用ps aux或top看看你的httpd进程占多少内存,算一下。小内存VPS,设成50-100可能更安全。
四、组合拳与“终极隐藏术”
单点防护永远有漏洞,得打组合拳。
- 动静分离:把图片、CSS、JS这些静态资源,扔到CDN上。一来减轻Apache压力,二来CDN本身就有抗CC能力(比如Cloudflare的“Under Attack”模式)。攻击者打不到你真实服务器(源站),这是最实在的。
- 日志分析是金矿:别只看
access.log,把mod_evasive、mod_security的日志和系统监控(如htop、iftop)结合起来看。攻击前往往有扫描试探,日志里能看到那些“探头探脑”的IP。 - 源站隐藏(终极大招):通过CDN或高防IP代理,让你的真实服务器IP在公网上彻底“消失”。只允许来自CDN节点IP的流量访问你的Apache(用防火墙白名单实现)。攻击者连你门牌号都找不到,还打什么?这是目前最有效的方案之一,很多云服务商的高防产品就是这个原理。
几句大实话
- 没有一劳永逸:攻击手法在变,你的规则也得定期看。把
mod_evasive的报警邮件设置好,别当摆设。 - 别迷信“无限制防护”:低配VPS,上再多的软件防护,遇到大规模攻击也扛不住。该升级硬件、该买高防服务时,别硬撑。业务连续性比那点钱重要。
- 测试!测试!测试!:所有配置改完,自己用工具(比如
ab、siege)模拟一下,或者找个安全扫描服务试试效果。别等真被打哭了再排查。
防护的本质,是增加攻击者的成本和难度。对于Apache防CC,从mod_evasive+基础加固做起,结合日志监控,有条件就上CDN隐藏源站,这套组合下来,已经能挡住90%的普通CC攻击了。
行了,配置项就聊这么多。赶紧去看看你的Apache还在不在“裸奔”吧。

