Die meisten Hosting-Tarife versprechen DDoS-Schutz. Das bedeutet in der Regel, dass große Fluten von Müllpaketen (Schicht 3 und 4) gefiltert werden, bevor sie Ihren Server erreichen. Nicht aufgehalten wird, dass tausend „echte“ Browser gleichzeitig Ihre langsamste Seite laden. Solche Angriffe auf der Anwendungsschicht (Schicht 7) sehen aus wie normale Besucher, und Sie müssen sie selbst bewältigen. Hintergründe finden Sie unter Was DDoS-Schutz ist.
Den Unterschied kennen
- Volumetrische Fluten: füllen die Netzwerkleitung. Der Host oder der Upstream filtert diese.
- Protokollangriffe: erschöpfen Verbindungstabellen. Werden meist vom Netzwerk abgefangen.
- Schicht-7-Angriffe: gültig aussehende HTTP-Anfragen, die CPU, Datenbank oder Worker verbrauchen. Diese erreichen Ihre Anwendung.
Schritt 1: Ratenbegrenzung in Nginx
Begrenzen Sie, wie schnell eine einzelne Adresse Anfragen stellen darf. Definieren Sie eine Zone im http-Block und wenden Sie sie auf Ihre Website an.
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;
server {
location / {
limit_req zone=perip burst=20 nodelay;
limit_conn connip 20;
}
location = /login {
limit_req zone=perip burst=3 nodelay;
}
}
Verwenden Sie für Logins und die Suche ein deutlich engeres Limit, da diese aufwendig sind.
Schritt 2: Zwischenspeichern, was möglich ist
Eine zwischengespeicherte Seite kostet beim Ausliefern fast nichts. Aktivieren Sie FastCGI- oder Proxy-Caching für anonymen Datenverkehr, selbst für 30 bis 60 Sekunden. So wird aus einer Flut identischer Anfragen eine Handvoll echter.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
Schritt 3: Sinnvolle Timeouts setzen
Angriffe mit langsamen Verbindungen halten Worker offen. Verkürzen Sie die Limits.
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;
Schritt 4: Wiederholungstäter mit fail2ban sperren
Sperren Sie Adressen, die die Ratenbegrenzung auslösen. Nginx protokolliert abgewiesene Anfragen im Error-Log, und ein Filter kann sie erkennen.
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 1h
Schritt 5: Einen Proxy vorschalten, wenn es ernst wird
Ein Reverse-Proxy oder CDN mit Bot-Prüfungen kann Angriffe auffangen, die ein einzelner VPS nicht bewältigt. Denken Sie daran, den Ursprung wie unter Origin-IP geheim halten beschrieben zu schützen, sonst umgehen Angreifer den Proxy.
Vorbereitet sein, bevor es passiert
- Kennen Sie Ihre langsamsten Seiten und beheben oder cachen Sie sie.
- Behalten Sie das Monitoring bei, damit Sie einen Anstieg schnell bemerken.
- Legen Sie einen Plan bereit: engere Limits, eine Wartungsseite, ein größerer Server.
Die Grundlagen in der UFW- und fail2ban-Anleitung gehören dazu.