Old:Layer7 filter Kernel-space: droppare protocolli p2p con iptables

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Emblem-important.png Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica.


Debian-swirl.pngVersioni compatibili
Ubuntu Server 10.04 LTS

Testata su

  • Ubuntu Server 10.04 LTS

Introduzione

In questa guida illustrerò come droppare protocolli p2p usando il modulo layer 7 di iptables. Tale Modulo è indispensabile per droppare diversi protocolli, oltre ai p2p [1]. Esiste, teoricamente, un altro sistema più comodo per droppare i protocolli chiamato layer 7 user space, ma non è soddisfacente e causa dei problemi non indifferenti (come il blocco della rete). Non mi dilungherò a spiegare come funzione nel dettaglio un layer 7 e quindi rimando alla documentazione ufficiale[2]

Warning.png ATTENZIONE
Il procedimento richiede la compilazione del kernel, quindi se non possedete tali conoscenze vi rimando alla guida, ben fatta e parzialmente usata in questo HowTo per la parte inerente alla compilazione del kernel, Debian Kernel Howto


Compilazione Kernel

Installazioni

Avremo innanzi tutto bisogno di alcuni pacchetti di base per compilare e pacchettizzare un kernel:

# apt-get install module-init-tools kernel-package libncurses5-dev fakeroot

A questo punto è necessario installare il pacchetto Debian contenente i sorgenti del kernel. Per prima cosa, cerchiamo questo pacchetto:

$ apt-cache search linux-source | grep ^linux-source
linux-source-2.6.8 - Linux kernel source for version 2.6.8 with Debian patches
Info.png Nota
Ogni versione di Debian (unstable, testing, stable) utilizza in genere una certa versione del kernel e specifiche versioni di altri pacchetti ad esso correlati in modo tale che l'insieme sia il più possibile stabile. È quindi altamente consigliato usare la versione dei sorgenti del kernel che troveremo nei repository della nostra versione di Debian, a meno che non si sappia esattamente quello che si sta facendo.


Adesso installiamo il pacchetto dei sorgenti del kernel che intendiamo installare. Notare che i sorgenti del kernel forniti con Debian sono leggermente differenti da quelli del kernel vanilla rilasciato dal team di Linus Torvalds. Nel seguito prenderemo come esempio la versione 2.6.8 del kernel, sostituitela con qualsiasi altra versione vogliate usare.

# apt-get install linux-source-2.6.8

Entriamo ora nella directory dei sorgenti del kernel:

$ cd /usr/src 

Troveremo in questa directory (avendoli installati precedentemente) i sorgenti del kernel in un archivio .tar.bz2:

$ ls
...
linux-source-2.6.8.tar.bz2
...

Decomprimiamo il kernel:

$ tar xvjf linux-source-2.6.8.tar.bz2

A fine decompressione avremo una directory linux-source-2.6.8, creiamo un link simbolico Linux che punta ai sorgenti del kernel:

$ ln -s /usr/src/linux-source-2.6.8 linux

Non è necessario creare questo link, ma è una usuale convenzione farlo anche perché risulta comodo per entrare nella directory dei sorgenti del kernel. Ora spostiamoci nella directory e puliamo i sorgenti del kernel:

$ cd linux
$ make-kpkg clean

Questo passaggio è inutile se è la prima volta che compilate il kernel, ma dalla seconda volta in poi diviene necessario per eliminare i file generati dalle precedenti compilazioni che potrebbero creare conflitti. Ora, se avete installato un kernel precompilato che abbia la stessa versione del kernel che volete ricompilare potreste usare il suo file di configurazione come base di partenza per configurare il vostro kernel. A tal scopo basta copiare il file di configurazione che si trova in /boot (i file di configurazione dei kernel installati hanno come nome config seguito dalla versione del kernel) nella directory dei sorgenti:

$ cp /boot/config-2.6.8 .config 

C'è chi arriva anche a installare un kernel precompilato per usare semplicemente il suo file di configurazione. Se avete banda da sprecare è possibile farlo. Tuttavia si può benissimo partire da zero senza copiare nessun file di configurazione.

Configurazione Kernel: make menuconfig

Adesso dal sito di l7[3] è necessario scaricare il pacchetto netfilter-layer7 qui [4]. Supponendo che l’abbiamo scaricato e decompresso sotto /usr/src/. Entriamo nella directory del kernel /usr/src/linux/ :

$ cd /usr/src/linux/

Applichiamo la patch appropriata:

$ patch -p1 < ../netfilter-layer7-v2.22/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

Configurazione Kernel

A questo punto, per configurare il nostro kernel, non ci resta che lanciare il comando:

$ make menuconfig

Vi apparirà un'interfaccia testuale dalla quale sarà possibile configurare le opzioni del kernel. Questo è il passaggio più delicato, nonché il più lungo e difficile. Andiamo ad abilitare il modulo netfilter come sotto:

Networking --->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration ---> 
Netfilter Xtables support (required for ip_tables)-> [M] Layer 7 match support
                                                     [*] Layer 7 debugging output     

Abilitare il modulo Layer 7 match support come da esempio precedente [M] e [*]

Una volta finita la configurazione, uscite e salvate i cambiamenti. A questo punto il file /usr/src/linux/.config conterrà la nostra configurazione del kernel.

Info.png Nota
Se avete già ricompilato il vostro kernel e volete passare ad una versione più aggiornata, ma non troppo diversa (ad esempio: 2.6.8 --> 2.6.10), non conviene rifare tutta la configurazione da capo. D'altro canto non è neanche possibile usare il vecchio file di configurazione dato che nel nuovo kernel ci saranno voci in più e o in meno e sarebbe improponibile cercarle ad una ad una.

