Old:Layer7 filter Kernel-space: droppare protocolli p2p con iptables: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
 
(20 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Ubuntu Server 10.04 LTS<br/>Debian tutte le versioni|}}
{{Old}}
<br/>
{|style="border-radius: 0.5em;  width:250px; float:right; clear:both; margin-bottom:10px;  text-align:center; font-variant:small-caps; background:#f8fbfd;  border:1px solid #4e88d0; padding-bottom:5px"
<br/>
|[[Image:Debian-swirl.png|33px|link=]]'''Versioni compatibili'''
|-
|Ubuntu Server 10.04 LTS
|}
== Testata su ==
== Testata su ==
* Ubuntu Server 10.04 LTS
* Ubuntu Server 10.04 LTS
== Introduzione ==
== 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 [http://l7-filter.sourceforge.net/protocols]. 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[http://l7-filter.sourceforge.net/]
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 [http://l7-filter.sourceforge.net/protocols]. 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[http://l7-filter.sourceforge.net/]
{{Warningbox|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, sulla compilazione del kernel debian[[Debian Kernel Howto]]}}
{{Warningbox|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 ==
== Compilazione Kernel ==
Riga 12: Riga 15:
Avremo innanzi tutto bisogno di alcuni pacchetti di base per compilare e pacchettizzare un kernel:  
Avremo innanzi tutto bisogno di alcuni pacchetti di base per compilare e pacchettizzare un kernel:  
<pre>
<pre>
# apt-get install modutils kernel-package libncurses5-dev fakeroot
# apt-get install module-init-tools kernel-package libncurses5-dev fakeroot
Nota
Per la versione 2.6 del kernel il pacchetto modutils è stato sostituito da module-init-tools.
</pre>
</pre>
A questo punto è necessario installare il pacchetto Debian contenente i sorgenti del kernel. Per prima cosa, cerchiamo questo pacchetto:  
A questo punto è necessario installare il pacchetto Debian contenente i sorgenti del kernel. Per prima cosa, cerchiamo questo pacchetto:  
Riga 20: Riga 21:
$ apt-cache search linux-source | grep ^linux-source
$ apt-cache search linux-source | grep ^linux-source
linux-source-2.6.8 - Linux kernel source for version 2.6.8 with Debian patches
linux-source-2.6.8 - Linux kernel source for version 2.6.8 with Debian patches
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.
</pre>
</pre>
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 (maggiori informazioni qui). Nel seguito prenderemo come esempio la versione 2.6.8 del kernel, sostituitela con qualsiasi altra versione vogliate usare.  
{{Box|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.  
<pre>
<pre>
# apt-get install linux-source-2.6.8
# apt-get install linux-source-2.6.8
Nota
Prima della versione 2.6.12 del kernel Linux, i pacchetti sorgenti e binari Debian si chiamavano rispettivamente
kernel-source-x.x.x e kernel-image-x.x.x (invece dell'attuale denominazione linux-source-x.x.x e linux-image.x.x.x).
Questo perché è previsto l'inserimento di nuovi kernel (come GNU HURD e FreeBSD) all'interno di Debian.
</pre>
</pre>
Entriamo ora nella directory dei sorgenti del kernel:  
Entriamo ora nella directory dei sorgenti del kernel:  
<pre>
<pre>
$ cd /usr/src  
$ cd /usr/src  
</pre>
</pre>
Troveremo in questa directory (avendoli installati precedentemente) i sorgenti del kernel in un archivio tar.bz2:  
Troveremo in questa directory (avendoli installati precedentemente) i sorgenti del kernel in un archivio <code>.tar.bz2</code>:  
<pre>
<pre>
$ ls
$ ls
Riga 49: Riga 44:
$ tar xvjf linux-source-2.6.8.tar.bz2
$ tar xvjf linux-source-2.6.8.tar.bz2
</pre>
</pre>
A fine decompressione avremo una directory linux-source-2.6.8, creiamo un link simbolico Linux che punta ai sorgenti del kernel:  
A fine decompressione avremo una directory <code>linux-source-2.6.8</code>, creiamo un link simbolico Linux che punta ai sorgenti del kernel:  
<pre>
<pre>
$ ln -s /usr/src/linux-source-2.6.8 linux
$ ln -s /usr/src/linux-source-2.6.8 linux
</pre>
</pre>
Non è necessario creare questo link, ma è una usuale convenzione farlo anche perché risulta comodo per entrare  
Non è necessario creare questo link, ma è una usuale convenzione farlo anche perché risulta comodo per entrare nella directory dei sorgenti del kernel.  
nella directory dei sorgenti del kernel.  
Ora spostiamoci nella directory e puliamo i sorgenti del kernel:  
Ora spostiamoci nella directory e puliamo i sorgenti del kernel:  
<pre>
<pre>
Riga 61: Riga 55:
</pre>
</pre>
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.  
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:  
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 <code>/boot</code> (i file di configurazione dei kernel installati hanno come nome <code>config</code> seguito dalla versione del kernel) nella directory dei sorgenti:  
<pre>
<pre>
$ cp /boot/config-2.6.8 .config  
$ cp /boot/config-2.6.8 .config  
Riga 68: Riga 62:
=== Configurazione Kernel: make menuconfig ===  
=== Configurazione Kernel: make menuconfig ===  
Adesso dal sito di l7[http://l7-filter.sourceforge.net/HOWTO-kernel] è necessario scaricare il pacchetto netfilter-layer7 qui [http://sourceforge.net/projects/l7-filter/files/].
Adesso dal sito di l7[http://l7-filter.sourceforge.net/HOWTO-kernel] è necessario scaricare il pacchetto netfilter-layer7 qui [http://sourceforge.net/projects/l7-filter/files/].
Supponendo che l’abbiamo scaricato e decompresso sotto /usr/src/.  
Supponendo che l’abbiamo scaricato e decompresso sotto <code>/usr/src/</code>.  
Entriamo nella directory del kernel /usr/src/linux/ :
Entriamo nella directory del kernel <code>/usr/src/linux/</code> :
<pre>
<pre>
$ cd /usr/src/linux/
$ cd /usr/src/linux/
</pre>
</pre>
Applichiamo la patch appropriata:
Applichiamo la [[patch]] appropriata:
<pre>
<pre>
$ patch -p1 < ../netfilter-layer7-v2.22/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
$ patch -p1 < ../netfilter-layer7-v2.22/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
Riga 84: Riga 78:
</pre>
</pre>
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.  
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:
Andiamo ad abilitare il modulo <code>netfilter</code> come sotto:
<pre>
<pre>
Networking --->
Networking --->
Riga 93: Riga 87:
                                                     [*] Layer 7 debugging output     
                                                     [*] Layer 7 debugging output     
</pre>
</pre>
Abilitare il modulo Layer 7 match support come da esempio precedente [M] e [*]
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 <code>/usr/src/linux/.config</code> conterrà la nostra configurazione del kernel.
{{Box|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.<br/>
Basta allora copiare il vecchio file di configurazione nella directory dei sorgenti del nuovo kernel e lanciare il comando:
<pre>$ make oldconfig</pre>
in questo modo verranno fatte delle domande su come configurare le sole nuove voci presenti nel kernel. <br/>
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.<br/>
Un file <code>config</code> del vostro attuale kernel può essere trovato in <code>/boot</code> sotto il nome di <code>config-2.x.x</code>.}}


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.
<pre>
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.
</pre>
Salvata la configurazione ed usciti dal menù del kernel, ricompiliamo:
Salvata la configurazione ed usciti dal menù del kernel, ricompiliamo:
<pre>
<pre>
make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image
$ make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image
</pre>
</pre>
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 su può usare:  
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:  
<pre>
<pre>
$ CONCURRENCY_LEVEL=5 make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image
$ CONCURRENCY_LEVEL=5 make-kpkg --append-to-version=-layer7 --revision=1 --initrd kernel_image
</pre>
</pre>
Finito tutto sarà sufficiente spostarci sotto /usr/src/ ed installare il .deb appena creato.
Finito tutto sarà sufficiente spostarci sotto <code>/usr/src/</code> ed installare il .deb appena creato.


== Configurazione di Grub ==
== Configurazione di Grub ==
Se il kernel richiede l’immagine ramdisk e questa non è stata né creata né configurato il menu.lst per utilizzarla, allora il kernel all’avvio andrà in panico (“Kernel panic – not syncing …..).
Se il kernel richiede l’immagine ramdisk e questa non è stata né creata né configurato il file <code>menu.lst</code> per utilizzarla, allora il kernel all’avvio andrà in panico (“Kernel panic – not syncing …..).<br/>
Per risolvere tale problema procedere come segue:
Per risolvere tale problema procedere come segue:
<pre>
<pre>
# ls /lib/modules (si vedrà il nome preciso del kernel da creare l’initrd.img)
# ls /lib/modules
# cd /boot  (ci spostiamo nel boot così alla creazione non dovremo spostare nulla)
</pre>
 
con cui si vedrà il nome preciso del kernel per creare l’initrd.img. Quindi ci spostiamo nella directory <code>/boot</code> così alla creazione non dovremo spostare nulla:
# update-initramfs -c -k “kernel name” (così creiamo initrd.img del kernel ricompilato:
<pre>
attenzione a inserire come kernel name quello corretto, ossia il kernel ricompilato e installato per ultimo.)
# cd /boot 
</pre>
Creare l'initrd.img:
<pre>
# update-initramfs -c -k “kernel name”
</pre>
Attenzione a inserire come kernel name quello corretto, ossia il kernel ricompilato e installato per ultimo.


Aggiornare Grub (versione vecchia):
<pre>
# vim /boot/grub/menu.lst
# vim /boot/grub/menu.lst
 
</pre>
E inseriremo la stringa initrd con la rispettiva path di dove abbiamo salvato l’initrd:
E inseriremo la stringa initrd con la rispettiva path di dove abbiamo salvato l’initrd:
 
<pre>
# title          Ubuntu 10.04 LTS, kernel 2.6.32.15+drm33.5-layer7
# title          Ubuntu 10.04 LTS, kernel 2.6.32.15+drm33.5-layer7
   root            (hd0,1)
   root            (hd0,1)
Riga 141: Riga 135:
   initrd          /boot/initrd.img-2.6.32.15+drm33.5-layer7
   initrd          /boot/initrd.img-2.6.32.15+drm33.5-layer7
   quiet
   quiet
</pre>
o aggiornare Grub2 nel seguente modo:
<pre>
# update-grub2
</pre>
</pre>
Salvare e riavviare.
Salvare e riavviare.
Riga 146: Riga 144:
== Compilazione Iptables ==
== Compilazione Iptables ==


Bene, adesso applichiamo la patch ad iptables.
Bene, adesso applichiamo la patch ad iptables.<br/>
Io son pigro ed ho preso i sorgenti del pacchetto Debian senza quindi scaricare niente da netfilter:
Io son pigro ed ho preso i sorgenti del pacchetto Debian senza quindi scaricare niente da netfilter:
<pre>
<pre>
Riga 152: Riga 150:
$ apt-get source iptables
$ apt-get source iptables
</pre>
</pre>
Adesso abbiamo i sorgenti sotto iptables-{version}/, quindi creiamo un link simbolico:
Adesso abbiamo i sorgenti sotto <code>iptables-{version}/</code>, quindi creiamo un link simbolico:
<pre>
<pre>
$ ln -s iptables-{version}/ iptables
$ ln -s iptables-{version}/ iptables
n.b. {version} è da sostituire con la versione del vostro iptables che trovate nella cartella dove avete eseguito source
</pre>
Copiamo I seguenti files:
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/
<pre>
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
$ 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  
libxt_layer7.c /usr/src/iptables/extensions  
$ cp /usr/src/netfilter-layer7-v2.22/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward
(sono da scrivere in una sola riga)
/libxt_layer7.c /usr/src/iptables/extensions  
</pre>
</pre>
Per compilare iptables è necessaria una libreria:
Per compilare iptables è necessaria una libreria:
Riga 168: Riga 166:
$ apt-get install libselinux1-dev
$ apt-get install libselinux1-dev
</pre>
</pre>
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:
Fatto ciò creiamo un link simbolico tra la directory dove attualmente sono contenuti moduli di iptables e <code>/usr/local/lib</code>, che è la directory dove dovrebbero trovarsi i moduli secondo il <code>Makefile</code>:
<pre>
<pre>
$ ln -s /lib/xtables/ /usr/lib/xtables
$ ln -s /lib/xtables/ /usr/local/lib/xtables
 
</pre>
Adesso compiliamo iptables:
Adesso compiliamo iptables:
 
<pre>
$ cd /usr/src/iptables
$ cd /usr/src/iptables
$ ./configure --with-ksource=/usr/src/linux
$ ./configure --with-ksource=/usr/src/linux
Riga 179: Riga 177:
$ make install
$ make install
</pre>
</pre>
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.
Se tutto è andato a buon fine dovremmo avere sotto <code>/sbin/</code> i binari del nuovo iptables che è identico a quello pacchettizzato Debian ma con il modulo layer 7.
 
== Configurazione Iptables con layer 7 ==
== Configurazione Iptables con layer 7 ==
Anche in questo caso è necessario avere il pacchetto l7-protocols installato.
Anche in questo caso è necessario avere il pacchetto l7-protocols installato.
Riga 185: Riga 184:
$ apt-get install l7-protocols
$ apt-get install l7-protocols
</pre>
</pre>
Il funzionamento di l7-filter in user space si base sull’utilizzo di questo modulo:
Ora dobbiamo caricare i moduli all'avvio;per far ciò è necessario scrivere il file <code>/etc/modules</code> inserendo queste due stringhe:
<pre>
<pre>
ip_conntrack_netlink
ip_conntrack_netlink
ipt_layer7
</pre>
</pre>
Che va caricato prima di utilizzare il programma.
oppure:
<pre>
<pre>
Per far ciò è necessario scrivere il file /etc/modules  inserendo queste due stringhe:
nf_conntrack_netlink
ip_conntrack_netlink
xt_layer7
ipt_layer7
</pre>
</pre>
A questo punto siamo pronti per usare layer7 in kernel-space:
A questo punto siamo pronti per usare iptables in layer7 filter kernel-space:
<pre>
<pre>
iptables -A FORWARD -m layer7 --l7proto unset
iptables -A FORWARD -m layer7 --l7proto unset
Riga 221: Riga 220:
iptables –t mangle -A POSTROUTING -m layer7 --l7proto directconnect -j DROP  
iptables –t mangle -A POSTROUTING -m layer7 --l7proto directconnect -j DROP  
iptables –t mangle -A POSTROUTING -m layer7 --l7proto applejuice -j DROP  
iptables –t mangle -A POSTROUTING -m layer7 --l7proto applejuice -j DROP  
</pre>
Salviamo le regole di Iptables (per evitare il reset):
<pre>
# iptables-save -c > /etc/iptables.rules
</pre>
Ricordatevi di creare uno script per eseguire ad ogni avvio il comando:
<pre>
# iptables-restore < /etc/iptables.rules
</pre>
</pre>
Riavviate il sistema:
Riavviate il sistema:
<pre>
<pre>
$ reboot now
$ reboot now
</pre>
Testate il modulo layer7:
<pre>
# iptables -m layer7 --help
</pre>
</pre>
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).
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…
Il p2p è bloccato e speriamo non tutta la navigazione…
<br/>
<br/>
----
: [[Utente:Gigipin|Gigipin]]
: [[Contatto: luigi.pintaldi@gmail.com]]
[[Categoria:Networking]]

Versione attuale delle 16:20, 30 nov 2019

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…