Limita la tariffa usando haproxy per url per ip

I nostri server vengono colpiti da qualcuno costantemente. Il suo non DDOS. Solo un ip colpisce un url più di 200 volte al secondo. Attualmente sto bloccando l'utente dalle tabelle ip. Stiamo utilizzando HAproxy per il bilanciamento del carico. C'è un modo per limitare un utente basato sul suo ip e l'URL che viene colpito?

Non voglio bloccare solo basandosi su IP, poiché potrebbero essere compromessi gli utenti NAT. Diciamo che voglio mostrare la pagina di errore 503 se un particolare IP sta colpendo lo stesso url come www.example.com/somepage.php?some=option&other=option2 più di 3000 volte in 5 minuti? Ciò significa che il medesimo ip può accedere a altri URL come www.example.com/somepage.php?another=someotheroption.

    One Solution collect form web for “Limita la tariffa usando haproxy per url per ip”

    Questa soluzione richiede alless l'acido 1.6.

    Innanzitutto, aggiungi le seguenti operazioni all'antenna:

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

    Quindi, aggiungere il seguente al backend:

     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 } 

    Non sono riuscito a trovare un modo per eseguire il tracciamento nella parte frontale poiché non ho trovato un modo per applicare un converter su quella string concatenata che costituisce l'intestazione X-DOS-Protect.

    Sto applicando la function hash per assicurarsi di non memorizzare una string enorme nel tavolo di block come potrebbe facilmente portre a una negazione del servizio. Se pensi che questa function di hash non sia adatta a te per le troppe possibili collisioni, puoi anche renderla più grande applicando crc32 ad ognuno dei componenti concatenati (e, ovviamente, rimuovendolo quando memorizzi i dati e passerai ad un più grande spazio di archiviazione di bastone), come questo:

    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 } 

    Tieni presente che questa ultima soluzione utilizzerà più di 7 volte più memory rispetto al primo, per each voce nella tabella di bastone. Naturalmente, il rischio di collisione sarebbe anche più piccolo.

      Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.