Come posso implementare la limitazione della velocità con Apache? (richieste al secondo)


84

Quali tecniche e / o moduli sono disponibili per implementare una robusta limitazione della velocità (richieste | byte / ip / unità di tempo) in apache?


Sto usando il TC di Linux sul server web, perché Red Hat 6 ha solo Apache 2.2.
ceving

Risposte:


55

Il migliore

  • mod_evasive (focalizzato maggiormente sulla riduzione dell'esposizione DoS)
  • mod_cband (le migliori caratteristiche per il controllo della larghezza di banda "normale")

e il resto


10
Non sono riuscito a trovare nulla per limitare le connessioni giornaliere in base all'indirizzo IP. Ho passato tutta la notte a cercare, è un peccato.
Greg,

1
Qualcuno sa se c'è un modo per fare in modo che mod_evasive guardi un'intestazione invece dell'IP, per quando si corre dietro un proxy inverso?
Stavros Korokithakis

6
4 anni dopo, mod_evasive è ancora "il migliore"?
Zac Thompson

6
Esegui il backup della tua richiesta. Perché _evasive e _cband sono i migliori?
Reed

5
mod_evasivericeve molti consigli online ma, a metà del 2017, sembra che sia stato abbandonato dal suo autore, Jonathan Zdziarski, che ha stranamente cancellato tutti i riferimenti ad esso dal suo blog, sebbene il codice sorgente sia ancora disponibile come caricamento . Nessuno degli altri progetti è stato aggiornato negli ultimi 6 anni (o 15 anni nel caso di mod_limitipconn).
Anthony Geoghegan

20

Come affermato in questo post del blog , sembra possibile utilizzare mod_security per implementare un limite di velocità al secondo.

La configurazione è qualcosa del genere:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"

3
Questo era perfetto per me, con modsec2 già in esecuzione. Dovevo solo aggiungere ID alle regole per abbinare la versione modsec, in questo modo: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "fase: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" phase: 2, pause: 300, deny, status: 509, setenv: RATELIMITED, skip: 1, nolog, id: 10000003 "SecAction" phase: 2, pass, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Header always set Retry-After" 10 "env = RATELIMITED </LocationMatch>
Nathan Stretch

2
Si noti inoltre che è possibile modificare il numero di richieste burst iniziali consentite modificando "@gt 60", nonché la velocità con cui "ricarica" ​​il limite modificando ip.somepathcounter = 1/1 bit. 1/1 consente una richiesta aggiuntiva al secondo. 1/2 consente una richiesta aggiuntiva ogni 2 secondi, ecc.
Nathan Stretch

3
Apache 2.4 si lamenterà del 509 in ErrorDocument, un'opzione lo sta cambiando in 429 (che, ovviamente, non è supportato in Apache 2.2). Inoltre, tutte le SecAction e le SecRule necessitano di un id poiché mod_security 2.7.
Mrten

1
FYI mod_securitynon è un progetto Apache.
Christopher Schultz,

12

Ci sono molti modi che includono firewall per applicazioni web, ma la cosa più semplice da implementare se si utilizza un mod Apache.

Una di queste mod che mi piace raccomandare è mod_qos . È un modulo gratuito molto efficace contro attacchi di tipo DOS, Bruteforce e Slowloris. Ciò faciliterà un po 'il carico del tuo server.

È molto potente .

L'attuale versione del modulo mod_qos implementa meccanismi di controllo per gestire:

  • Il numero massimo di richieste simultanee a una posizione / risorsa (URL) o host virtuale.

  • Limitazione della larghezza di banda come il numero massimo consentito di richieste al secondo a un URL o il massimo / minimo di kbyte scaricati al secondo.

  • Limita il numero di eventi di richiesta al secondo (condizioni di richiesta speciali).

  • Limita il numero di eventi di richiesta entro un periodo di tempo definito.
  • Può anche rilevare persone molto importanti (VIP) che possono accedere al server web senza o con meno restrizioni.
  • Riga di richiesta generica e filtro di intestazione per negare operazioni non autorizzate.

  • Richiedi la limitazione e il filtraggio dei dati del corpo (richiede mod_parp).

  • Limita il numero di eventi di richiesta per i singoli client (IP).

  • Limitazioni a livello di connessione TCP, ad esempio il numero massimo di connessioni consentite da un singolo indirizzo IP sorgente o controllo dinamico keep-alive.

  • Preferisce gli indirizzi IP noti quando il server esaurisce le connessioni TCP libere.

Questa è una configurazione di esempio di ciò per cui puoi usarla. Sono disponibili centinaia di configurazioni possibili per soddisfare le tue esigenze. Visita il sito per maggiori informazioni sui controlli.

Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate                                 120

# limits the connections for this virtual host:
QS_SrvMaxConn                                     800

# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP                                 50

# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP                    172.18.3.32
QS_SrvMaxConnExcludeIP                    192.168.10.

http://opensource.adnovum.ch/mod_qos/


questo funziona solo nella vecchia apache2.2 non funziona in apache2.4 +, vero?
infiniteloop

@infiniteloop la pagina mod_quos sourceforge dice che funziona bene con apache2.4. Ma v'è una discussione specifica su un paio di caratteristiche che non funzionano qui: stackoverflow.com/a/15726540/1402498
JamesHoux


6

Purtroppo, mod_evasivenon funzionerà come previsto se utilizzato in configurazioni non prefork (le recenti configurazioni di Apache sono principalmente MPM)



1

Dipende dal motivo per cui desideri impostare il limite.

Se è per proteggere dal sovraccarico del server, in realtà ha senso mettere NGINX davanti e configurare la limitazione della velocità lì. Ha senso perché NGINX utilizza molte meno risorse, qualcosa come pochi MB per diecimila connessioni. Quindi, se il server è inondato, NGINX eseguirà la limitazione della velocità (utilizzando una quantità insignificante di risorse) e passerà solo il traffico consentito ad Apache.

Se tutto ciò che cerchi è la semplicità, usa qualcosa come mod_evasive.

Come al solito, se è per proteggere dagli attacchi DDoS o DoS, utilizza un servizio come Cloudflare che ha anche un limitatore di velocità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.