<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Idea Factory &#187; p2p</title>
	<atom:link href="http://ideafactory.it/category/p2p/feed" rel="self" type="application/rss+xml" />
	<link>http://ideafactory.it</link>
	<description>c&#039;e&#039; solo un modo di fare le cose: farle bene</description>
	<lastBuildDate>Thu, 01 Jul 2010 15:06:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Stop p2p: un gateway Debian con layer 7</title>
		<link>http://ideafactory.it/debian/stop-p2p-un-gateway-debian-con-layer-7.html</link>
		<comments>http://ideafactory.it/debian/stop-p2p-un-gateway-debian-con-layer-7.html#comments</comments>
		<pubDate>Tue, 04 Sep 2007 11:46:30 +0000</pubDate>
		<dc:creator>Gianluca</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[p2p]]></category>

		<guid isPermaLink="false">http://www.ideafactory.it/2007/09/04/stop-p2p-un-gateway-debian-con-layer-7/</guid>
		<description><![CDATA[Per bloccare il peer to peer ci sono due strade differenti: bloccare tutto e concedere l&#8217;accesso a pochi servizi scelti (http, smtp, pop3 etc) 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Per bloccare il peer to peer ci sono due strade differenti:</p>
<ol>
<li>bloccare tutto e concedere l&#8217;accesso a pochi servizi scelti (http, smtp, pop3 etc)</li>
<li>far passare tutto ciò che non è p2p</li>
</ol>
<p>La soluzione più rapida e meno onerosa in termini di risorse è la prima.</p>
<p>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.</p>
<p>Esistono però soluzioni software in grado di riconoscere traffico p2p ed eventualmente bloccarlo.</p>
<p>La più valida da me provota è <a href="http://l7-filter.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/?referer=');">l7-filter</a>.</p>
<p><span id="more-26"></span>Dalla home page di <a href="http://l7-filter.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/?referer=');">l7-filter</a> troviamo la documentazione necessaria per l&#8217;avvenura che può essere affrontata in due modi:</p>
<ol>
<li><a href="http://l7-filter.sourceforge.net/HOWTO-userspace" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/HOWTO-userspace?referer=');">user space</a></li>
<li><a href="http://l7-filter.sourceforge.net/HOWTO-kernel" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/HOWTO-kernel?referer=');">kernel space</a></li>
</ol>
<p>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.</p>
<p>Per un uso casalingo dovrebbe andare bene, quindi vediamo come fare.</p>
<p>Ovviamente la distribuzione utilizzata e Debian in versione Etch.</p>
<p><strong>L 7 &#8211; user space </strong></p>
<p>Per usare il firewall di levello 7 in user space è necessario scaricare due pacchetti:</p>
<ol>
<li>l7-filter-userspace</li>
<li>l7-protocols</li>
</ol>
<p>Io li ho sistemati in <em>/usr/src/</em> e decompressi con:<br />
<code><br />
tar xvzf l7-filter-userspace-v0.4.tar.gz<br />
tar xvzf l7-protocols-2007-07-27.tar.gz<br />
</code><br />
Per compilare correttamente il pacchetto l7-filter-userspace è necessario installare alcune cosette:<br />
<code><br />
apt-get install libnfnetlink-dev libnfnetlink1 libnetfilter-queue-dev libnetfilter-queue1 libnetfilter-conntrack-dev libnetfilter-conntrack1 libnetfilter-conntrack1-dbg<br />
</code><br />
Adesso siamo a posto.<br />
Basta entrare nella directory <em>l7-filter-userspace-v0.4</em> e dare i soliti comandi per la compilazione:</p>
<p><code><br />
./configure<br />
make<br />
make install<br />
</code></p>
<p>Se tutto è andato liscio possiamo copiare il binario (l7-filter) sotto <em>/usr/local/bin</em> per averlo nel path ed occuparci di l7-protocols.<br />
Andiamo nella directory <em>l7-protocols-2007-07-27</em>, che contiene i pattern per riconoscere il traffico nel livello 7.<br />
Adesso basta dare un semplice:<br />
<code><br />
make install<br />
</code><br />
Ed i files verranno copiati dentro <em>/etc/l7-protocols/</em>.<br />
Il funzionamento di l7-filter in user space si base sull&#8217;utilizzo di questo modulo:<br />
<code><br />
ip_conntrack_netlink<br />
</code><br />
Che va caricato prima di utilizzare il programma.<br />
Quel modulo permette di interagire in user space con il kernel e quindi di gestire il traffico processato da netfilter.<br />
Utilizzando un file di configurazione saremo in grado di markare i <a href="http://l7-filter.sourceforge.net/protocols" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/protocols?referer=');">pacchetti sospetti</a> e successivamente di dropparli.</p>
<p>Il file, che ho posizionato sotto <em>/etc/l7-protocols/</em> e chiamato <em>l7-filter.conf</em> contiene questo:<br />
<code><br />
ares            9<br />
bittorrent      9<br />
gnucleuslan     9<br />
gnutella        9<br />
mute            9<br />
openft          9<br />
thecircle       9<br />
100bao          9<br />
applejuice      9<br />
directconnect   9<br />
edonkey         9<br />
fasttrack       9<br />
goboogy         9<br />
hotline         9<br />
imesh           9<br />
kugoo           9<br />
napster         9<br />
poco            9<br />
soribada        9<br />
soulseek        9<br />
tesla           9<br />
xunlei          9<br />
</code><br />
E&#8217; 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.<br />
Fatto ciò è necessario mettere in ascolto l7-userspace:</p>
<p><code><br />
iptables -t mangle -A FORWARD -j QUEUE<br />
iptables -t filter -A FORWARD -m mark --mark 9 -j DROP<br />
l7-filter -f /etc/l7-protocols/l7-filter.conf &amp;<br />
</code></p>
<p>Come ho gia detto in precedenza è necessario caricare il modulo <em>ip_conntrack_netlink</em> prima di eseguire l7-filter.</p>
<p>I comandi sopra descritti non fanno altro che vincolare il traffico che entra nella catena di <em>FORWARD</em> della tabella <em>mangle</em> in una coda (<em>QUEUE</em>) sulla quale l7-filter marcherà adeguatamente i pacchetti in base al file di configurazione.<br />
<a href="http://l7-filter.sourceforge.net/PacketFlow.png" rel="lightbox[26]" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/PacketFlow.png?referer=');"> Nel percorso di un pacchetto all&#8217;interno di netfilter</a>, la coppia mangle-FORWARD viene prima di filter-FORWARD e quindi è proprio in quest&#8217;ultima che impartiremo la regola di DROP dei pacchetti con mark 9 cioè quelli riconosciuti da l7 come p2p.</p>
<p>In alternativa a  <em>QUEUE</em>, il traffico può essere dirottato su <em>NFQUEUE</em> e quindi gli step da fare variano (di poco):</p>
<p><code><br />
iptables -t mangle -A FORWARD -j NFQUEUE --queue-num 3<br />
iptables -t filter -A FORWARD -m mark --mark 9 -j DROP<br />
l7-filter -f /etc/l7-protocols/l7-filter.conf -q 3&amp;<br />
</code></p>
<p>E&#8217; cambiato solo che il traffico viene portato nella coda numero 3 (&#8211;queue-num 3) e l7-filter è in ascolto su di essa (-q 3), il risultato è uguale.</p>
<p>Come ho detto all&#8217;inizio, questa soluzione è veloce ma ha qualche limitazione sul numero di connessioni gestibili tantè che nel <em>dmesg</em> mi ritrovavo messaggi come questo:</p>
<p><code><br />
ip_queue: full at 1024 entries, dropping packets(s). Dropped: 111717<br />
</code></p>
<p>e i client non navigavano più.<br />
Cercando con Google ho visto che il numero di entries non è aumentabile tramite il filesystem <em>/proc</em>, ma è una variabile dichiarata all&#8217;interno del sorgente, quindi andrebbe modificata e poi ricompilato il kernel.<br />
Ho deciso quindi di ricompilare il kernel, non per modificare quella variabile ma bensì per applicare la patch di l7.</p>
<p><strong>L7 &#8211; kernel space </strong></p>
<p>Per rimpilare il kernel abbiamo bisogno del sorgente:<br />
<code><br />
apt-get install linux-source-2.6.18<br />
</code></p>
<p>e di altri arnesi:</p>
<p><code><br />
apt-get install bzip2 gzip unzip libncurses5-dev kernel-package<br />
</code></p>
<p>Installato il necessario andiamo sotto <em>/usr/src/</em> per decomprimere i sorgenti:</p>
<p><code><br />
tar xvjf linux-source-2.6.18.tar.bz2<br />
</code><br />
Creiamo un link simbolico:<br />
<code><br />
ln -s linux-source-2.6.18 linux<br />
</code><br />
Visto che il kernel scaricato è della stessa versione di quello utilizzato, consiglio di copiare il file di configurazione in uso nella directory dei sorgenti:<br />
<code><br />
cp /boot/config-2.6.18-5-amd64 linux/.config<br />
</code><br />
Così abbiamo, inizialmente, l&#8217;identica configurazione.<br />
Adesso dal sito di <a href="http://l7-filter.sourceforge.net/HOWTO-kernel" onclick="pageTracker._trackPageview('/outgoing/l7-filter.sourceforge.net/HOWTO-kernel?referer=');">l7</a> è necessario scaricare il pacchetto netfilter-layer7.<br />
Supponendo che l&#8217;abbiamo scaricato e decompresso sotto <em>/usr/src/</em>, entriamo nella directory del kernel <em>/usr/src/linux/</em> ed applichiamo la patch appropriata:</p>
<p><code><br />
patch -p1 &lt; ../netfilter-layer7-v2.13/for_older_kernels/kernel-2.6.18-2.6.19-layer7-2.9.patch<br />
</code></p>
<p>Se tutto fila liscio, con <em>make menuconfig</em> andiamo ad abiliatare la nuova feature sotto:<br />
<code><br />
Networking ---&gt;<br />
Networking options ---&gt;<br />
[*] Network packet filtering (replaces ipchains) ---&gt;<br />
Core Netfilter Configuration ---&gt; Netfilter Xtables support (required for ip_tables)<br />
</code><br />
Chiamata <em>Layer 7 match support</em>.<br />
Visto che ci siamo possiamo togliere quello che non serve dal kernel per renderlo più appropriato all&#8217;uso che se ne farà, ma ciò è a dir poco facoltativo.<br />
Salvata la configurazione ed usciti dal menù del kernel, ricompiliamo:<br />
<code><br />
make-kpkg --append-to-version=-layer7 --revision=1 -initrd kernel_image<br />
</code><br />
Finito tutto sarà sufficiente spostarci sotto <em>/usr/src/</em> ed installare il .deb appena creato.<br />
Adesso bisogna incrociare le dita e riavviare.</p>
<p>Bene, adesso applichiamo la patch ad iptables.<br />
Io son pigro ed ho preso i sorgenti del pacchetto Debian senza quindi scaricare niente da <a href="http://www.netfilter.org/projects/iptables/" onclick="pageTracker._trackPageview('/outgoing/www.netfilter.org/projects/iptables/?referer=');">netfilter</a>:</p>
<p><code><br />
apt-get source iptables<br />
</code></p>
<p>Adesso abbiamo i sorgenti sotto <em>iptables-1.3.6.0debian1/iptables</em>, quindi creiamo un link simbolico:</p>
<p><code><br />
ln -s iptables-1.3.6.0debian1/iptables iptables-1.3.6<br />
</code></p>
<p>Entriamo nella directory appena creata ed applichiamo la patch:<br />
<code><br />
patch -p1 &lt; ../netfilter-layer7-v2.13/iptables-for-kernel-pre2.6.20-layer7-2.13.patch<br />
chmod +x extensions/.layer7-test<br />
</code></p>
<p>Per compilare <em>iptables</em> è necessaria una libreria:</p>
<p><code><br />
apt-get install libselinux1-dev<br />
</code></p>
<p>Fatto ciò creiamo un link simbolico tra la directory dove attualmente sono contenuti moduli di iptables e <em>/usr/local/lib</em>, che è la directory dove dovrebbero trovarsi i moduli secondo il <em>Makefile</em>:</p>
<p><code><br />
ln -s /lib/iptables/ /usr/local/lib/iptables<br />
</code><br />
Adesso compiliamo <em>iptables</em>:<br />
<code><br />
cd /usr/src/iptables-1.3.6<br />
make KERNEL_DIR=/usr/src/linux<br />
make install KERNEL_DIR=/usr/src/linux<br />
</code></p>
<p>Se tutto è andato a buon fiine dovremmo avere sotto <em>/usr/local/sbin/</em> i binari del nuovo <em>iptables</em> che è identico a quello pacchettizzato Debian ma con il modulo <em>layer 7</em>.</p>
<p>Anche in questo caso è necessario avere il pacchetto <em>l7-protocols-2007-07-27</em> installato.<br />
Come fare l&#8217;abbiamo visto prima.</p>
<p>A questo punto siamo pronti per usare layer7 in kernel-space:<br />
<code><br />
modprobe ipt_layer7<br />
iptables -A FORWARD -m layer7 --l7proto ares -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto bittorrent -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto gnucleuslan -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto gnutella -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto mute -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto openft -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto thecircle -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto 100bao -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto applejuice -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto directconnect -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto fasttrack -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto goboogy -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto hotline -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto imesh -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto kugoo -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto napster -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto poco -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto soribada -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto soulseek -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto tesla -j DROP<br />
iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP<br />
</code><br />
Con le istruzioni sopra riportare abbiamo bloccato tutti i protocolli p2p conosciuti (gli stessi inseriti nel file necessario all&#8217;utilizzo di layer 7 in user space).<br />
Il p2p è bloccato e speriamo non tutta la navigazione&#8230;</p>
<p>Fatemi sapere se riscontrate problemi.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideafactory.it/debian/stop-p2p-un-gateway-debian-con-layer-7.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