Basta allora copiare il vecchio file di configurazione nella directory dei sorgenti del nuovo kernel e lanciare il comando:

$ make oldconfig

in questo modo verranno fatte delle domande su come configurare le sole nuove voci presenti nel kernel.
Se i due kernel sono troppo diversi questo metodo non conviene più dato che bisogna rispondere ad uno ad uno a tutte le domande sulle voci diverse. Sicuramente non conviene usarlo per il passaggio 2.4 --> 2.6.
Un file config del vostro attuale kernel può essere trovato in /boot sotto il nome di config-2.x.x.


Salvata la configurazione ed usciti dal menù del kernel, ricompiliamo:

$ make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image

Nel caso di sistemi multiprocessore è possibile velocizzare la compilazione aggiungendo CONCURRENCY_LEVEL=n dove n corrisponde al numero di processi che il compilatore usa in parallelo (normalmente si usa un processo in più rispetto al numero di processori presenti). Per esempio se vogliamo compilare kernel su un PC dotato di un processore quadcore si può usare:

$ CONCURRENCY_LEVEL=5 make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image

Finito tutto sarà sufficiente spostarci sotto /usr/src/ ed installare il .deb appena creato.

Configurazione di Grub

Se il kernel richiede l’immagine ramdisk e questa non è stata né creata né configurato il file menu.lst per utilizzarla, allora il kernel all’avvio andrà in panico (“Kernel panic – not syncing …..).
Per risolvere tale problema procedere come segue:

# ls /lib/modules

con cui si vedrà il nome preciso del kernel per creare l’initrd.img. Quindi ci spostiamo nella directory /boot così alla creazione non dovremo spostare nulla:

# cd /boot  

Creare l'initrd.img:

# update-initramfs -c -k “kernel name”

Attenzione a inserire come kernel name quello corretto, ossia il kernel ricompilato e installato per ultimo.

Aggiornare Grub (versione vecchia):

# vim /boot/grub/menu.lst

E inseriremo la stringa initrd con la rispettiva path di dove abbiamo salvato l’initrd:

# title           Ubuntu 10.04 LTS, kernel 2.6.32.15+drm33.5-layer7
  root            (hd0,1)
  kernel          /boot/vmlinuz-2.6.32.15+drm33.5-layer7 root=/dev/md0 ro quiet splash
  initrd          /boot/initrd.img-2.6.32.15+drm33.5-layer7
  quiet

o aggiornare Grub2 nel seguente modo:

# update-grub2

Salvare e riavviare.

Compilazione Iptables

Bene, adesso applichiamo la patch ad iptables.
Io son pigro ed ho preso i sorgenti del pacchetto Debian senza quindi scaricare niente da netfilter:

$ cd /usr/src
$ apt-get source iptables

Adesso abbiamo i sorgenti sotto iptables-{version}/, quindi creiamo un link simbolico:

$ ln -s iptables-{version}/ iptables

dove {version} è da sostituire con la versione del vostro iptables che trovate nella cartella dove avete eseguito scaricato i sorgenti. Copiamo i seguenti file (i comandi sono da scrivere in una sola riga):

$ cp /usr/src/netfilter-layer7-v2.22/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward
/libxt_layer7.man /usr/src/iptables/extensions 
$ cp /usr/src/netfilter-layer7-v2.22/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward
/libxt_layer7.c /usr/src/iptables/extensions 

Per compilare iptables è necessaria una libreria:

$ apt-get install libselinux1-dev

Fatto ciò creiamo un link simbolico tra la directory dove attualmente sono contenuti moduli di iptables e /usr/local/lib, che è la directory dove dovrebbero trovarsi i moduli secondo il Makefile:

$ ln -s /lib/xtables/ /usr/local/lib/xtables

Adesso compiliamo iptables:

$ cd /usr/src/iptables
$ ./configure --with-ksource=/usr/src/linux
$ make 
$ make install

Se tutto è andato a buon fine dovremmo avere sotto /sbin/ i binari del nuovo iptables che è identico a quello pacchettizzato Debian ma con il modulo layer 7.

Configurazione Iptables con layer 7

Anche in questo caso è necessario avere il pacchetto l7-protocols installato.

$ apt-get install l7-protocols

Ora dobbiamo caricare i moduli all'avvio;per far ciò è necessario scrivere il file /etc/modules inserendo queste due stringhe:

ip_conntrack_netlink
ipt_layer7

oppure:

nf_conntrack_netlink
xt_layer7

A questo punto siamo pronti per usare iptables in layer7 filter kernel-space:

iptables -A FORWARD -m layer7 --l7proto unset
iptables -A FORWARD -m layer7 --l7proto unknown


iptables –t mangle -A POSTROUTING -m layer7 --l7proto edonkey -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto gnutella -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto ares -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto 100bao -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto goboogy -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto hotline -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto kugoo -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto imesh -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto napster -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto mute -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto openft -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto poco -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto pplive -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto soribada -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto soulseek -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto thecircle -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto fasttrack -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto directconnect -j DROP 
iptables –t mangle -A POSTROUTING -m layer7 --l7proto applejuice -j DROP 

Salviamo le regole di Iptables (per evitare il reset):

# iptables-save -c > /etc/iptables.rules

Ricordatevi di creare uno script per eseguire ad ogni avvio il comando:

# iptables-restore < /etc/iptables.rules

Riavviate il sistema:

$ reboot now

Testate il modulo layer7:

# iptables -m layer7 --help

Con le istruzioni sopra riportare abbiamo bloccato tutti i protocolli p2p conosciuti (gli stessi inseriti nel file necessario all’utilizzo di layer 7 in user space). Il p2p è bloccato e speriamo non tutta la navigazione…