Per bloccare il peer to peer ci sono due strade differenti:

  1. bloccare tutto e concedere l’accesso a pochi servizi scelti (http, smtp, pop3 etc)
  2. far passare tutto ciò che non è p2p

La soluzione più rapida e meno onerosa in termini di risorse è la prima.

Purtroppo però ci sono servizi che si basano su porte non standard che devono essere accessibili e quindi, sarebbe un impresa non da poco aggiungere le porte suddette alla nostra white list.

Esistono però soluzioni software in grado di riconoscere traffico p2p ed eventualmente bloccarlo.

La più valida da me provota è l7-filter.

Dalla home page di l7-filter troviamo la documentazione necessaria per l’avvenura che può essere affrontata in due modi:

  1. user space
  2. kernel space

Per pigrizia avevo provato a percorrere la prima strada ma, con un numero considerevole di connessioni e quindi di pacchetti da processare, si è rivelata un arma a doppio taglio: funziona bene fin quando si satura la coda e poi droppa tutti i pacchetti.

Per un uso casalingo dovrebbe andare bene, quindi vediamo come fare.

Ovviamente la distribuzione utilizzata e Debian in versione Etch.

L 7 – user space

Per usare il firewall di levello 7 in user space è necessario scaricare due pacchetti:

  1. l7-filter-userspace
  2. l7-protocols

Io li ho sistemati in /usr/src/ e decompressi con:

tar xvzf l7-filter-userspace-v0.4.tar.gz
tar xvzf l7-protocols-2007-07-27.tar.gz

Per compilare correttamente il pacchetto l7-filter-userspace è necessario installare alcune cosette:

apt-get install libnfnetlink-dev libnfnetlink1 libnetfilter-queue-dev libnetfilter-queue1 libnetfilter-conntrack-dev libnetfilter-conntrack1 libnetfilter-conntrack1-dbg

Adesso siamo a posto.
Basta entrare nella directory l7-filter-userspace-v0.4 e dare i soliti comandi per la compilazione:


./configure
make
make install

Se tutto è andato liscio possiamo copiare il binario (l7-filter) sotto /usr/local/bin per averlo nel path ed occuparci di l7-protocols.
Andiamo nella directory l7-protocols-2007-07-27, che contiene i pattern per riconoscere il traffico nel livello 7.
Adesso basta dare un semplice:

make install

Ed i files verranno copiati dentro /etc/l7-protocols/.
Il funzionamento di l7-filter in user space si base sull’utilizzo di questo modulo:

ip_conntrack_netlink

Che va caricato prima di utilizzare il programma.
Quel modulo permette di interagire in user space con il kernel e quindi di gestire il traffico processato da netfilter.
Utilizzando un file di configurazione saremo in grado di markare i pacchetti sospetti e successivamente di dropparli.

Il file, che ho posizionato sotto /etc/l7-protocols/ e chiamato l7-filter.conf contiene questo:

ares 9
bittorrent 9
gnucleuslan 9
gnutella 9
mute 9
openft 9
thecircle 9
100bao 9
applejuice 9
directconnect 9
edonkey 9
fasttrack 9
goboogy 9
hotline 9
imesh 9
kugoo 9
napster 9
poco 9
soribada 9
soulseek 9
tesla 9
xunlei 9

E’ semplicemente la lista dei protocolli p2p riconosciuti da layer 7 con a fianco il numero (nel mio caso 9) con cui verranno marchiati quando riconosciuti.
Fatto ciò è necessario mettere in ascolto l7-userspace:


iptables -t mangle -A FORWARD -j QUEUE
iptables -t filter -A FORWARD -m mark --mark 9 -j DROP
l7-filter -f /etc/l7-protocols/l7-filter.conf &

Come ho gia detto in precedenza è necessario caricare il modulo ip_conntrack_netlink prima di eseguire l7-filter.

I comandi sopra descritti non fanno altro che vincolare il traffico che entra nella catena di FORWARD della tabella mangle in una coda (QUEUE) sulla quale l7-filter marcherà adeguatamente i pacchetti in base al file di configurazione.
Nel percorso di un pacchetto all’interno di netfilter, la coppia mangle-FORWARD viene prima di filter-FORWARD e quindi è proprio in quest’ultima che impartiremo la regola di DROP dei pacchetti con mark 9 cioè quelli riconosciuti da l7 come p2p.

In alternativa a QUEUE, il traffico può essere dirottato su NFQUEUE e quindi gli step da fare variano (di poco):


iptables -t mangle -A FORWARD -j NFQUEUE --queue-num 3
iptables -t filter -A FORWARD -m mark --mark 9 -j DROP
l7-filter -f /etc/l7-protocols/l7-filter.conf -q 3&

E’ cambiato solo che il traffico viene portato nella coda numero 3 (–queue-num 3) e l7-filter è in ascolto su di essa (-q 3), il risultato è uguale.

