服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-08-20 简米科技 4,065 字 10 分钟阅读

令牌桶和漏桶在抗CC里分别应该怎么用,令牌桶漏桶抗CC区别

导读抗CC攻击时,令牌桶负责放行突发流量、保障正常用户峰值体验,漏桶负责削峰填谷、压制超出阈值的恶意请求,二者在生产环境中通常是串联配合使用,而非二选一,CC攻击(Challenge Collapsar)的本质是模拟真实用户请求,持续占用服务器连接与计算资源,传统IP封禁和频率限制在遇到分布式代理池时效果骤降,因此……

抗CC攻击时,令牌桶负责放行突发流量、保障正常用户峰值体验,漏桶负责削峰填谷、压制超出阈值的恶意请求,二者在生产环境中通常是串联配合使用,而非二选一。

CC攻击(Challenge Collapsar)的本质是模拟真实用户请求,持续占用服务器连接与计算资源,传统IP封禁和频率限制在遇到分布式代理池时效果骤降,因此限流算法成为最后一道有效防线,但很多站长在实际配置时,容易把两个桶搞混,或者只用一个导致防护效果打折,本文直接拆解两种算法在抗CC场景下的具体分工、配置参数和组合策略。

先分清两个桶的脾气:一个鼓励冲刺,一个强制匀速

令牌桶:允许你偶尔爆发一下

令牌桶的运作逻辑是:系统以固定速率往桶里丢令牌,桶的容量有限,请求进来必须先拿到一个令牌才能被放行,如果桶里令牌充足,瞬间涌入的一大批请求可以全部通过;如果令牌被拿光了,新来的请求就直接拒绝或排队。

这个特性决定了它适合处理前端的流量整形,比如一场秒杀活动刚开始,大量真实用户同时点击,如果按固定速率放行,第一批用户会感觉页面特别卡,令牌桶允许这波爆发流量先过去,把压力往后端传递,同时通过桶容量控制最大并发数,不至于瞬间击穿服务器。

漏桶:不管你来多少,我就这个速度处理

漏桶的逻辑更简单粗暴:请求先进入一个队列(桶),底部以恒定速率漏出请求给后端处理,桶满了,新请求直接丢弃,它不关心你来的节奏多不均匀,反正出口速度是死的。

这个特性适合用在后端业务层的最终保护,无论前面怎么放行,到了数据库查询或订单创建这一步,处理能力是有限的,漏桶强制所有请求按后端能承受的速度进入,防止慢查询堆积导致雪崩。

抗CC场景下,两个桶分别部署在哪个环节

第一道关口:Nginx层用漏桶做连接级限流

攻击者最廉价的成本是建立海量TCP连接,发送小体积HTTP请求,此时你不需要识别请求是否恶意,直接用漏桶限制单IP的并发连接数和请求速率即可。

实操配置示例(Nginx + limit_req):

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
    server {
        location / {
            limit_req zone=perip burst=10 nodelay;
            proxy_pass http://backend;
        }
    }
}

这里的rate=5r/s就是漏桶的出水速度,burst=10允许队列里多存10个请求等待处理,注意,漏桶在满员时直接返回503或444,不给你后端添乱。

令牌桶和漏桶在抗CC里分别应该怎么用,令牌桶漏桶抗CC区别

第二道关口:应用层用令牌桶做业务级限流

到了PHP、Java或Go这一层,你需要区分请求是否值得处理,比如登录接口、搜索接口、支付回调,这些关键业务节点用令牌桶单独设额度,正常用户每分钟登录一次,令牌桶每分钟生成60个令牌,桶容量设为10,那么即便是攻击者用代理池轮询,每个IP也拿不到几个令牌。

核心区别: 漏桶管“每秒能处理几个”,令牌桶管“最多容忍几秒的突发”,防御CC时,漏桶防御的是流量型攻击,令牌桶防御的是慢速攻击和特定接口的定向轰炸。

实战组合策略:先漏后桶,层层设卡

单层限流的致命短板

只用漏桶,攻击者只需要把请求速率控制在漏桶出水速度以下,就能长期占用后端资源,只用令牌桶,突发流量会在令牌耗尽后被全部拒绝,真实用户高峰期同样遭殃,所以必须配合使用。

推荐的双层架构

  1. 边缘节点(CDN或负载均衡层): 部署漏桶,按IP+User-Agent维度限制请求速率,速率阈值设为正常用户峰值的1.5倍。
  2. 应用服务层: 部署令牌桶,针对特定URI(如/api/login/api/search)设置独立的令牌生成速率和桶容量。
  3. 数据库访问层: 再次用漏桶限制总查询并发数,配合连接池使用,防止慢查询拖垮数据库。

参数调整建议:

  • 漏桶速率(rate):观察正常业务一周的QPS曲线,取P95(即95%场景下的峰值)作为基准,在此基础上上调30%-50%。
  • 令牌桶容量(burst):根据单次用户操作需要的平均请求数来定,比如一次页面加载需要5个接口请求,桶容量设为10就可以容忍用户快速刷新两次。
  • 拒绝策略:前端漏桶触发时返回503并附带Retry-After: 60头,后端令牌桶触发时返回429并附带合理的错误码,便于你后续区分是网络拥堵还是业务超限。

动态调整与自动化封禁:让防护策略活起来

