插件窝 干货文章 深入理解Nginx的限制请求速率和防止恶意请求的安全防护策略

深入理解Nginx的限制请求速率和防止恶意请求的安全防护策略

limit Nginx 限制 请求 526    来源:    2025-04-12

Nginx请求速率限制与恶意请求防护策略

1. 请求速率限制基础

Nginx提供了limit_req_zonelimit_req指令来实现请求速率限制:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://backend;
        }
    }
}
  • limit_req_zone定义限制区域:

    • $binary_remote_addr:基于客户端IP限制
    • zone=one:10m:创建名为"one"的共享内存区,10MB大小
    • rate=10r/s:限制每秒10个请求
  • limit_req应用限制:

    • burst=20:允许突发20个请求
    • nodelay:不延迟处理突发请求

2. 高级速率限制策略

2.1 多级速率限制

http {
    limit_req_zone $binary_remote_addr zone=strict:10m rate=2r/s;
    limit_req_zone $binary_remote_addr zone=normal:10m rate=10r/s;

    server {
        location /login {
            limit_req zone=strict burst=5 nodelay;
        }

        location /api/ {
            limit_req zone=normal burst=20;
        }
    }
}

2.2 基于地理位置的限制

geo $limit {
    default         1;
    192.168.0.0/24 0;
    10.0.0.0/8     0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=api:10m rate=5r/s;

3. 防止恶意请求

3.1 限制HTTP方法

location / {
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 405;
    }
}

3.2 阻止常见攻击模式

# 阻止SQL注入
location ~* "(\<|%3C).*script.*(\>|%3E)" {
    return 403;
}

# 阻止目录遍历
location ~* (\.\./|\.\.\\) {
    return 403;
}

# 阻止敏感文件访问
location ~* \.(htaccess|htpasswd|ini|log|sh|sql)$ {
    return 403;
}

3.3 限制连接数

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

    server {
        location /download/ {
            limit_conn addr 5;
        }
    }
}

4. 动态黑名单管理

4.1 使用Nginx+Lua实现动态黑名单

http {
    lua_shared_dict ip_blacklist 10m;

    server {
        location / {
            access_by_lua_block {
                local blacklist = ngx.shared.ip_blacklist
                local client_ip = ngx.var.remote_addr

                if blacklist:get(client_ip) then
                    ngx.exit(ngx.HTTP_FORBIDDEN)
                end
            }
        }

        location /admin/blacklist {
            content_by_lua_block {
                -- 这里可以实现添加/移除IP的API
            }
        }
    }
}

4.2 结合Fail2Ban自动封禁

Fail2Ban可以分析Nginx日志并自动添加IP到黑名单:

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=nginx-req-limit, port="http,https"]
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 600
bantime = 3600

5. 高级防护策略

5.1 人机验证挑战

对于可疑请求返回验证挑战:

location / {
    if ($http_user_agent ~* (wget|curl|httrack|nikto|sqlmap)) {
        return 444;
    }

    if ($http_referer ~* (babes|click|diamond|forsale|girl|jewelry|love|nudit|organic|poker|porn|poweroversoftware|sex|teen|video|webcam|zippo)) {
        return 444;
    }
}

5.2 请求指纹识别

map $http_user_agent $bad_ua {
    default 0;
    ~*(libwww-perl|python-requests|Go-http-client|Java|curl|Wget) 1;
}

server {
    if ($bad_ua) {
        set $block_ua 1;
    }

    if ($block_ua = 1) {
        return 403;
    }
}

6. 监控与日志

6.1 详细日志记录

log_format security '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   'Rate: $limit_req_status Conn: $limit_conn_status';

access_log /var/log/nginx/security.log security;

6.2 实时监控

使用Nginx Plus或第三方工具如Prometheus+Grafana监控: - 请求速率 - 被限制的请求数 - 黑名单IP数量 - 异常请求模式

7. 最佳实践建议

  1. 分层防御:在网络边缘、Nginx和应用层都实施防护
  2. 渐进式限制:从宽松开始,根据监控数据逐步收紧
  3. 白名单优先:对已知安全流量优先放行
  4. 定期审计:审查限制规则的有效性和误杀情况
  5. 组合策略:结合速率限制、连接限制和请求过滤
  6. 动态调整:根据攻击态势动态调整防护策略
  7. 优雅降级:对受限用户返回429而不是503,包含重试时间

通过合理配置这些策略,可以显著提高Web应用的安全性,同时确保正常用户的访问体验。