Zum Inhalt

Nginx DDoS Protection einrichten

Diese Anleitung zeigt, wie Sie schnell und einfach eine DDoS Protection auf Ihrem Nginx Server einrichten können.

Information vorab

Im Optimalfall filtert die Firewall den meisten Traffic schon raus, damit der Webserver/Reverse-Proxy nicht so geflutet wird. Für den Fall aber, dass die Firewall Anfragen-Flutungen nicht erkennt (da Layer 7 OSI Schicht), konfigurieren wir hier den Nginx für solche Fälle.

Konfigurationen

Im nachfolgenden die Konfigurationen zum Copy-Pasten:

nginx.conf

http {

    ...

    # Limits
    limit_req_log_level    warn;

    # Verbindungslimits
    limit_conn_zone $realip_remote_addr zone=addr:50m;

    # Allgemeine Requests
    limit_req_zone $realip_remote_addr zone=req_general:50m rate=50r/s;

    # Strenge Login-Zone
    limit_req_zone $realip_remote_addr zone=req_login:10m rate=10r/m;

    # API-Zone
    limit_req_zone $realip_remote_addr zone=req_api:20m rate=50r/m;

    limit_conn_status 429;
    limit_req_status 429;

    ...

}

Erklärungen

Limits Logging
limit_req_log_level warn;
  • Legt fest, wie Nginx Verstöße gegen Rate-Limits ins Error-Log schreibt
  • warn bedeutet, dass Limit-Verstöße als Warnungen geloggt werden
  • Andere Optionen: info, notice, error
Verbindungslimits
limit_conn_zone $realip_remote_addr zone=addr:50m;
  • Erstellt eine Zone addr mit 50 MB Speicher
  • Key: $realip_remote_addr (Client-IP)
  • Verwendet für limit_conn addr 50; im Server/Location-Block
  • Maximal erlaubte gleichzeitige Verbindungen pro IP
Allgemeine Requests
limit_req_zone $realip_remote_addr zone=req_general:50m rate=50r/s;
  • Zone req_general für normale Webseiten-Anfragen
  • Key: $realip_remote_addr
  • Rate: 50 Requests pro Sekunde pro IP
  • Burst kann separat im Server/Location-Block gesetzt werden
Strenge Login-Zone
limit_req_zone $realip_remote_addr zone=req_login:10m rate=10r/m;
  • Zone req_login für Login-/Auth-Endpunkte
  • Sehr streng: 10 Requests pro Minute pro IP
  • Schutz vor Brute-Force-Angriffen
API-Zone
limit_req_zone $realip_remote_addr zone=req_api:20m rate=50r/m;
  • Zone req_api für API-Endpunkte
  • Rate: 50 Requests pro Minute pro IP
  • Erlaubt mehr Requests als Login, schützt aber trotzdem
Statuscodes bei Limit-Überschreitung
limit_conn_status 429;
limit_req_status 429;
  • Standardmäßig sendet Nginx ggf. 503 oder 444 bei Limits
  • Mit diesen Direktiven: HTTP 429 Too Many Requests
  • Clients erkennen Limits sauber

sites-enabled/website.conf

    ...

    # security
    limit_conn addr 50;
    limit_req zone=req_general burst=10 nodelay;

    # Methodenschutz
    if ($request_method ~* "(CONNECT|TRACE|TRACK)") {
        return 405;
    }

    # Blockiere zu lange URLs
    if ($request_uri ~ "^. {2048,}$") {
        return 414;
    }

    ...