Come ho detto all’inizio, questa soluzione è veloce ma ha qualche limitazione sul numero di connessioni gestibili tantè che nel dmesg mi ritrovavo messaggi come questo:


ip_queue: full at 1024 entries, dropping packets(s). Dropped: 111717

e i client non navigavano più.
Cercando con Google ho visto che il numero di entries non è aumentabile tramite il filesystem /proc, ma è una variabile dichiarata all’interno del sorgente, quindi andrebbe modificata e poi ricompilato il kernel.
Ho deciso quindi di ricompilare il kernel, non per modificare quella variabile ma bensì per applicare la patch di l7.

L7 – kernel space

Per rimpilare il kernel abbiamo bisogno del sorgente:

apt-get install linux-source-2.6.18

e di altri arnesi:


apt-get install bzip2 gzip unzip libncurses5-dev kernel-package

Installato il necessario andiamo sotto /usr/src/ per decomprimere i sorgenti:


tar xvjf linux-source-2.6.18.tar.bz2

Creiamo un link simbolico:

ln -s linux-source-2.6.18 linux

Visto che il kernel scaricato è della stessa versione di quello utilizzato, consiglio di copiare il file di configurazione in uso nella directory dei sorgenti:

cp /boot/config-2.6.18-5-amd64 linux/.config

Così abbiamo, inizialmente, l’identica configurazione.
Adesso dal sito di l7 è necessario scaricare il pacchetto netfilter-layer7.
Supponendo che l’abbiamo scaricato e decompresso sotto /usr/src/, entriamo nella directory del kernel /usr/src/linux/ ed applichiamo la patch appropriata:


patch -p1 < ../netfilter-layer7-v2.13/for_older_kernels/kernel-2.6.18-2.6.19-layer7-2.9.patch

Se tutto fila liscio, con make menuconfig andiamo ad abiliatare la nuova feature sotto:

Networking --->
Networking options --->
[*] Network packet filtering (replaces ipchains) --->
Core Netfilter Configuration ---> Netfilter Xtables support (required for ip_tables)

Chiamata Layer 7 match support.
Visto che ci siamo possiamo togliere quello che non serve dal kernel per renderlo più appropriato all’uso che se ne farà, ma ciò è a dir poco facoltativo.
Salvata la configurazione ed usciti dal menù del kernel, ricompiliamo:

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.
Adesso bisogna incrociare le dita e riavviare.

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


apt-get source iptables

Adesso abbiamo i sorgenti sotto iptables-1.3.6.0debian1/iptables, quindi creiamo un link simbolico:


ln -s iptables-1.3.6.0debian1/iptables iptables-1.3.6

Entriamo nella directory appena creata ed applichiamo la patch:

patch -p1 < ../netfilter-layer7-v2.13/iptables-for-kernel-pre2.6.20-layer7-2.13.patch
chmod +x extensions/.layer7-test

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/iptables/ /usr/local/lib/iptables

Adesso compiliamo iptables:

cd /usr/src/iptables-1.3.6
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux

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

Anche in questo caso è necessario avere il pacchetto l7-protocols-2007-07-27 installato.
Come fare l’abbiamo visto prima.

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

modprobe ipt_layer7
iptables -A FORWARD -m layer7 --l7proto ares -j DROP
iptables -A FORWARD -m layer7 --l7proto bittorrent -j DROP
iptables -A FORWARD -m layer7 --l7proto gnucleuslan -j DROP
iptables -A FORWARD -m layer7 --l7proto gnutella -j DROP
iptables -A FORWARD -m layer7 --l7proto mute -j DROP
iptables -A FORWARD -m layer7 --l7proto openft -j DROP
iptables -A FORWARD -m layer7 --l7proto thecircle -j DROP
iptables -A FORWARD -m layer7 --l7proto 100bao -j DROP
iptables -A FORWARD -m layer7 --l7proto applejuice -j DROP
iptables -A FORWARD -m layer7 --l7proto directconnect -j DROP
iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP
iptables -A FORWARD -m layer7 --l7proto fasttrack -j DROP
iptables -A FORWARD -m layer7 --l7proto goboogy -j DROP
iptables -A FORWARD -m layer7 --l7proto hotline -j DROP
iptables -A FORWARD -m layer7 --l7proto imesh -j DROP
iptables -A FORWARD -m layer7 --l7proto kugoo -j DROP
iptables -A FORWARD -m layer7 --l7proto napster -j DROP
iptables -A FORWARD -m layer7 --l7proto poco -j DROP
iptables -A FORWARD -m layer7 --l7proto soribada -j DROP
iptables -A FORWARD -m layer7 --l7proto soulseek -j DROP
iptables -A FORWARD -m layer7 --l7proto tesla -j DROP
iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP

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…

Fatemi sapere se riscontrate problemi.

Bookmark and Share