IpTables: generazione regole blocco per intera nazione.

Questo script nasce dalla mia attività lavorativa: quando si gestiscono server per conto terzi, che sia per gestione posta, oppure per gestione della sicurezza o quant’altro, succede di rilevare tentativi di intrusioni da paesi che non hanno nulla a che fare con le attività del nostro cliente. Come conseguenza di questa situazione mi è nata, ma immagino anche a tanti altri, la necessità di trovare un modo per bloccare una o più intere nazioni, attraverso il firewall di sistema, iptables per linux.

Fondamentalmente ho trovato due modi per affrontare il problema:

  1. applicazione di una specifica patch al kernel;
  2. creazione di script apposito.

Il primo l’ho escluso perché su un server di produzione modificare il kernel richiede se va male il riavvio del sistema, ed inoltre bisognerebbe ricordare, ad ogni aggiornamento del kernel stesso, di applicare la patch sempre che sia ancora compatibile… troppi se per i miei gusti!!

Ho optato quindi per il secondo metodo, ma mi si presentava il problema di come recuperare le liste dei NetBloc per sinolo paese.

Il lavoro che presento è stato studiato specificatamente per linux, ma con poche modifiche immagino possa essere adattato anche per sistemi che usano altri tool rispetto a iptalbes, mi viene in mente prima di tutti la famiglia dei *BSD che usano IpFW.

Ho chiaramente cercato in giro, prima di reinventare la ruota, ed ho preso ispirazione da uno script in bash, che qualche furbacchione ha sfacciatamente scopiazzato da altri spacciandolo poi per proprio. Lo script era funzionante per quello che doveva fare, ma non teneva assolutamente conto dei tempi che impiegava quando si trattava di caricare regole di blocco per paesi di grosse dimensioni come la Cina, la Russia o perché no, gli Stati Uniti.

Per cui, partendo da quello script, ne ho scritti un paio di miei in python, che risolvono lo stesso problema con tempi decisamente piu accettabili. Per esempio:

i netbloc presenti nel file zone per gli Stati Uniti sono, al momento, 49784. Lo script in bash per caricare le rispettive 49784 regole ci mette 3 ore e 40 minuti su una macchina linux con harware Mac. Quindi non parliamo di un hw scrauso!! Sulla stessa macchina il mio script ci mette 635 centesimi di secondo;

e chiariamo: non è che io sia un genio degli algoritmi, semplicemente ho cambiato approccio. Lo script bash originale eseguiva un comando iptables per ognuno dei 49784 nebloc assegnati agli Stati Uniti di conseguenza eseguiva 49784 lanci di iptables!!! Io, invece, ho creato una struttura che ricalca quella del file generato da  iptables-save così da poter eseguire un unico comando iptables-restore per tutte le 49784 righe!!!

Come dicevo all’inizio gli script sono due, potrebbero essere unificati, ma ho preferito lasciarli separati cosi da poterli usare in tempi diversi:

  • ScaricaZone.py

Questo script si occupa di scaricare, da un sito pubblico, il file archivio contenente tutti i file di zona, divisi per singolo paese; genera un file unico e successivamente genera un database (sqlite) dal quale attingerà il secondo script.

  • GeneraBlocco.py

Questo script si occupa di chiedere all’utente per quale paese vuole generare la lista di regole di blocco; il paese va dichiarato usando il codice ISO 3166-1 Alfa2 (qui trovate la lista compelta) corrispondente quindi Italia sarà it, Brasile sarà br, Cina sarà cn e cosi via.
Una volta dichiarato il paese per il quale vogliamo la lista lo script leggerà i dati necessari dal database sqlite e creerà un file di testo nominato con questa struttura: CODICE-ISO.pure.iptables ossia nel caso abbiate selezionato la cina, cn.pure.iptables.

Il file generato avrà questa struttura:

 *filter
 :Block-CN - [0:0]

-A Block-CN -s 1.0.1.0/24 -j DROP
 .
 .
 .
 -A Block-CN -s 104.207.32.0/19 -j DROP
 -A Block-CN -s 91.234.36.0/24 -j DROP
 COMMIT

Come potete vedere viene creata una nuova chain con il codice specifico ISO del paese ossia in questo caso Block-CN, questo vi permetterà di rimuovere velocemente con un due soli comandi tutte le regole inerenti lo stesso paese dovesse necessitarvi. In questo caso:

iptables -F Block-CN
iptables -X Block-CN

Per utilizzare il file di blocco generato usate semplicemente questo comando da root (non da utente normale con sudo, proprio come utente root!!):

iptables-restore -c -n cn.pure.iptables

Praticamente istruiamo iptables-resore ad appendere le regole contenute nel file cn.pure.iptables alle regole già presenti nel firewall (l’azione dell’appendere viene eseguita dal parametro -n se vi scordate il parametro tutte le regole già caricate saranno rimpiazzate dalle attuali. Quindi attenzione !!

Per chi fosse interessato ai sorgenti, mi contatti pure, sto sistemando alcune cosette secondarie e poi metterò il progetto su githib.

Joe

NOTE:

Il database contiene quattro record:

– ipInd
– ISOcode
– NetBloc
– ISOandIP

Che corrispondono rispettivamente a

– solita chiave progressiva di qualunque db
– Codice paese in formato ISO 3166-1 Alfa2 (qui trovate la lista compelta)
– NetBloc in formato IP/Mask (esempio 85.94.160.0/19)
– Record composto sommando il secondo ed il terzo campo (us – 199.189.120.0/22)

 Visto che, comunque, manipolerete le vostre regole già esistenti, consiglio caldamente di eseguire prima di accodare nuove regole un iptables-save > mie.regole.originali. In questo modo, se qualcosa va storto, potrete resettare il vostro firewall con questi comandi:

 iptables -F
 iptables -X
 iptables -t nat -F
 iptables -t nat -X
 iptables -t mangle -F
 iptables -t mangle -X
 iptables -P INPUT ACCEPT
 iptables -P FORWARD ACCEPT
 iptables -P OUTPUT ACCEPT

e ripristinare le vostre regole originarie con questo comando:

iptables-restore -c < mie.regole.originali

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *