filtrare gli ip degli spammer su apache

Premetto che occorre avere accesso ai files di configurazione di apache in quanto si fa uso della direttiva RewriteMap.
Il concetto è abbastanza semplice, data la lista degli ip “cattivi” da filtrare, ( se non l’abbiamo possiamo reperila, ad esempio, su www.stopforumspam.com), facciamo una regola di rewrite abbastanza semplice che ridirige gli accessi provenienti da uno di questi IP su loro stessi… ( eat your own dog food, ovvero gli facciamo provare il loro prodotto).
Ecco la regola, che può essere inserita nella sezione del virtual host che si intende proteggere oppure fuori, per farla valere per tutti.

  <IfModule mod_rewrite.c>
    RewriteEngine   on
    RewriteMap  block dbm=sdbm:<directory del file compilato con gli ip>block.dbm
    RewriteCond ${block:%{REMOTE_ADDR}|ok}           !^ok$
    RewriteRule .*  http://%{REMOTE_ADDR}/  [L]
  </IfModule>

Alcune spiegazioni:
RewriteMap è una direttiva che definisce una mappa chiave valore: nel caso sopra si definisce una mappa creata a partire dal file block.dbm: la mappa fornisce, per una chiave di ingresso, nel nostro caso un IP, un valore, che nel nostro caso vale sempre “block”.
Nella direttiva RewriteCond come “TestString” usiamo il valore della mappa la cui chiave è l’IP di chi fa la richiesta.
Se il valore è presente ed è diverso da “ok” apache esegue la RewriteRule che segue che semplicemente ridirige ( con un codice http 302 ) la richiesta verso lo stesso IP che l’ha fatta.

Il file block.dbm si genera a partire dal file di testo di mapping che conterrà, per ogni linea, l’ip da escludere + la parola “block” o comunque una parola diversa da “ok”
Es.

0.0.0.0 block
1.1.1.1 block

RewriteMap potrebbe prendere in pasto direttamente questo file ( sostituendo la riga “RewriteMap block dbm=sdbm:<directory del file compilato con gli ip>block.dbm” con “RewriteMap block txt:<directory del file di testo>block.txt” ) ma, se le linee cominciano a diventare tante, conviene convertirlo in modo che apache possa fare delle ricerche in modo più veloce.
Per questo c’è l’utility httxt2dbm

httxt2dbm -f sdbm -i block.txt -o block.dbm

Ho usato il formato sdbm su questo server (Ubuntu 10.04 server) in quanto sembra essere l’unico supportato, dopo il formato testo.

Come lista di ip da filtrare ho usato quella fornita da stop forum spam, nella sezione download, dato che la lista è in formato csv, ho scritto questo programmino in awk che converte il file in modo che sia digeribile da httxt2dbm ( o da apache stesso, se si vuole usare direttamente in formato testo, cosa che non raccomando in quanto la lista è veramente molto grande )

#!/usr/bin/gawk -f
BEGIN { RS="," }
{print $0 " block"}

Una volta scaricato il file csv, per creare il file di testo basta scrivere

./ipbl.awk < bannedips.csv > block.txt

e quindi

httxt2dbm -f sdbm -i block.txt -o block.dbm

per convertire il file di testo in un formato che rende il lookup estremamente veloce.
A questo punto basta riavviare apache e a tutti gli ip della lista sarà servito il loro cibo!

Volendo si può automatizzare con uno script il reperimento e la generazione del file con gli Ip da filtrare.

risorse