30/10/2009

Controllare se un IP è nelle black list DNSBL

A cura di Efran Cobisi


Lo spamming è un problema che affligge chiunque sia in possesso di una mailbox; nonostante gli sforzi compiuti dalla comunità di Internet per far fronte a questa piaga sociale, il giorno in cui non avremo più bisogno della cartella Junk E-mail sembra ancora molto lontano.

Con il passare del tempo sono nate diverse tecniche per combattere lo spam e, mentre alcune sono discretamente complesse e richiedono algoritmi di intelligenza artificiale, altre sono semplici come verificare un particolare indirizzo IP è stato inserito in una black list, alimentata manualmente dagli utenti o automaticamente da qualche sistema di controllo.

E, se da utenti possessori di mailbox questo non può che farci piacere, quando vestiamo i panni di sviluppatori o sistemisti vorremmo sempre sapere se l'indirizzo IP del NOSTRO mail server è finito in una black list.

In questo snippet vediamo come controllare le black list di tipo DNSBL, le più utilizzate e supportate tra le black list gratuite disponibili in rete.



DNSBL


DNSBL è un acronimo che sta per DNS-based Blacklist, ed identifica delle liste di indirizzi IP utilizzate per individuare possibili sorgenti di spam e virus; esistono decine di DNSBL in rete, ognuna alimentata da meccanismi differenti e pensata per scopi diversi. L'obiettivo comune, ad ogni modo, è quello di proteggere chi riceve e-mail, fornendo un sistema standard, basato su DNS, per verificare rapidamente se un determinato IP è in black list oppure meno.

Il meccanismo di fondo si basa sulla capacità delle DNSBL di includere gli IP della propria lista all'interno di una zona del server DNS gestito dalla DNSBL stessa. Chi desidera verificare la presenza di tale IP, non deve fare altro che testare l'esistenza del record DNS nella zona gestita dalla DNSBL.

Molti mail server, di fatto, includono il test DNSBL a supporto del proprio filtro anti-spam e consentono di impostare la lista di DNSBL da utilizzare; non esiste un elenco ufficiale di queste black list, anche se alcune sono molto famose (vi dice niente SpamHaus? O AHBL?).

SpamLinks contiene un vasto elenco di DNSBL presenti in rete.

Per interrogare una DNSBL è sufficiente:

  1. Ottenere l'indirizzo IP da verificare (es: 127.0.0.1)
  2. Invertirne i byte (es: 1.0.0.127)
  3. Creare una stringa formata dal valore ottenuto, un punto e la zona della DNSBL (es: 1.0.0.127.dnsbl.example.com) Attenzione, questa DNSBL non esiste
  4. Effettuare una query DNS di tipo A per la stringa ottenuta
  5. Se la query ritorna risultati significa che l'IP è in black list, altrimenti no


Verificare DNSBL con PowerShell


L'idea di questo snippet consiste nel testare un indirizzo IP (o un nome host, poi risolto tramite DNS) su quanti più DNSBL possibili, in base ad una lista estrapolata da SpamLinks. Una funzione verificherà l'indirizzo IP e ritornerà la lista di DNSBL che lo contengono; l'obiettivo per chi gestisce un mail server è sicuramente quello di non finire in nessuna DNSBL, quindi spetterà poi a voi controllare che la funzione non ritorni valori...

Come al solito, analizzo lo script passo passo. Innanzitutto è necessario caricare una lista di DNSBL presso le quali desideriamo effettuare i nostri test. Ovviamente, più DNSBL abbiamo nella lista maggiore sarà l'accuratezza della verifica che ci apprestiamo a fare; nell'esempio che segue, carico tre DNSBL presi a caso dalla lista di SpamLinks:

$dnsblZones = 'dnsbl.ahbl.org', 'b.barracudacentral.org', 'ips.backscatterer.org'

Il passaggio logico successivo consiste nel recupero l'indirizzo IP associato ad un determinato host; per semplicità, lo script non verifica che l'host esista effettivamente e che disponga di zero o più di un indirizzo IP.

Nell'esempio che segue, risolviamo l'indirizzo IP di mail.example.com e ne prendiamo il primo indirizzo disponibile ( ok, example.com è un dominio di test del W3C, è normale che il record non esista ;) ):

$address = [Net.Dns]::GetHostAddresses('mail.example.com')[0]

Come anticipato precedentemente, andiamo ora ad invertire i byte dell'indirizzo e a costruire una stringa a partire da questo indirizzo:

$addressBytes = $address.GetAddressBytes() $reversedAddress = '{0}.{1}.{2}.{3}' -f $addressBytes[3], $addressBytes[2], $addressBytes[1], $addressBytes[0]

Fatto questo possiamo finalmente incrociare l'indirizzo con le DNSBL caricate in precedenza, badando di effettuare il trap di eventuali eccezioni lanciate da GetHostAddresses (questo metodo lancia un'eccezione quando non trova il record richiesto):

$dnsblZones | % { trap { return; }; [Net.Dns]::GetHostAddresses("{0}.{1}" -f ($reversedAddress, $_)) | Out-Null; $_ }

Se GetHostAddresses non lancia eccezioni, il blocco torna alla pipe la DNSBL (sotto forma di stringa).

La funzione, compresa nello script allegato, è richiamabile così:

Check-Dnsbl mail.messaging.microsoft.com Check-Dnsbl mxlibero1.libero.it Check-Dnsbl 127.0.0.2

Per convenzione, a quanto pare, molte delle DNSBL utilizzano l'indirizzo 127.0.0.2 come test. Quindi, se il vostro IP non è in black list e volete comunque vedere risultati potete utilizzare questo indirizzo come parametro della funzione.

Per scaricare lo script completo di questo snippet clicca qui.

Commenti

Nessun commento disponibile.