Ratenbegrenzung mit Haproxy pro URL pro IP

Ratenbegrenzung mit Haproxy pro URL pro IP

Unsere Server werden ständig von jemandem angegriffen. Es ist kein DDOS. Nur eine IP greift eine URL mehr als 200 Mal pro Sekunde an. Derzeit blockiere ich den Benutzer durch IP-Tabellen. Wir verwenden HAproxy zum Lastenausgleich. Gibt es eine Möglichkeit, einen Benutzer basierend auf seiner IP und der angegriffenen URL einzuschränken?

Ich möchte nicht nur auf IP-Basis blockieren, da NAT-Benutzer betroffen sein könnten. Nehmen wir an, ich möchte eine 503-Fehlerseite anzeigen, wenn eine bestimmte IP dieselbe URL wie www.example.com/somepage.php?some=option&other=option2 mehr als 3000 Mal in 5 Minuten aufruft? Das bedeutet, dass dieselbe IP auf andere URLs wie www.example.com/somepage.php?another=someotheroption zugreifen kann.

Antwort1

Diese Lösung erfordert mindestens Haproxy 1.6.

Fügen Sie zunächst Folgendes zum Frontend hinzu:

http-request set-header X-DOS-Protect %[src];%[req.fhdr(host)]%[capture.req.uri]

Fügen Sie dann Folgendes zum Backend hinzu:

stick-table type integer size 1m expire 5m store http_req_rate(5m)
tcp-request inspect-delay 5s
tcp-request content track-sc0 req.fhdr(X-DOS-Protect),crc32(1) if HTTP
http-request tarpit if { sc0_http_req_rate gt 3000 }

Ich konnte keine Möglichkeit finden, die Nachverfolgung im Frontend durchzuführen, da ich keine Möglichkeit fand, einen Konverter auf die zusammengesetzte Zeichenfolge anzuwenden, aus der der X-DOS-Protect-Header besteht.

Ich wende die Hash-Funktion an, um sicherzustellen, dass Sie keinen riesigen String in der Stick-Tabelle speichern, da dies leicht zu einem Denial-of-Service führen könnte. Wenn Sie der Meinung sind, dass diese Hash-Funktion aufgrund zu vieler möglicher Kollisionen für Sie nicht geeignet ist, können Sie sie auch vergrößern, indem Sie crc32 auf jede der verketteten Komponenten anwenden (und es natürlich entfernen, wenn Sie die Daten speichern und zu einem größeren Stick-Tabellenspeicher wechseln), und zwar wie folgt:

http-request set-header X-DOS-Protect %[src,crc32(1)];%[req.fhdr(host),crc32(1)]%[capture.req.uri,crc32(1)]

stick-table type string len 30 size 1m expire 5m store http_req_rate(5m)
tcp-request inspect-delay 5s
tcp-request content track-sc0 req.fhdr(X-DOS-Protect) if HTTP
http-request tarpit if { sc0_http_req_rate gt 3000 }

Bitte beachten Sie, dass diese letzte Lösung für jeden Eintrag in der Stick-Tabelle mehr als 7-mal mehr Speicher benötigt als die erste. Natürlich wäre auch das Kollisionsrisiko viel geringer.

verwandte Informationen