DDoS防护里最尴尬的局面不是攻击没防住,而是防住了攻击,却把正常用户、搜索引擎蜘蛛、API回调、支付网关甚至自己的运维IP一起封禁了。很多团队在遭遇大流量攻击时第一反应是“先封再说”,结果攻击结束后发现业务掉量、订单异常、收录暴跌,排查半天才意识到是误封造成的次生灾害。要规避这个问题,不能只靠放宽阈值或减少规则,而是要把防护逻辑从“粗粒度封禁”切换到“精细化识别与分层处置”。下面直接讲可落地的技巧。
先分离“可信流量源”与“待检测流量”
误封的第一大来源是防护设备无法区分可信客户端和普通访问者。搜索引擎蜘蛛、支付平台异步通知、CDN回源、合作伙伴API、监控探针这些流量往往具备固定特征,但很多默认防护策略并不识别它们。正确的做法是在接入层建立白名单机制,不按IP段一刀切,而是结合反向DNS、User-Agent、TLS指纹、固定Header和访问路径做组合校验。例如支付回调可以校验来源IP、证书指纹和自定义签名Header,三者同时匹配才放行。搜索引擎蜘蛛则通过反向解析和UA双重验证,避免攻击者伪造蜘蛛UA绕过检测。
白名单不是永久免检,而是进入“低敏感检测通道”。对这些流量只做协议层校验和速率限制,不做激进的行为分析,也不参与自动封禁。这样即使攻击者伪造了部分特征,最多触发速率限制,不会直接导致业务中断。
用“挑战-响应”替代直接封禁
很多误封来自对可疑IP直接发送RST或黑洞路由。攻击流量和正常流量在初期表现相似,直接封禁等于剥夺了正常用户自证的机会。更精细的做法是对可疑会话发起挑战,例如要求客户端完成JavaScript计算、重定向验证或HTTP 503重试。正常浏览器和APP会自动完成这些动作,而多数攻击脚本和僵尸网络不会处理。挑战失败或超时的IP才进入短时限制名单,而不是永久封禁。
挑战机制要按业务场景区分。API接口不适合JavaScript挑战,可以采用“临时降级响应”方式:对可疑API请求返回特定错误码并要求客户端携带服务端下发的token重试。正常SDK会自动处理,攻击工具则无法适配。这样既保护了源站,又不会误伤真实调用方。
分层限速而不是全局阈值
全局QPS或连接数阈值是最容易误封的配置。一个大型NAT出口可能同时有几百个正常用户,一个CDN节点可能汇聚了海量请求,按单IP阈值限制必然误伤。精细化防御要把限速维度拆开:按源IP+目的URL、按源IP+User-Agent、按源IP+会话Cookie、按设备指纹、按ASN归属等组合条件分别设置阈值。
例如对搜索页面可以设置单IP每分钟60次,但对静态资源请求可以放宽到300次;对登录接口设置单IP每分钟5次,但对已登录用户按会话ID限速每分钟30次。攻击者往往集中在少数URL上打满请求,正常用户的访问路径分散,组合维度限速能精准压制攻击而不影响整体业务。
限速动作也分等级:先延迟响应,再排队,最后才拒绝。直接返回429或403对正常用户影响大,延迟响应可以平滑吸收突发流量,同时让攻击连接占用资源但无法获得快速响应。
基于行为基线动态调整封禁策略
静态规则无法适应攻击手法的变化,也容易把正常流量波动当成攻击。建立行为基线是减少误封的关键。对每个源IP或会话记录其历史访问模式:请求间隔、URL分布、参数规律、失败比例、停留时长等。当某个IP的实时行为偏离基线超过阈值时,先标记观察,持续偏离才升级处置。
比如一个正常用户平时请求间隔在2到10秒之间,突然变成每秒50次,这显然是异常。但一个CDN回源IP平时就有高并发,突然翻倍可能是业务促销,不一定是攻击。行为基线能区分这两种情况。基线数据按小时、天、周做滑动窗口统计,避免把周期性业务高峰误判为攻击。
对于无法建立长期基线的源IP,可以采用“首次出现即谨慎”策略:新IP先进入观察池,前几分钟只做宽松限速,不参与自动封禁。攻击流量通常来自大量新IP,但正常新用户也是新IP,观察期能有效降低误封率。
封禁动作要可逆、可追溯、可告警
误封不可怕,可怕的是封了不知道、解封不及时。所有自动封禁动作必须记录完整上下文:触发规则、源IP、目标URL、时间窗口、封禁时长、命中特征。同时推送告警给运维人员,而不是静默执行。封禁时长要分级:首次触发封禁5分钟,二次触发30分钟,三次触发2小时,而不是直接封24小时。攻击者可以换IP,但正常用户被误封后能在短时间内自动恢复。
对于核心业务域名,建议开启“封禁前人工确认”模式。当某个IP或IP段触发高危封禁规则时,先进入隔离队列,由值班人员判断或由二次校验系统自动复核。复核通过才执行封禁,否则放行。这个流程会增加一点响应延迟,但对误封敏感的业务完全值得。
利用边缘节点做“软卸载”而非硬阻断
当攻击流量超过源站承受能力时,很多防护系统会直接把流量黑洞,这会导致该IP段下所有用户都无法访问。精细化防御的做法是在边缘节点对攻击流量做“软卸载”:对可疑请求返回缓存内容、静态占位页或降级数据,而不是完全断开连接。正常用户即使被波及,也能看到部分内容或稍后重试,不会直接超时失败。
软卸载的前提是边缘节点有足够的处理能力。可以把静态资源、商品详情页、文章内容等缓存到边缘,攻击期间源站只处理动态请求和核心交易。攻击流量打在边缘节点上,消耗的是边缘资源,源站保持可用。对边缘节点识别出的正常用户,继续回源获取完整数据;对可疑流量,只返回缓存或降级内容。这样即使部分正常用户被误判为可疑,也只是看到缓存内容,不会完全无法访问。
针对HTTPS和HTTP/2的特性调整防护参数
很多误封来自对TLS握手和HTTP/2连接的处理不当。攻击者发起大量TLS握手但不完成,或者复用HTTP/2多路复用连接打满并发流。防护设备如果按TCP连接数限制,会把正常HTTP/2用户误封,因为HTTP/2单连接承载的请求数远高于HTTP/1.1。正确做法是按“活动流数”和“请求速率”限速,而不是按TCP连接数。对TLS握手设置独立的超时和速率限制,避免未完成握手的连接占用资源导致正常握手被拒。
另外,TLS指纹是识别攻击工具的有效手段。正常浏览器的TLS握手特征与常见攻击库有明显差异,可以在握手阶段识别并标记可疑客户端,而不是等请求进来后再封IP。这样能提前过滤掉大部分脚本攻击,减少后续误封概率。
对封禁IP做“二次验证放行”通道
无论规则多精细,误封仍然可能发生。给被误封用户一个自助解封通道是必要的兜底方案。可以在封禁页面显示提示信息,引导用户完成人机验证或短信验证后自动解封。对于API客户端,可以在封禁响应中返回特定错误码和验证指引,客户端按指引调用解封接口。这个通道本身要做严格限速和防滥用设计,避免攻击者利用它绕过封禁。
解封操作要记录到审计日志,并关联原始封禁记录。如果某个IP频繁触发封禁又频繁解封,说明规则对该IP不适用,需要调整策略或加入例外名单。这个闭环能持续优化防护精度。
定期回放攻击事件,校准规则阈值
精细化防御不是配置完就一劳永逸。每次攻击结束后,要把当时的流量日志、封禁记录、用户投诉、业务数据做关联分析。找出哪些封禁是准确的,哪些是误封,哪些攻击流量漏过了。根据分析结果调整阈值、白名单、行为模型和挑战策略。可以建立误封率指标,例如“每千次封禁中正常用户占比”,目标控制在0.5%以下。超过这个指标就要回溯规则,找到误封集中的特征并修正。
回放分析还能发现攻击者的演化趋势。比如攻击者开始伪造搜索引擎UA,说明UA白名单需要加强验证;攻击者开始使用真实浏览器发起慢速攻击,说明速率阈值需要结合行为分析。持续校准才能让防护体系越来越精准,而不是越来越粗暴。
误封问题的本质是防护系统对“正常”和“异常”的判断粒度不够。把判断依据从单一IP扩展到多维特征,把处置动作从永久封禁改为分级响应,把防护目标从“挡住攻击”升级为“挡住攻击且不伤正常用户”,才能真正实现精细化防御。这些技巧不需要依赖特定厂商设备,在自建防护、云防护和混合架构中都能落地,关键是建立一套可观测、可调整、可回溯的防护闭环。
