Nginx可通过limit_conn限制IP并发连接数防御CC攻击,配合limit_req控制请求速率、调优keepalive参数、区分可信来源并监控503状态码实现多层防护。

针对CC攻击,Nginx可通过限制并发连接数来缓解恶意请求洪泛,核心在于合理配置连接层面的限流策略,而非仅依赖请求频率控制。
使用 limit_conn 模块限制同一IP的并发连接数
Nginx内置的 limit_conn 指令可对客户端IP建立的并发连接总数进行硬性限制,这对阻断CC攻击中大量短连接刷取资源的行为非常有效。需先在 http 块中定义共享内存区域,再在 server 或 location 块中应用:
- 在 http 块中添加:limit_conn_zone $binary_remote_addr zone=addr:10m;(10MB内存约可存储约16万IP)
- 在 server 或 location 中添加:limit_conn addr 10;(表示每个IP最多维持10个并发连接)
- 建议配合 limit_conn_log_level warn; 和 limit_conn_status 503;,便于日志追踪与返回友好状态码
结合 limit_req 控制请求速率,弥补连接限制盲区
仅靠 limit_conn 无法限制单个长连接内高频请求(如WebSocket或Keep-Alive下的反复API调用),此时需叠加 limit_req 模块:
- 定义请求速率限制: limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
- 在 location 中启用: limit_req zone=req burst=20 nodelay;(允许突发20个请求,不延迟处理)
- 注意:burst 值不宜过大,否则会削弱防护效果;nodelay 可避免排队等待,但需确保后端能承受瞬时压力
调整 keepalive 相关参数,降低连接驻留时间
CC攻击常利用长连接持续占用服务资源,适当收紧 keepalive 配置可加快连接释放:
- 设置 keepalive_timeout 15s;(默认75秒,建议缩至10–30秒)
- 限制单个连接最大请求数:keepalive_requests 50;(达到后主动断开,防止复用连接反复刷量)
- 对静态资源或公开接口,可考虑关闭 keepalive:keepalive_disable msie6; 或在特定 location 中设为 off
区分可信来源,避免误伤正常用户
直接按IP限流可能影响NAT环境(如企业出口、校园网)下的真实用户,应通过白名单或变量分层控制:
- 将已知可信IP段排除在限制之外:geo $limited_ip { default 1; 192.168.0.0/16 0; 10.0.0.0/8 0; },再用 limit_conn addr 10 if=$limited_ip;
- 对登录态用户(如含有效Cookie)放宽限制,可基于 $cookie_uid 或 $arg_token 构建更精细的 zone
- 监控 access.log 中 503 状态码占比,若突增需检查是否规则过严或遭遇新型绕过手法










