Nella a gestione del server di posta possiamo utilizzare delle liste RBL (Real-time Blackhole List) per bloccare automaticamente i messaggi in arrivo da server compromessi o conosciuti per essere utilizzati per inviare SPAM. In questo articolo vediamo come creare un semplice script per elencare gli indirizzi IP di server di posta  che hanno tentato di inviare messaggi al nostro server SMTP Postfix e sono stati bloccati dai filtri RBL.

Se per curiosità o altri motivi vogliamo ottenere un elenco degli indirizzi IP di server SMTP che sono stati bloccati dalle RBL nel tentativo di consegnare messaggi al nosto server Postfix, possiamo utilizzare un semplice script che con awk filtra i contenuti dei file di LOG fornendoci un elenco in formato semplice e leggibile.

Lo script è piuttosto elementare e si limita ad estrarre le informazioni dal file di log e farle filtrare da awk per ottenere l'elenco che ci interessa. Create il file list_rbl_blocked utilizzando il vostro editor preferito. Non essendo un guru dei sistemi Unix-like non amo il sofisticato Emacs e nemmeno il potente quanto macchinoso vi e solitamente utilizzo joe o nano. Ovviamente se utilizzate un'interfaccia grafica (cosa peraltro insolita su un server GNU/Linux) potete affidarvi ad un editor grafico di vostro piacimento.

joe list_rbl_blocked

 Il contenuto sarà pittosto scarno:

#/bin/bash
echo "# cbl.abuseat.org"
grep "cbl.abuseat.org\/lookup\.cgi?ip=" /var/log/mail.info | awk -f list_rbl_blocked.awk |sort -u
echo "# zen.spamhaus.org"
grep "www.spamhaus.org\/query\/bl?ip=" /var/log/mail.info | awk -f list_rbl_blocked.awk |sort -u

dallo script potete già notare che awk viene richiamato passandogli un file contenente le regole per filtrare l'output estratto tramite grep. Awk viene richiamato due volte perché utilizzo più filtri RBL; dovrete quindi apportare le eventuali modifiche necessarie per adattarlo ai server RBL da voi utilizzati.
Non ci resta quindi che creare il file awk:

joe list_rbl_blocked.awk
/reject:/ {
    sub(/\[/,"",$17)
    sub(/\]/,"",$17)
    conta[$17]++
    rbl[$17] = $20
}
END {
    for (i in conta) {
        if (conta[i] > 2) {
            print "smtpd:\t",i,"\t# count: ",conta[i],"\t",rbl[i]
        } else {
            print "#smtpd:\t",i,"\t# count: ",conta[i],"\t",rbl[i]
        }
    }
}

Il funzionamento è abbastanza semplice: 

  • per ogni riga contenente la segnalazione di reject, incrementa il contatore per l'indirizzo IP del server bloccato.
  • al termine visualizza l'elenco di indirizzi interessati con il relativo contatore. Il formato è quello utilizzato per il file hosts.deny e per gli indirizzi con un massimo di due occorrenze, la riga è lasciata commentata.

ora dobbiamo rendere eseguibile lo script:

chmod +x list_rbl_blocked

 e non ci resta che farlo eseguire

./list_rbl_blocked

 per ottenere l'elenco degli indirizzi di server che sono stati bloccati nel tentativo di inviare SPAM verso i nostri utenti.

# cbl.abuseat.org
smtpd:   94.176.139.101     # count:  6      cbl.abuseat.org;
smtpd:   94.189.219.231     # count:  10     cbl.abuseat.org;
smtpd:   95.135.19.163  # count:  6      cbl.abuseat.org;
smtpd:   98.27.237.98   # count:  3      cbl.abuseat.org;
# zen.spamhaus.org
#smtpd:  123.237.32.127     # count:  1      zen.spamhaus.org;
#smtpd:  123.238.16.180     # count:  1      zen.spamhaus.org;
#smtpd:  123.24.91.170  # count:  1      zen.spamhaus.org;
#smtpd:  187.41.58.183  # count:  1      zen.spamhaus.org;
#smtpd:  187.57.23.56   # count:  1      zen.spamhaus.org;
smtpd:  187.78.168.173     # count:  3      zen.spamhaus.org;
smtpd:  188.158.80.136     # count:  9      zen.spamhaus.org;
smtpd:  188.161.173.73     # count:  5      zen.spamhaus.org;
smtpd:  188.17.218.46  # count:  11      zen.spamhaus.org;
smtpd:  188.48.62.42   # count:  8      zen.spamhaus.org

se volete utilizzarlo per aggiornare il file hosts.deny, basta ridirezionare opportunamente l'output:

./list_rbl_blocked >> /etc/hosts.deny