从一次线上服务卡顿说起我是如何用Nginx限流和Cloudflare CDN挡住HTTP Flood攻击的那天下午三点监控系统的告警突然炸开了锅。CPU使用率从平时的30%飙升至95%响应时间从200ms暴涨到5秒以上服务器像被灌了铅一样沉重。登录服务器一看Nginx错误日志里密密麻麻全是499状态码——客户端主动断开连接的标志。这不是普通的流量高峰而是一场蓄谋已久的HTTP Flood攻击。1. 攻击现象分析与快速响应当我第一次看到监控图表上那条陡峭的上升曲线时第一反应是检查最近是否有营销活动或内容上了热搜。但后台数据显示新增用户数并没有明显变化这排除了正常流量激增的可能性。关键异常指标每秒请求数(RPS)从200激增至8000同一IP在1分钟内发起300请求User-Agent集中在Go-http-client/1.1和python-requests/2.26.0请求路径集中在/login和/search等计算密集型接口通过实时流量分析工具我快速锁定了攻击特征# 统计前10个高频率IP cat /var/log/nginx/access.log | awk {print $1} | sort | uniq -c | sort -nr | head -n 10 # 分析异常User-Agent grep -E Go-http-client|python-requests /var/log/nginx/access.log | wc -l2. Nginx层防御构建第一道防线面对汹涌而来的恶意请求我决定先在Nginx层面实施紧急限流措施。Nginx的limit_req模块能有效控制请求速率而limit_conn模块则可以限制并发连接数。2.1 基础限流配置在Nginx配置文件的http块中添加共享内存区定义http { limit_req_zone $binary_remote_addr zoneapi_limit:10m rate30r/m; limit_conn_zone $binary_remote_addr zoneaddr:10m; }然后在敏感接口的location块中应用这些限制location /login { limit_req zoneapi_limit burst5 nodelay; limit_conn addr 3; proxy_pass http://backend; # 返回429状态码而非默认的503 limit_req_status 429; limit_conn_status 429; }参数说明参数说明推荐值zone定义共享内存区每1MB可存约8000个IPrate允许的请求速率30r/m (每分钟30次)burst允许的突发请求数5-10nodelay立即拒绝超额请求建议启用2.2 高级防护策略针对更狡猾的攻击者我增加了基于地理位置的过滤和User-Agent验证map $http_user_agent $bad_ua { default 0; ~*Go-http-client 1; ~*python-requests 1; ~*curl 1; } geo $block_country { default 0; # 已知攻击源国家代码 CN 1; RU 1; } server { if ($bad_ua) { return 444; } if ($block_country) { return 403; } }3. Cloudflare防护构建分布式防御体系仅靠服务器自身防御还不够我决定启用Cloudflare的企业级防护能力。通过其免费套餐就能获得基础DDoS防护而Pro套餐则提供更精细的WAF规则。3.1 基础防护设置在Cloudflare控制台启用Im Under Attack模式配置安全级别为High开启Bot Fight Mode设置浏览器完整性检查Cloudflare防护层级对比功能免费套餐Pro套餐Business套餐DDoS防护✓✓✓WAF规则数520100速率限制1条规则10条规则15条规则Bot防护基础增强高级3.2 自定义防火墙规则针对本次攻击特征我创建了以下规则(http.user_agent contains Go-http-client or http.user_agent contains python-requests) and (cf.threat_score gt 10) and not (ip.src in {192.0.2.1 203.0.113.0/24})动作设置为Block并添加验证码挑战作为备用措施。这条规则成功拦截了85%的恶意流量。4. 事后分析与系统加固攻击平息后我进行了全面的复盘发现几个关键漏洞监控系统告警阈值设置过高导致响应延迟关键API接口没有单独的限流策略缺少对异常User-Agent的主动过滤加固措施清单将CPU告警阈值从90%下调至70%为所有动态接口添加单独的限流配置部署Fail2Ban自动封禁恶意IP定期更新已知恶意User-Agent列表启用Nginx的缓存机制减轻后端压力# Fail2Ban配置示例 [nginx-http-flood] enabled true filter nginx-http-flood logpath /var/log/nginx/access.log maxretry 100 findtime 60 bantime 86400 action cloudflare5. 成本效益分析与方案选型防御DDoS攻击需要在安全性和成本之间找到平衡。经过这次事件我总结出不同规模网站的防护方案小型网站(预算有限)Cloudflare免费套餐 Nginx基础限流最大程度利用CDN缓存启用基本的WAF规则中型业务(有一定预算)Cloudflare Pro套餐($20/月)精细化的速率限制规则自定义WAF规则第三方监控服务如Pingdom关键业务(不计成本)专用DDoS防护服务如Cloudflare Enterprise多地负载均衡自动扩展的云基础设施24/7安全运维团队实际测试中纯Nginx方案能抵御约5000 RPS的攻击而配合Cloudflare后系统成功扛住了超过20000 RPS的冲击。