Nginx 抵御 CC 攻击的限流模块配置(limit_req/limit_conn)

Nginx 抵御 CC 攻击的限流模块配置(limit_req/limit_conn)
最新回答
进不ㄋ怹

2021-11-03 08:01:16

Nginx 抵御 CC 攻击的限流模块配置主要通过 limit_req 和 limit_conn 实现,结合突发流量控制、细粒度规则及监控优化,可有效缓解攻击压力。 以下是具体配置方法与扩展策略:

一、核心模块配置1. 定义共享内存区域

在 http 块中配置 limit_req_zone 和 limit_conn_zone,用于存储限流状态:

http { # 限制请求速率:每个IP每秒1个请求,共享内存10MB limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; # 限制并发连接数:每个IP最多10个连接,共享内存10MB limit_conn_zone $binary_remote_addr zone=connlimit:10m;}
  • $binary_remote_addr:以客户端IP为限流键,支持IPv4/IPv6。
  • rate=1r/s:每秒允许1个请求,可根据业务调整(如 10r/s)。
  • 共享内存大小:10MB约可存储16万个IP状态,需根据实际IP量调整。
2. 应用限流规则

在 server 或 location 块中引用限流区域:

server { location / { # 请求速率限制:突发5个请求,立即拒绝超额请求 limit_req zone=mylimit burst=5 nodelay; # 并发连接数限制:每个IP最多10个连接 limit_conn connlimit 10; # 其他配置(如代理、缓存等) proxy_pass
http://backend;
}}
  • burst=5:允许短时间突发流量(如5个请求),超出部分立即处理或延迟(取决于 nodelay)。
  • nodelay:启用后,突发请求超出部分直接返回503;禁用时,Nginx会延迟处理超额请求(可能增加资源消耗)。
二、细粒度控制(可选)1. 针对特定路径或方法

对高风险接口(如API、登录页)设置更严格限制:

location /api/login { limit_req zone=mylimit burst=2 nodelay; limit_conn connlimit 5; # 其他安全配置(如验证码、IP黑名单)}2. 按用户代理(User-Agent)限制

过滤恶意爬虫或自动化工具:

map $http_user_agent $limit_bot { default ""; ~*BadBot 1; ~*Scraper 1;}server { location / { if ($limit_bot) { limit_req zone=mylimit burst=1 nodelay; } }}三、自定义限流响应1. 错误页面重定向

通过 error_page 返回友好提示,避免暴露服务器信息:

error_page 503 /503.html;location = /503.html { root /usr/share/nginx/html; internal; # 禁止直接访问}2. 返回JSON格式错误(API场景)location /api/ { error_page 503 @api_error; location @api_error { default_type application/json; return 503 '{"code":503,"message":"Request limit exceeded"}'; }}四、参数调优方法1. 基线测试与逐步调整
  • 监控工具:使用 stub_status 或 Prometheus+Grafana 收集正常流量下的请求速率(requests per second)和并发连接数(active connections)。location /nginx_status { stub_status; allow 127.0.0.1; deny all;}
  • 调整策略:从低限值开始(如 rate=5r/s),逐步增加并观察错误率(503错误占比)。若正常用户被误拦截,需放宽限制;若攻击仍有效,则收紧规则。
2. 动态调整(Nginx Plus)

Nginx Plus支持通过API动态修改限流值,无需重启服务:

curl -X POST "
http://nginx-plus/api/3/http/request-rate-limiting/mylimit"
-H "Content-Type: application/json" -d '{"rate": 10r/s}'3. 用户体验平衡
  • 登录用户放宽限制:通过Cookie或Token识别用户身份,应用不同限流规则。map $cookie_auth $limit_user { default mylimit; # 未登录用户 "logged_in" highlimit; # 登录用户

}

limit_req_zone $limit_user zone=userlimit:10m rate=5r/s; # 登录用户速率更高

### 五、多层次防御策略#### 1. 结合WAF与验证码- WAF:部署ModSecurity或云WAF(如Cloudflare),拦截SQL注入、XSS等攻击。- 验证码:在关键操作(如登录、支付)前要求人机验证(如Google reCAPTCHA)。#### 2. CDN与边缘防护- CDN缓存:静态资源通过CDN分发,减少源站压力。- 边缘限流:利用CDN的速率限制功能(如AWS CloudFront的Rate Limiting)。#### 3. 黑名单与IP封禁- 实时封禁:通过Fail2ban或自定义脚本分析Nginx日志,自动封禁恶意IP。```bash# 示例:封禁5分钟内请求超过100次的IPawk '/GET /api/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | awk '$1 > 100 {print $2}' | xargs -I {} iptables -A INPUT -s {} -j DROP六、监控与优化1. 日志分析
  • 关键字段:提取 $remote_addr、$status、$request_time,统计限流触发频率和性能瓶颈。awk '$9 == 503 {print $1}' /var/log/nginx/access.log | sort | uniq -c
2. 实时仪表盘
  • Grafana模板:使用Nginx官方或社区模板,可视化展示请求速率、错误率、连接数等指标。
3. 长期趋势分析
  • ELK Stack:通过Elasticsearch存储日志,Kibana分析攻击模式(如IP分布、请求路径)。

总结:Nginx的 limit_req 和 limit_conn 是防御CC攻击的基础手段,需结合突发控制、细粒度规则和动态调优。通过多层次防御(WAF、CDN、黑名单)和持续监控,可构建更健壮的防护体系。实际配置需根据业务流量特征和攻击模式灵活调整,避免过度限制影响用户体验。