微信公众号
扫描关注微信公众号
博客大厅

如何配置 Nginx 防止 DDoS 攻击?

原创 来源:博客站 阅读 0 今天 07:39:35 听全文

在 Nginx 中配置 DDoS 防护需要结合 流量限制、连接控制、缓存优化 等多层防御策略。以下是经过实战验证的完整方案,涵盖从基础到高级的防护措施:


一、基础防护(HTTP/HTTPS 层)

1. 限制请求速率

http {
    # 定义共享内存区(1MB≈1.6万IP状态,rate=10r/s)
    limit_req_zone $binary_remote_addr zone=req_flood:10m rate=10r/s;

    server {
        listen 80;
        
        # 全局请求速率限制(突发50请求)
        location / {
            limit_req zone=req_flood burst=50 nodelay;
            proxy_pass http://backend;
        }

        # 关键API更严格限制
        location /api/login {
            limit_req zone=req_flood burst=5 nodelay;
        }
    }
}

作用:防止高频请求压垮服务器。


2. 限制并发连接数

http {
    limit_conn_zone $binary_remote_addr zone=conn_flood:10m;

    server {
        location / {
            limit_conn conn_flood 20;  # 单IP最大20并发连接
            limit_rate 500k;           # 限速500KB/秒
        }
    }
}

作用:防止单个IP占用过多连接资源。


二、高级防护(网络层与应用层)

1. 封禁恶意IP/IP段

# 创建黑名单文件 /etc/nginx/blockips.conf
deny 192.168.1.100;
deny 10.0.0.0/8;

# 在Nginx配置中引入
http {
    include /etc/nginx/blockips.conf;
}

动态封禁:结合 fail2ban 或脚本自动更新黑名单。


2. 启用SYN Cookie防御SYN Flood

# 在/etc/sysctl.conf中设置
net.ipv4.tcp_syncookies = 1
sysctl -p

作用:缓解TCP半连接攻击。


3. 限制特定User-Agent(如恶意爬虫)

map $http_user_agent $block_ua {
    default 0;
    "~*(wget|curl|nikto|sqlmap)" 1;
}

server {
    if ($block_ua) {
        return 403;
    }
}

三、反向代理优化

1. 缓冲与超时设置

location / {
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 16k;
    proxy_busy_buffers_size 24k;
    
    # 快速失败避免阻塞
    proxy_connect_timeout 3s;
    proxy_read_timeout 3s;
}

作用:防止慢速攻击(Slowloris)。


2. 关闭非必要HTTP方法

location / {
    limit_except GET POST {
        deny all;
    }
}

四、系统级加固

1. 调整内核参数

# /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.core.somaxconn = 65535

生效命令:sysctl -p


2. 限制文件描述符

# /etc/security/limits.conf
nginx soft nofile 65535
nginx hard nofile 65535

五、完整配置示例

http {
    # 基础限流
    limit_req_zone $binary_remote_addr zone=req_flood:10m rate=10r/s;
    limit_conn_zone $binary_remote_addr zone=conn_flood:10m;

    # 黑名单
    include /etc/nginx/blockips.conf;

    server {
        listen 80;
        
        # 全局防护
        limit_req zone=req_flood burst=50 nodelay;
        limit_conn conn_flood 20;

        # 静态资源宽松策略
        location ~* .(jpg|css|js)$ {
            limit_req zone=req_flood burst=100;
            expires 7d;
        }

        # 动态接口严格防护
        location /api/ {
            limit_req zone=req_flood burst=5;
            limit_conn conn_flood 5;
            proxy_pass http://backend;
        }

        # 封禁扫描器
        if ($http_user_agent ~* (nikto|sqlmap)) {
            return 444;
        }
    }
}

六、验证与监控

  1. 测试防护效果

    # 模拟攻击(需安装siege)
    siege -c 100 -t 60s http://example.com/api/
    
  2. 监控日志

    tail -f /var/log/nginx/error.log | grep 'limiting requests'
    
  3. 实时状态查看

    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
    

七、云环境补充方案

  1. 启用Cloudflare/WAF
    • 在Nginx前部署CDN,启用5秒盾、JS挑战等。
  2. 弹性扩容
    • 使用Kubernetes或云厂商的自动伸缩组(Auto Scaling)。

总结

  • 轻度攻击:Nginx限流+连接控制即可缓解。
  • 大规模DDoS:需结合云WAF、Anycast清洗和ISP协作。
  • 持续优化:根据业务流量模式调整阈值,避免误杀正常用户。
学在每日,进无止境!更多精彩内容请关注微信公众号。
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/966.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。