Old:Layer7 filter Kernel-space: droppare protocolli p2p con iptables: differenze tra le versioni
m (obsoleta) |
m (ha spostato Layer7 filter Kernel-space: droppare protocolli p2p con iptables a Old:Layer7 filter Kernel-space: droppare protocolli p2p con iptables) |
(Nessuna differenza)
|
Versione attuale delle 16:20, 30 nov 2019
Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica. |
Versioni 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]
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
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.
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.
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…