2017-05-04 4 views
1

Kennt jemand einen Weg, mit HAProxy eingehende Anfragen zu einer Verzögerung hinzuzufügen, sobald eine bestimmte maximale Anzahl von Anforderungen erreicht wurde und nicht nur einen Statuscode ablehnen oder senden, sondern eine bestimmte IP-Adresse in die Warteschlange stellen ' Anfragen und wenn nicht zu viele, erlauben, sobald die Anzahl genug reduziert hat.HAProxy verlangsamt Verbindungen von bestimmten IP

Unter Verwendung der Dokumentation scheinen alle oben genannten Teile unabhängig voneinander möglich, obwohl kombiniert scheint ein Problem zu sein.

Ich habe folgendes in meinem vorderen Ende:

#Add counter to ip in ratelimiting table 
tcp-request content track-sc0 src table ratelimiting 

# if alot of requests (more than 1000) - reject 
acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000 
tcp-request content reject if mark_alot_of_requests TRUE 

#If concurrent requests >= 100 from a single IP return 429 
acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100 
use_backend 429_slow_down if mark_too_many_requests 

Dann

backend 429_slow_down 
    mode http 
    timeout tarpit 5s 
    reqitarpit . 
    errorfile 500 /etc/haproxy/errors/429.http 
    http-request tarpit 

mein tarpit ist, dass ich sie zwar langsam tat nach unten, aber verhält sich nicht so, wie anfangs dachte ich.

Die ratelimiting Tabelle wird im hören wie folgt erstellt:

listen ratelimiting 
    mode http 
    stick-table type ip size 1m expire 1h store conn_rate(5000),conn_cur 

Vielen Dank

+0

ich nicht verwenden * denke * Es gibt eine Möglichkeit, Anforderungen in einem Fall wie diesem intern einzureihen. Wenn ein Backend-Server aktive Verbindungen "maxconn" verwendet, werden zusätzliche Anforderungen intern in einer Warteschlange gehalten, bis ein Steckplatz verfügbar ist (oder einer von mehreren Zeitüberschreitungen ausgelöst wird), jedoch mit Server- oder Backend-Bereich, anstatt an einen Anforderer gebunden zu sein. –

Antwort

1

würde ich inspect-timeout mit ‚WAIT_END` im Frontend Abschnitt

frontend mywww 

    tcp-request content track-sc0 src table ratelimiting 

    acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000 
    tcp-request content reject if mark_alot_of_requests TRUE 

    acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100 

    # delay for request inspect, it will be used for effectively client delay 
    tcp-request inspect-delay 1000ms 

    # if client is not too fast let it through 
    tcp-request content accept unless mark_too_many_requests 

    # too fast clients, will need to wait entire inspect-delay 
    tcp-request content accept if WAIT_END 

    use_backend some_normal_backend 
+0

Dies ist, was ich tatsächlich am Ende ging. Vielen Dank. –

Verwandte Themen