网站部署了CC防护却依然被打到瘫痪,绝大多数情况不是防护设备本身性能不够,而是防护策略、部署位置或后端架构存在被绕过的缺口。CC攻击的本质是消耗服务器资源,攻击者用大量看似正常的请求拖垮数据库连接、CPU计算或带宽。当防护“失效”时,通常意味着请求已经穿透到了源站,或者防护规则误判了攻击流量为正常流量。
排查CC防御失效,第一件事是确认流量是否真正到达了防护节点。很多站点配置了CDN或高防IP,但源站IP暴露在公网,攻击者直接绕过防护节点打源站。检查方法很简单:查看源站Nginx或Apache访问日志,如果攻击期间日志中大量出现来自非CDN节点的IP,说明源站IP泄露。此时无论前端防护多强都形同虚设。解决方法是更换源站IP,并在防火墙层只允许CDN节点回源IP访问80和443端口,其他IP一律拒绝。
第二类常见原因是CC防护阈值设置不合理。很多防护系统默认的CC触发阈值是“单IP每秒请求数超过一定数量”,但现代CC攻击早已不是单IP高频请求,而是分布式低频慢速攻击。攻击者控制数千个代理IP,每个IP每秒只发一两个请求,整体请求量巨大但单IP完全正常。如果只依赖单IP频率限制,防护必然失效。需要开启基于整体流量基线、URI访问分布、用户行为特征的智能CC识别,而不是简单的IP频率计数。
检查防护层是否真正拦截了攻击流量登录防护控制台,查看攻击期间的拦截记录。如果攻击流量显示“放行”或“未触发规则”,说明规则匹配失败。此时需要抓取攻击样本,分析请求特征。常见的攻击特征包括:固定URI反复请求、随机参数绕过缓存、请求头缺失或异常、User-Agent集中在少数几种、Referer为空或伪造、Cookie不携带或固定不变。针对这些特征,在防护层配置组合规则:URI访问频率限制、请求头完整性校验、UA黑白名单、Referer防盗链、Cookie校验跳转。
还有一种隐蔽的情况:攻击者直接打SSL握手层或TCP连接层,不发送完整HTTP请求。这种攻击消耗的是服务器TCP连接数和SSL计算资源,很多HTTP层面的CC防护无法识别。表现是服务器连接数暴涨、CPU满载,但访问日志中看不到大量请求。解决方法是启用SYN Cookie防护、限制单IP并发连接数、缩短TCP超时时间,并在防护节点启用SSL加速和连接复用,将SSL计算压力卸载到防护层。
源站性能瓶颈导致防护“看起来”失效即使防护层成功拦截了大部分攻击流量,源站依然可能因为少量放行请求而崩溃。很多站长认为CC防护就是“把攻击全部挡住”,实际上任何防护系统都会有一定比例的放行流量,否则正常用户也无法访问。如果源站本身性能极差,比如使用最低配云服务器、数据库与Web同机部署、PHP未开启OPcache、SQL查询没有索引,那么即使每分钟只放行几十个请求,也可能导致数据库连接数耗尽或CPU 100%。
排查方法是在攻击期间登录源站,运行top和free命令查看CPU、内存使用情况,用netstat统计ESTABLISHED连接数,用慢查询日志分析数据库执行时间。如果发现源站资源占用极高而访问量并不大,说明瓶颈在源站本身。解决思路是:将静态资源完全交给CDN缓存,源站只处理动态请求;数据库增加索引、开启查询缓存;PHP启用OPcache并调整内存限制;Web服务器调整worker进程数和最大连接数;必要时升级源站配置或做负载均衡。
动态请求防护的常见漏洞很多网站的动态接口没有做任何缓存和限速,攻击者直接针对搜索接口、登录接口、注册接口、短信发送接口、API查询接口发起CC攻击。这类请求每次都会触发数据库查询或外部API调用,资源消耗远高于静态页面。如果防护层只对静态资源做了缓存,动态请求全部透传到源站,那么攻击者用很低的请求量就能打垮源站。
排查时重点检查攻击期间的URI分布,如果集中在/search、/api/、/login、/register等路径,说明动态接口被针对。解决方法是:对搜索、查询类接口增加结果缓存,设置合理的缓存过期时间;对登录、注册、短信接口增加验证码、令牌校验和单IP/单设备频率限制;对API接口增加签名校验和限流;对不需要实时更新的接口在CDN层设置短时间缓存,比如3到5秒,这样即使攻击者高频请求,大部分请求也会命中缓存而不回源。
HTTP/2和WebSocket带来的新问题HTTP/2的多路复用特性让攻击者可以在单个TCP连接上并发大量请求,传统的基于连接数的CC防护会失效。WebSocket长连接一旦建立,后续的数据帧不经过HTTP请求头解析,很多CC防护系统无法识别WebSocket帧级别的洪水攻击。如果站点使用了HTTP/2或WebSocket,需要确认防护节点是否支持对这些协议的深度检测和限速。
针对HTTP/2攻击,防护层需要支持基于流(Stream)级别的并发限制和请求速率控制,而不是只看TCP连接数。针对WebSocket攻击,需要限制单IP的WebSocket连接数、消息频率和消息大小,并设置连接空闲超时。如果防护层不支持这些能力,建议在应用层增加WebSocket消息限流逻辑,或者将WebSocket服务独立部署并前置专门的网关进行防护。
验证码和JavaScript跳转的误伤问题很多CC防护系统在检测到异常流量时会弹出验证码或执行JavaScript跳转来区分真人用户和攻击程序。这种机制本身有效,但如果配置不当,会导致正常用户无法访问,或者搜索引擎爬虫被拦截。有些站长为了“绝对安全”,把验证码触发阈值调得极低,结果正常用户频繁被要求输入验证码,用户体验极差,跳出率飙升。更严重的是,如果验证码接口本身没有做好限流,攻击者可以反过来用验证码请求消耗服务器资源。
合理的做法是:验证码只在可疑流量达到一定阈值后触发,而不是对所有流量启用;对搜索引擎爬虫的User-Agent和IP段设置白名单;验证码服务使用独立的第三方服务或专门的验证码服务器,避免验证逻辑消耗源站资源;同时设置验证码通过后的Cookie有效期,避免同一用户反复被挑战。
日志分析和攻击溯源排查CC防御失效不能只看防护控制台的统计图表,必须结合源站日志做交叉分析。从源站日志中提取攻击期间的所有请求,按IP、URI、User-Agent、Referer、请求时间间隔等维度聚合统计。找出请求量最大的前20个IP和URI,分析它们的请求模式。如果大量请求来自同一IP段或同一AS号,可以考虑在防护层对该IP段进行限制。如果攻击请求的User-Agent集中在少数几种,可以直接封禁这些UA。如果攻击请求的Referer为空或来自特定域名,可以配置Referer白名单。
同时要检查源站日志中是否有大量404、500、502等错误状态码。攻击者可能通过请求不存在的URI来消耗服务器资源,或者通过触发错误来探测源站结构。对404请求做缓存,对错误页面做静态化处理,可以减少这类攻击的影响。日志分析还要关注请求时间分布,如果攻击流量集中在某个时间段,可以结合业务特征判断是恶意攻击还是正常流量高峰。
多层防护的架构设计单靠一层CC防护很难应对复杂攻击,合理的架构应该是多层过滤。第一层是网络层的DDoS清洗,处理大流量洪水攻击;第二层是CDN或高防节点的CC防护,处理HTTP层面的CC攻击;第三层是源站防火墙,只允许可信IP回源,并限制并发连接数和请求速率;第四层是应用层的限流和缓存,对动态接口做细粒度的速率控制和结果缓存。每一层都有明确的职责,任何一层被绕过,其他层仍然能提供保护。
在部署多层防护时,需要注意各层之间的协同。比如CDN层拦截了大部分攻击流量,但源站防火墙如果对CDN回源IP限制过严,可能误伤正常请求。需要合理设置各层的阈值,避免层层叠加导致正常用户访问困难。同时要建立监控告警机制,当源站资源使用率、连接数、错误率超过阈值时及时通知管理员,而不是等到网站完全不可用才发现问题。
代码层面的CC防护加固除了依赖外部防护设备,应用代码本身也需要做CC防护加固。在Web应用入口处增加全局的请求频率限制,可以使用Redis或Memcached实现分布式限流。对每个用户(通过IP或登录标识识别)在单位时间内的请求次数进行计数,超过阈值则返回429状态码或验证码页面。对于登录、注册、支付等关键接口,需要更严格的限流策略,比如单用户每分钟最多5次尝试,超过后锁定一段时间。
数据库查询层面也要做防护。所有SQL查询必须有索引支持,避免全表扫描。对于列表查询,强制使用分页,限制每页最大条数。对于搜索功能,限制关键词长度和搜索频率。对于文件上传和下载接口,限制文件大小和下载速度。这些代码层面的优化不仅能提升正常用户的访问体验,也能显著降低CC攻击对源站的资源消耗。
# Nginx 单IP并发连接数限制示例
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;
# Nginx 请求速率限制示例
limit_req_zone $binary_remote_addr zone=reqperip:10m rate=10r/s;
limit_req zone=reqperip burst=20 nodelay;
# 对动态接口单独限流
location /api/ {
limit_req zone=reqperip burst=10 nodelay;
proxy_pass http://backend;
}
上述Nginx配置中,limit_conn限制单IP并发连接数为20,limit_req限制单IP请求速率为每秒10次,突发允许20次。对于API接口单独设置了更严格的限流。这些配置可以在源站层面提供最后一道防线,即使攻击流量穿透了前端防护,源站也不会被瞬间打垮。
持续监控和策略迭代CC攻击手法不断变化,防护策略也需要持续迭代。每次攻击事件后,都要复盘攻击特征、防护效果和源站表现,更新防护规则。建立常态化的监控体系,对源站的CPU、内存、磁盘IO、网络流量、连接数、请求量、错误率等指标进行实时监控,设置合理的告警阈值。当指标异常时,能够快速定位是攻击还是业务增长,并采取相应措施。
同时要定期检查源站IP是否泄露,可以通过搜索引擎搜索自己的IP、查看DNS历史记录、监控公网扫描行为等方式。一旦发现源站IP暴露,立即更换IP并更新防火墙规则。对于高价值目标,建议使用多个CDN厂商做冗余,当一家厂商的防护被绕过时,可以快速切换到另一家。CC防护不是一次性配置,而是一个持续运营的过程。
最终,CC防御失效的排查需要从流量路径、防护规则、源站性能、应用代码四个层面逐一检查。大多数情况下,问题不是出在防护设备本身,而是部署架构存在缺口、规则配置不合理或源站性能不足以承受放行流量。把每一层都检查到位,CC防御才能真正发挥作用。
