Nicht immer muss eine DDoS Attacke so gewaltig sein das man mit dem Traffic überfordert wird. Hier hilft dann nur gezieltes Null-Routen oder ein Anbieter mit genügend Kapazität und speziellen Netzwerk-Filtern.

Eine viel einfachere DDoS Attacke ist auf dem Application Layer (7) auszuführen. Hierzu muss ein Angreifer im Fall von HTTP(S) nur eine URL finden die auf dem Zielsystem z.B. viel Last verursacht.

In diesem Fall hat man aber z.B. mit Nginx gute Chancen den Angriff selbst unter Kontrolle zu bringen.

Anzahl der Zugriffe beschränken

Nehmen wir mal an der Angreifer hat es auf das Suchformular abgesehen. Insbesondere wenn Suchanfragen nicht gecached werden kann durch jeden Aufruf der MySQL Server ziemlich ins Schwitzen geraten.

Gehen wir nun davon aus das ein normaler Benutzer höchstens alle 2 Sekunden eine Suche starten wird, dann kann man Nginx wie folgt konfigurieren:

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
	...
	location /suche.html {
		limit_req zone=one;
		...
	}
}

limit_req_zone ... zone=one:10m definiert eine Zone mit dem Namen “one” und einer Größe von 10 MByte. Das reicht in der Regel für ~160.000 IP Adressen.

$binary_remote_addr wird statt $remote_addr hier als Schlüssel verwendet. Dadurch werden nur 64Byte pro Eintrag verbraucht.

rate=30r/m; setzt ein Limit von 30 Zugriffen pro Minute. Dadurch kann nun eine einzelne Client IP nicht mehr Abfragen starten.

Nun kann z.B. im location Kontext mit limit_req zone=one; auf die Regel verwiesen werden.

Anzahl der Verbindungen limitieren

Des weiteren kann es sinnvoll sein die generelle Anzahl von Verbindungen die von einer Client IP geöffnet werden dürfen zu limitieren.

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
	...
	location /shop/ {
		limit_conn addr 10;
		...
	}
}

In diesem Fall wird mit limit_conn_zone eine Zone namens “addr” definiert und das Rate Limit einfach weggelassen. Durch limit_conn addr 10; werden die Verbindungen auf max. 10 pro IP Adresse limitiert.