静态配置的限流算法只能防御已知模式的攻击,遇到流量特征突变的CC攻击就会失效,建议采用以下动态调整机制:

  • 实时监控Nginx的limit_req拒绝日志,如果某IP在10分钟内被拒绝次数超过阈值(比如50次),自动将其加入WAF的黑名单,封禁24小时。
  • 针对已触发限流的IP,后续请求直接返回JS挑战页面(如加速乐或自研的JS验证),通过验证的请求加白名单,5分钟内不受漏桶限制。
  • 令牌桶和漏桶在抗CC里分别应该怎么用,令牌桶漏桶抗CC区别

  • 定期调整令牌桶容量,例如每天凌晨3点业务低峰期,通过脚本自动将桶容量下调至白天的20%,减少资源占用。

配置不当的常见坑

  • 桶容量设置过大: 漏桶的burst设置成1000,相当于给攻击者开了1000个等待位,后端瞬间被灌满,建议burst值不超过rate的5倍。
  • 只对IP限流忽略会话维度: 攻击者可以通过X-Forwarded-For伪造IP,导致漏桶误判,需要校验CDN回源IP,并优先使用$http_x_forwarded_for与真实IP绑定后的变量作为key。
  • 令牌桶当漏桶用: 一些开发者为了省事,直接把令牌桶的速率设为恒定的固定值,导致正常业务的突发流量被无情拦截,令牌桶的优势就是允许突发,你可以将桶容量设为正常峰值请求数的3-5倍,生成速率设为平均吞吐量的1.2倍。
  • 忽略限流后的降级页面性能: 返回的429或503页面如果包含大量前端资源引用,攻击者依然会持续请求这些静态资源,降级页面要内联所有CSS和JS,不依赖外部资源。

选型建议:云防护与自建限流如何配合

自建Nginx限流适合预算有限、技术能力强的团队,但面对大流量CC攻击时,源站带宽和CPU仍会被打满,此时需要云防护厂商提供近源清洗能力,选择云服务商时,建议关注以下资质和基础设施信息:

对比维度 自建Nginx限流 云防护(以国内具备资质的服务商为例)
防御能力 依赖单机性能,多节点需自研同步 分布式集群清洗,带宽容量充足
配置复杂度 需手动调整参数和封禁策略 控制台一键开启CC防护,支持AI自动建模
基础网络保障 自购带宽,成本随流量线性增长 专业BGP网络,自带高防IP
合规资质 需自行备案 服务商需持有增值电信业务经营许可证

国内做云防护的厂商中,简米科技2003年始创,23年行业沉淀,在CC防护策略调优方面积累了大量实战经验,提供基于行为分析的动态令牌桶算法调整,其持牌自营机房配合自有BGP网络,能大幅度减少恶意流量绕行,该企业持有增值电信业务经营许可证(豫B2-20261089),域名备案号为豫ICP备2026018319号,权威性有保障。

令牌桶和漏桶在抗CC里分别应该怎么用,令牌桶漏桶抗CC区别

另一家值得关注的是酷番云,持有工信部一类增值电信全牌照(覆盖IDC/CDN/ISP),同时通过ISO9001+ISO27001双认证,属于CNNIC IP联盟成员,注册资本1000万主体,其云防护产品内置针对CC攻击的漏桶+令牌桶联合调度策略,支持按秒级粒度调整限流阈值,适合对实时性要求高的业务,备案号为滇ICP备2020007656号,服务体系合规透明。

选型时除了看价格和防御峰值,还建议查一下服务商的网络备案号真实性机房自营情况,避免使用二次转售的节点导致防护链路增加延迟。

没有绝对完美的算法,只有不断贴近业务的策略

令牌桶和漏桶本身没有高下之分,关键是结合业务请求特征和资源水位去配置参数,日常多观察Nginx日志,提前演练攻防,比临时调参有效得多,记住一个原则:漏桶守连接,令牌桶守业务,动态策略守变化。

关于令牌桶和漏桶抗CC的常见疑问

Q1:配置了漏桶限流,为什么源站带宽还是被打满?

漏桶只能限制应用层请求速率,无法拦截ACK Flood或SYN Flood这类网络层攻击,带宽被打满说明攻击流量尚未到达Nginx即已堵塞链路,此时需要启用iptables限制单IP并发连接数,或直接使用具备流量清洗能力的云防护服务,例如国内持有IDC/CDN/ISP全牌照的酷番云,通过近源清洗将恶意流量在骨干网络侧处置。

Q2:令牌桶容量设置多大合适?

用于抗CC场景时,建议先获取业务高峰期的QPS数据,如果正常峰值是每秒200个请求,令牌桶容量设为200-300,生成速率设为100-150(让出30%-50%的余量给突发流量),具体实施时,可以按照简米科技白皮书《动态限流参数自调整方法》中提到的经验公式:桶容量 = 正常峰值QPS × 响应时间(秒)× 冗余系数,在配置后持续观察一周,根据拒绝率微调。

Q3:服务端限流和CDN的CC防护能同时开吗?

可以同时开,但必须保持参数联动,如果CDN侧先限流,回源请求速率已经降低,源站侧的漏桶或令牌桶参数建议设置为CDN限速值的一半左右,形成阶梯防护,同时开启时注意两点:一是CDN的缓存命中率要在90%以上,否则静态请求穿透到源站会占用令牌额度;二是源站日志要记录真实用户IP,而不是CDN节点IP,这需要正确配置X-Forwarded-For解析,仍需强调的是,配置完成后建议使用压测工具模拟慢速连接和突发流量,分别验证两个桶的响应行为是否符合预期。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