Come posso implementare la limitazione della velocità lato server per un servizio Web Perl?

StackOverflow https://stackoverflow.com/questions/501405

  •  20-08-2019
  •  | 
  •  

Domanda

Ho un servizio Web CGI / Fast CGI basato su Perl e desidero limitare la velocità dei client in base all'indirizzo IP per impedire che i client aggressivi causino troppo lavoro.

Ho cercato un po 'di codice e ho trovato Algorithm :: TokenBucket in CPAN ma questo è per le richieste dei clienti; non ha persistenza e non ha una configurazione per utente, quindi non è davvero utile per limitare la velocità sul lato server.

Sto cercando suggerimenti per qualcosa che esiste già, altrimenti dovrò fare il mio basandomi su una semplice persistenza come il legame con DB_File per indirizzo IP e alcuni processi batch che gestiscono il token.

È stato utile?

Soluzione

Ho usato Cache :: FastMmap per limitare la frequenza monitorando gli hit per indirizzo IP. È una cache, quindi i dati scadranno nel tempo, ma se imposti le dimensioni e scade il tempo giusto, questo non dovrebbe essere un problema.

L'indirizzo IP è la chiave hash e il valore hash è un array di timestamp. Ho una seconda struttura di dati (supportata anche da Cache :: FastMMap ) che è un hash di indirizzi IP vietati, aggiornato in base ai dati della prima struttura.

Altri suggerimenti

So che non è quello che hai chiesto, ma hai mai pensato di gestirlo altrove nello stack dove è già stato fatto per te? Chiaramente non conosco il tuo stack di distribuzione, ma se è apache potresti usare mod_evasive . In alternativa, se sei su Linux, puoi lasciare che iptables faccia il suo lavoro usando qualcosa come:

#Allow only 12 connections per IP
/sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset

sono certamente possibili regole più complicate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top