插件窝 干货文章 Nginx限制访问频率配置,防止恶意攻击

Nginx限制访问频率配置,防止恶意攻击

限制 配置 limit Nginx 175    来源:    2025-04-16

Nginx限制访问频率配置指南

Nginx可以通过多种方式限制访问频率,防止恶意请求和DDoS攻击。以下是几种常用的配置方法:

1. 使用limit_req模块限制请求速率

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

    server {
        location / {
            limit_req zone=one burst=20 nodelay;
            # 其他配置...
        }
    }
}

参数说明: - zone=one:10m:创建名为"one"的共享内存区,大小为10MB - rate=10r/s:限制每秒10个请求 - burst=20:允许突发20个请求 - nodelay:不延迟处理突发请求,直接拒绝超过限制的请求

2. 使用limit_conn模块限制并发连接数

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

    server {
        location / {
            limit_conn addr 5;
            # 其他配置...
        }
    }
}

参数说明: - zone=addr:10m:创建名为"addr"的共享内存区,大小为10MB - limit_conn addr 5:每个IP地址最多允许5个并发连接

3. 结合GeoIP模块限制特定国家/地区的访问

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    map $geoip_country_code $allowed_country {
        default yes;
        CN no;  # 阻止中国IP
        RU no;  # 阻止俄罗斯IP
    }

    server {
        if ($allowed_country = no) {
            return 403;
        }
        # 其他配置...
    }
}

4. 限制特定URI的访问频率

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

    server {
        location /login {
            limit_req zone=login burst=5;
            # 其他配置...
        }
    }
}

5. 使用fail2ban配合Nginx日志进行动态封禁

  1. 首先配置Nginx记录访问日志:
http {
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

    access_log /var/log/nginx/access.log main;
}
  1. 然后配置fail2ban规则来监控Nginx日志并自动封禁恶意IP

6. 限制大文件下载速度

server {
    location /downloads/ {
        limit_rate 50k;  # 限制下载速度为50KB/s
        # 其他配置...
    }
}

最佳实践建议

  1. 分层防御:结合多种限制方法,如同时使用请求速率限制和连接数限制
  2. 合理设置阈值:根据实际业务需求设置合理的限制值,避免影响正常用户
  3. 监控和调整:定期检查Nginx日志和限制效果,根据需要调整配置
  4. 白名单机制:为可信IP或内部网络设置白名单,不受限制
  5. 错误页面友好:为被限制的请求配置友好的错误页面

白名单配置示例

geo $limit {
    default 1;
    10.0.0.0/8 0;  # 内部网络
    192.168.0.0/16 0;  # 内部网络
    1.2.3.4 0;  # 特定IP
}

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

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

server {
    location / {
        limit_req zone=req_zone burst=10 nodelay;
        # 其他配置...
    }
}

通过以上配置,可以有效地保护您的网站免受恶意请求和DDoS攻击的影响。