Warum Ratenbegrenzung Wichtig ist

Jeder öffentlich zugängliche Webserver ist Traffic-Spitzen, automatisierten Scrapern, Brute-Force-Anmeldeversuchen und verteilten Denial-of-Service-Angriffen (DDoS) ausgesetzt. Ohne Ratenbegrenzung kann ein einzelner missbräuchlicher Client die CPU, den Speicher und die Dateideskriptoren Ihres Servers erschöpfen und den Dienst für legitime Benutzer unverfügbar machen.

Die integrierte Ratenbegrenzung von Nginx bietet eine leichtgewichtige, leistungsstarke Verteidigungsschicht, die auf der Reverse-Proxy-Ebene arbeitet — bevor Anfragen jemals Ihre Anwendung erreichen.

Voraussetzungen

  • Nginx 1.18+ installiert (beide Module sind standardmäßig kompiliert).
  • sudo- oder Root-Zugang zur Bearbeitung der Nginx-Konfigurationsdateien.
  • Grundlegende Vertrautheit mit der Nginx-Konfigurationssyntax.
  • Ein Testwerkzeug wie curl, Apache Bench (ab) oder wrk.

Schritt-für-Schritt-Lösung

1. Eine Ratenbegrenzungszone Definieren

http {
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
    limit_req_zone $binary_remote_addr zone=general:10m rate=30r/s;
}

2. Ratenbegrenzung auf Standorte Anwenden

server {
    listen 80;
    server_name beispiel.com;

    limit_req zone=general burst=50 nodelay;
    limit_req_status 429;

    location /api/auth/login {
        limit_req zone=login burst=3 nodelay;
        proxy_pass http://backend;
    }

    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://backend;
    }

    location /static/ {
        limit_req off;
        alias /var/www/static/;
    }
}

burst und nodelay verstehen:

  • burst=N: Erlaubt bis zu N zusätzliche Anfragen über dem Limit, die in eine Warteschlange gestellt werden.
  • nodelay: Verarbeitet Burst-Anfragen sofort ohne Verzögerung.
  • delay=N: (Nginx 1.15.7+) Hybrid: Die ersten N Burst-Anfragen werden sofort verarbeitet, der Rest wird verzögert.

3. Verbindungsbegrenzung Konfigurieren

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

    server {
        limit_conn addr 10;
        limit_conn_status 429;

        location /downloads/ {
            limit_conn addr 2;
            limit_rate 500k;
        }
    }
}

4. Vertrauenswürdige IPs Ausschließen

http {
    geo $limit_key {
        default         $binary_remote_addr;
        10.0.0.0/8      "";
        192.168.1.0/24  "";
        203.0.113.50    "";
    }

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

5. Benutzerdefinierte Fehlerantworten

error_page 429 = @rate_limited;

location @rate_limited {
    default_type application/json;
    return 429 '{"error": "rate_limit_exceeded", "message": "Zu viele Anfragen. Bitte versuchen Sie es in einigen Sekunden erneut.", "retry_after": 1}';
}

6. Konfiguration Testen

sudo nginx -t
sudo systemctl reload nginx
ab -n 100 -c 10 http://beispiel.com/api/data

Stolperfallen und Sonderfälle

  • Reverse-Proxy-Ketten: Wenn Nginx hinter einem Load Balancer steht, verwenden Sie das realip-Modul, um die echte Client-IP zu extrahieren.
  • IPv6-Adressen: $binary_remote_addr ist 16 Bytes für IPv6 (vs. 4 für IPv4). Dimensionieren Sie die Zonen entsprechend.

Prävention

  • Kombinieren Sie mit einer WAF: Verwenden Sie ModSecurity, Cloudflare oder AWS WAF für Verteidigung in der Tiefe.
  • Verwenden Sie fail2ban: Sperren Sie automatisch IPs, die dauerhaft Ratenbegrenzungen überschreiten.
  • Überwachen Sie mit Metriken: Exportieren Sie Metriken mit dem stub_status-Modul und alarmieren Sie bei erhöhten 429-Raten.

Zusammenfassung

  • Nginx Ratenbegrenzung verwendet limit_req_zone/limit_req für Anfrage-Raten und limit_conn_zone/limit_conn für Verbindungslimits.
  • Der Leaky-Bucket-Algorithmus glättet Traffic-Spitzen anstatt starre Zählungen pro Sekunde zu erzwingen.
  • Konfigurieren Sie immer burst und nodelay für Produktionslasten.
  • Verwenden Sie limit_req_status 429, um den Standard-HTTP-429-Statuscode zurückzugeben.

Verwandte Artikel