插件窝 干货文章 如何通过Nginx日志防止DDoS攻击

如何通过Nginx日志防止DDoS攻击

Nginx log 日志 防护 237    来源:    2025-05-05

通过Nginx日志防止DDoS攻击的实用方案

DDoS攻击是网站运营中常见的威胁,利用Nginx日志可以有效识别和缓解这类攻击。以下是详细的解决方案:

一、配置Nginx日志以识别DDoS攻击

  1. 优化日志格式

    log_format ddos '$remote_addr - $remote_user [$time_local] '
                  '"$request" $status $body_bytes_sent '
                  '"$http_referer" "$http_user_agent" '
                  'Request_Time=$request_time '
                  'Upstream_Time=$upstream_response_time';
    
  2. 启用访问日志

    access_log /var/log/nginx/access.log ddos;
    

二、实时日志分析工具

  1. 使用GoAccess实时监控

    goaccess /var/log/nginx/access.log -a
    
  2. AWK快速分析

    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
    

三、基于Nginx的防护措施

  1. 限制请求速率

    limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
    
    server {
       location / {
           limit_req zone=one burst=5;
       }
    }
    
  2. 限制并发连接数

    limit_conn_zone $binary_remote_addr zone=addr:10m;
    
    server {
       location / {
           limit_conn addr 10;
       }
    }
    
  3. 屏蔽恶意IP

    location / {
       deny 192.168.1.1;
       allow all;
    }
    

四、自动化防护脚本

  1. 自动封禁高频访问IP

    #!/bin/bash
    LIMIT=100
    LOG_FILE="/var/log/nginx/access.log"
    TEMP_IP_LIST="/tmp/ip_list.txt"
    
    awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr > $TEMP_IP_LIST
    
    while read -r line; do
       COUNT=$(echo $line | awk '{print $1}')
       IP=$(echo $line | awk '{print $2}')
       if [ $COUNT -gt $LIMIT ]; then
           iptables -A INPUT -s $IP -j DROP
           echo "$(date) - Blocked IP: $IP with $COUNT requests" >> /var/log/ddos.log
       fi
    done < $TEMP_IP_LIST
    
  2. 设置cron定时任务

    */10 * * * * /path/to/ddos_protection.sh
    

五、高级防护方案

  1. 使用Fail2Ban

    • 配置Fail2Ban监控Nginx日志
    • 自动封禁异常IP
  2. 启用Nginx Plus的DDoS防护模块(商业版功能)

  3. 结合Cloudflare等CDN服务

    • 启用CDN的DDoS防护
    • 配置Nginx只接受来自CDN的请求

六、日志轮转与保留

  1. 配置logrotate: conf /var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate /etc/init.d/nginx reload > /dev/null endscript }

通过以上方法,您可以有效利用Nginx日志识别和缓解DDoS攻击。对于大规模攻击,建议结合多层防护策略,包括硬件防火墙、CDN服务和云防护解决方案。