Apache 2: SetEnvIf "Intervallo IP"


10

Nella mia configurazione di Apache voglio impostare una variabile di ambiente se vedo che il visitatore proviene da un intervallo IP specifico. Attualmente lo faccio in questo modo:

SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip

Quello che preferirei è qualcosa del genere:

SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip

... perché penso che convertire un indirizzo IP in una stringa e poi fare un'espressione regolare sia uno spreco totale di risorse.

Potrei fare un

Deny From 194.8.74.0/23

... ma poi non ottengo una variabile che posso controllare nella mia pagina di errore 403 - per trovare il motivo per cui è stato negato l'accesso.

Qualche suggerimento su cosa potrei perdere? Esiste un MOD Apache2 in grado di impostare variabili di ambiente basate su "Intervalli di indirizzi IP"?

Risposte:


4

Quello che hai (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) è il meglio che puoi facilmente fare. Ho visto questo stile di configurazione implementato su un cluster di macchine pesantemente caricato, senza alcun degrado evidente delle prestazioni. Sono d'accordo con l'uso di espressioni regolari, quando gli intervalli CIDR sono più appropriati è fastidioso. È possibile scrivere un piccolo programma per generare automaticamente la configurazione da un elenco di intervalli CIDR.

Se hai familiarità con Perl, potresti creare un gestore modperl, che consentirebbe / rifiuterebbe le richieste in qualsiasi modo tu scelga. modperl consente l'esecuzione del codice in punti diversi durante una richiesta HTTP: fasi del ciclo di richiesta HTTP mod_perl 2.0 . PerlAuthzHandler sarebbe il gestore appropriato da usare.

Lockie


8

tenere presente che le variabili impostate tramite SetEnv non sono visibili su alcune operazioni (vedere matrice):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

la tua soluzione è

SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918

vedi https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr


Questa dovrebbe essere la risposta accettata! È la migliore. Funziona anche in .htaccess
Jeroen Vermeulen - MageHost


0

Questa non è davvero una soluzione per passare da RegExp a intervalli IP , ma ho trovato uno script piacevole ospitato da Google per convertire un intervallo IP in un regexp corrispondente. Potrebbe essere utile anche per alcuni di voi ...

Come escludo il traffico da un intervallo di indirizzi IP?

[Aggiornare]

Sembra che Google abbia rimosso lo Strumento per gli indirizzi IP (o almeno il link che hanno sul loro sito è interrotto), ma qui esiste uno strumento simile: http://www.analyticsmarket.com/freetools/ipregex

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.