使用Nginx、Nginx Plus抵御DDOS攻击的教程

Linux命令

使用Nginx、Nginx Plus抵御DDOS攻击的教程

2025-03-28 00:06


?使用Nginx及Nginx Plus抵御DDoS攻击的实战指南 DDoS攻击(分布式拒绝服务攻击)通过海量请求耗尽服务器资源,导致服务瘫痪。本文将从流量特征分析到配置实战,深度解析如何利用Nginx及Nginx Plus构建防御体系。

                                            




?使用Nginx及Nginx Plus抵御DDoS攻击的实战指南

DDoS攻击(分布式拒绝服务攻击)通过海量请求耗尽服务器资源,导致服务瘫痪。本文将从流量特征分析到配置实战,深度解析如何利用Nginx及Nginx Plus构建防御体系。


防御原理对照表

攻击类型 防御策略 技术原理
HTTP Flood 请求速率限制 识别异常请求频率,阻断超限IP
SYN Flood 连接数控制 限制单IP并发连接,防止半开连接耗尽资源
Slowloris 超时参数优化 缩短客户端请求处理时间,避免连接被长期占用
混合型攻击 动态黑名单(Nginx Plus) 实时分析流量模式,自动封禁恶意IP

核心配置详解(适用于Nginx开源版)

1️⃣ 基础防护层

http {
    # 定义请求频率限制区域
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=100r/s;
  
    # 定义并发连接限制区域
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
  
    server {
        # 应用请求频率限制(突发不超过200请求)
        limit_req zone=req_limit burst=200 nodelay;
      
        # 单IP最大并发连接数
        limit_conn conn_limit 50;
      
        # 客户端超时保护
        client_body_timeout 5s;
        client_header_timeout 5s;
        keepalive_timeout 10s;
    }
}

参数解析

  • limit_req_zone:创建10MB内存区域存储客户端IP请求记录,限制每秒100次请求
  • burst=200:允许突发流量峰值不超过200请求
  • nodelay:立即拒绝超额请求不等待
  • limit_conn 50:单IP最大50个并发连接
  • 超时参数强制断开异常长连接

2️⃣ 高级防护策略

# 屏蔽特定User-Agent
map $http_user_agent $bad_bot {
    default 0;
    ~*(wget|curl|python) 1;
}

# 封禁异常Referer
map $http_referer $bad_ref {
    default 0;
    ~*(xxx.com|spammer.net) 1;
}

server {
    if ($bad_bot) { return 403; }
    if ($bad_ref) { return 403; }
  
    # 限制请求体大小
    client_max_body_size 2m;
  
    # 缓冲区防护
    client_header_buffer_size 2k;
    large_client_header_buffers 4 8k;
}

防御逻辑

  • 通过特征匹配阻断扫描工具流量(如wget/curl/python脚本)
  • 阻止来自已知恶意域名的请求
  • 限制超大文件上传攻击
  • 防止缓冲区溢出攻击

Nginx Plus增强方案

1️⃣ 动态黑名单管理

# 实时统计模块
status_zone attack_zone;

# 自动封禁规则
location / {
    # 当请求频率>500次/分钟触发封禁
    auth_request /_ddos_check;
}

location = /_ddos_check {
    internal;
    proxy_pass http://127.0.0.1:8080/api/check_ip;
    proxy_set_header X-Real-IP $remote_addr;
}

运作流程

  1. 实时统计IP请求频率
  2. 超过阈值时通过API动态更新黑名单
  3. 拒绝列表中的IP后续访问

2️⃣ 精准流量控制

# 按地理区域限速
geo $country {
    default         "";
    192.168.0.0/16  CN;
    10.0.0.0/8      US;
}

map $country $req_limit {
    CN  100r/s;
    US  50r/s;
    ""  10r/s;
}

limit_req_zone $binary_remote_addr zone=geo_limit:10m rate=$req_limit;

优势

  • 区分国内外流量差异化限速
  • 对非常见来源IP实施严格限制

防御效果验证方法

  1. 压力测试工具验证

    # 模拟CC攻击(100并发持续300秒)
    siege -c 100 -t 300s http://yourdomain.com
    
    # 观察Nginx日志过滤情况
    tail -f /var/log/nginx/access.log | grep 503
    
  2. 实时监控指标

    # 查看连接状态
    nginx -T | grep active_connections
    
    # 统计拒绝请求数
    awk '/limit_req/ {print $1,$9}' access.log | sort | uniq -c
    

⚠️ 关键注意事项

  1. 业务特征适配

    • 电商站点:需放行正常秒杀流量
    • API服务:需区分正常接口调用与攻击
  2. 防御阈值公式参考

    最大允许请求速率 = 正常业务峰值 × 安全系数(建议2-3倍)
    例如:日常峰值2000QPS → 限制阈值为4000-6000QPS
    
  3. 日志分析建议

    # 统计TOP攻击IP
    awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
    
    # 检测异常User-Agent
    awk -F\" '{print $6}' access.log | sort | uniq -c | sort -nr
    

通过以上配置组合,可有效抵御90%以上的DDoS攻击。建议每季度进行防御规则审计,并根据业务变化调整阈值参数。对于超大规模攻击,应结合云服务商的清洗服务构建多层防御体系。


label :
  • Nginx
  • Nginx Plus
  • DDOS