Sei sulla pagina 1di 7

Sistemisti Indipendenti.

ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

Un Firewall Layer7 con GNU/Linux


Introduzione

Come è noto i firewall lavorano in ambiente Linux (iptables) tradizionalmente a livello 3. Sono
in grado di fare da packet filter ovvero, decidere se fare passare o meno un pacchetto sulla
base di alcune sue caratteristiche come l’IP sorgente o di destinazione, il protocollo richiesto, la
porta sorgente o di destinazione (packet inspection) oppure in base ad alcuni flag settati
(connection tracking).

Secondo il noto schema relativo alle metodologie di funzionamento dei firewall e la loro
appartenenza ad un determinato layer della pila OSI, possiamo riassumere:
• Firewall Packet Filter (OSI livello 3/4): il firewall in questo caso rappresenta un punto di
controllo del traffico all'interno della rete, analizza il traffico in ingresso, uscita e
attraversamento lasciando passare solo i protocolli, gli IP e le porte necessarie.
• Firewall Statefull Inspection (OSI livello 3/4): questo tipo di firewall rappresenta una
evoluzione dei precedenti i quali non solo fanno passare il traffico secondo lo schema
protocollo/porta sorgente o di destinazione/IP, ma tengono anche traccia della sessione
e del tipo di sessione.
• Firewall Content Inspection (Application Firewall - OSI fino livello 7): questo tipo di
firewall è quello che in questo caso ci interessa da vicino, ovvero un sistema in grado di
fare analisi a livello del protocollo. Questa nuova classe di firewall non si limitano più ad
analizzare una sessione basandosi sulle porte utilizzate, ma verificano che la semantica
del protocollo sia quella corretta. Un firewall content inspection di questo tipo può per
esempio consentire solo alcuni “comandi” forniti dal protocollo HTTP, ad esempio può
permettere che client remoti su Internet richiedano delle pagine (GET HTTP) oppure
richiedano informazioni su una pagina (HEAD HTTP) ma non possano inviare dei dati al
web server (POST HTTP), oppure possano effettuare un’operazione di CONNECT. Allo
stesso tempo sono in grado di analizzare e diversificare le connessioni effettuate anche
sulla porta http e/o di bloccare l’uso di determinati protocolli, come ad esempio quelli
utilizzati per il P2P.

Dal punto di vista del nostro sistema GNU/Linux, iptables ed il kernel linux lavorano tra il 3 ed
il 4 livello (Network-Transport), ma non permettono nativamente di agire a livello più alto
ovvero quello dell’applicazione (Layer 7).
Per fare questo esiste un progetto che permette di estendere le capacità del kernel Linux, una
patch per iptables, con cui poter filtrare a livello 7 agendo direttamente sul protocollo usato
da queste applicazioni, senza dover considerare quelli di livello inferiore.

Applicazione

Il progetto di estensione delle funzionalità di iptables si chiama layer7-firewall, con il quale si


può dotare il nostro kernel delle parti mancanti per poter lavorare e filtrare sui protocolli di alto
livello.
In modo particolare si può pensare di bloccare le applicazioni P2P, che creano molti problemi ai
sysadmin, riuscendo spesso ad uscire con funzionalità di tunneling sulla porta 80, in genere
aperta in OUTPUT su rete cone accesso ad Internet.
Questo è il sito del progetto da cui partire per ottenere il software e le informazioni necessarie:
• http://l7-filter.sourceforge.net/

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

Configurazione ed Utilizzo

Cosa ci serve?

La distribuzione da cui sono partito è la Debian Sarge, ma in produzione ho fatto funzionare


tutto su Slackware 10.1, per cui non ci sono problemi per la scelta:

1. i sorgenti del Kernel, io ho utilizzato il kernel 2.6.14, con le versioni successive non
sono riuscito a compilare iptables
2. i sorgenti di iptables 1.3.4, con la giusta patch supportano il layer7
3. gcc, make e libncurses5-dev, vanno installati sulla vostra Deb se non lo avete ancora
fatto.
4. La l7-patch per il kernel
5. La l7-patch per iptables
6. Il pacchetto l7-protocols

Sorgenti dei pacchetti

In caso di necessità aggiungere i pacchetti mancanti:

# apt-get install gcc make libncurses5-dev

Vediamo la predisposizione di tutti e 3 gli elemento necessari (kernel, iptables e layer 7).
Scarichiamo e scompattiamo il software necessario:

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
# wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.4.tar.bz2
# wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.1.tar.gz
# wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2006-01-22.tar.gz

In /usr/src estraiamo gli archivi:

# cd /usr/src
# tar -xvfx netfilter-layer7-v2.1.tar.gz
# tar -xjvf iptables-1.3.4.tar.bz2
# tar -xjvf linux-2.6.14.tar.bz2
# tar -xfz l7-protocols-2006-01-22.tar.gz
# mv l7-protocols-2006-01-22 /etc/l7-protocols

Kernel

Su Debian sono necessari :

# apt-get install kernel-package


# apt-get install fakeroot
# apt-get install libncurses5-dev

A questo punto si possono applicare le patch per il layer7 e poi configurare il kernel

#ln -s linux-2.6.14 linux


# cd /usr/src/linux
# patch -p1 < ../netfilter-layer7-v2.1/kernel-2.6.13-2.6.15-layer7-2.1.patch

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

# make menuconfig
Networking --->
Networking options --->
Network packet filtering (replaces ipchains) --->
IP: Netfilter Configuration ---
<M> Layer 7 match support (EXPERIMENTAL)
[*] Layer 7 debugging output

Per ultimo possiamo procedere alla Compilazione

# fakeroot make-kpkg --append-to-version=.layer7 kernel_image --initrd


# cd /usr/src
# dpkg -i kernel-image-2.6.15.layer7_10.00.Custom_i386.deb

All fine otteniamo il nostro kernel installato con cui possiamo far ripartire il sistema, con il
pieno supporto per il layer7.
Con questa configurazione viene già aggiornato anche GRUB non resta che un reboot.

Iptables

Prima di compilare il nuovo iptables, dobbiamo applicare la patch precedentemente


scompattata:

# cd /usr/src/iptables-1.3.4
# patch -p1 < ../netfilter-layer7-v2.1/iptables-layer7-2.1.patch
# chmod +x extensions/.layer7-test
# make KERNEL_DIR=/usr/src/linux-2.6.14
# make install KERNEL_DIR=/usr/src/linux-2.6.14

Scarichiamo i due pacchetti necessari con le patch per il nostro kernel standard e poi con le
definizioni dei protocolli.

# cd /usr/src//l7-protocols-2006-01-22
# make install

Sotto la directory /etc/l7-protocols/protocols troveremo i file pattern dei diversi servizi che
possiamo intercettare.

A questo punto verifichiamo se la nuova versione si è correttamente installata, infatti se prima


avevamo:

# iptables -V
iptables v1.2.10

adesso abbiamo:
# ./iptables -V
iptables v1.3.4

Esempi di utilizzo

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

Una volta riavviato il sistema con il nostro Kernel dotato del supporto layer7 e ricompilato
iptables, possiamo provare qualche configurazione.

Ma come funziona effettivamente l’operazione di filtro per questi protocolli?

In pratica il modulo aggiunto al kernel (ipt_layer7) è in grado di utilizzare alcuni files di pattern,
detti pat file, file con estensione .pat. Questi file sono organizzati sotto la directory /etc/l7-
protocols.
Ci sono quattro directory essenziali:
• protocols  contiene i pat files per la maggior parte dei protocolli/servizi di alto livello
(gnutella, winmx, kazaa,edonkey, ecc)
• file_types  contiene i pat file per alcuni file con estensioni che spesso può essere utile
intercettare ed eventualmente bloccare (exe, perl, ogg, flash, ecc)
• malware  contiene i pat files per alcuni malfare piuttosto noti come Redcode o Nimda.
• extras  contiene i pat files per alcuni servizi che spesso utilizzano la porta http (80)
per poter funzionare (quicktime, audiogalaxy, ecc). All’interno di queste connessioni che
per un normale firewall di layer3 sono connessioni http, si possono identificare
connessioni a servizi spesso di tipo audio/video e differenziarli da normali connessioni
http.

Prendiamo ad esempio il pattern per identificare il MSM Messenger:

# less msnmessenger.pat
# MSN Messenger - Microsoft Network chat client
# Pattern quality: good fast
# Protocol groups: proprietary chat
#
# Usually uses port 1863
# http://www.hypothetic.org/docs/msn/index.php
#
# This pattern has been tested and is believed to work well.
#
# To get or provide more information about this protocol and/or pattern:
# http://www.protocolinfo.org/wiki/MSN_Messenger
# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
msnmessenger
# ver: allow versions up to 99.
# I've never seen a cvr other than cvr0. Maybe this will be trouble later?
# Can't anchor at the beginning because sometimes this is encapsulated in
# HTTP. But either way, the first packet ends like this.
ver [0-9]+ msnp[1-9][0-9]? [\x09-\x0d -~]*cvr0\x0d\x0a$

Questa stringa viene ricercata nelle connessioni che il nostro sistema effettua, essendo di
norma un NAT router o qualche cosa di simile, e per questo è in grado di marcarle,
differenziarle o se necessario bloccarle.

Noi possiamo usare quindi questo grande numero di pat file, esistenti per la maggior parte dei
servizi di alto livello, oppure realizzarne di nostri per intercettare connessioni di tipo ancora
diverso.
A livello pratico l’utilizzo è semplice, basta agire sulla MANGLE table di iptables per bloccare, a
livello applicativo, i protocolli che ci interessano.
Vediamo alcuni esempi per il blocco delle connessioni P2P:

Regola per il bloccare le connessioni relative a Kazaa


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto fasttrack -j DROP

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

Regola per il bloccare le connessioni relative a E-mule e Edonkey


#iptables -t mangle -A POSTROUTING -m layer7 --l7proto edonkey -j DROP

Regola per il bloccare le connessioni del MSN


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP

Regola per il bloccare le connessioni di Gnutella/WinMX


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto gnutella -j DROP

Regola per il bloccare le connessioni di Napster


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto napster -j DROP

Si può anche utilizzare la direttiva --l7dir per poter specificare un pattern personalizzato,
usando quindi le espressioni regolari per intercettare alcune particolari connessioni.
Ovviamente questo tipo di attività, più è complessa più diventa onerosa, può rallentare
leggermente la navigazione e richiede comunque sistemi robusti con molta RAM a bordo.

Vediamo un semplice script che permette di impostare il Masquerading per una rete locale ma
taglia il P2P:

#!/bin/bash
# Script per abilitare il MASQ ma bloccare il P2P per le reti locali
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# Impostazione dei blocchi per il FORWARD P2P
#
iptables -A FORWARD -m layer7 --l7proto fasttrack -j DROP
iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP
iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP
iptables -A FORWARD -m layer7 --l7proto gnutella -j DROP
# Impostazione del Masquerading
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Verifichiamo con iptables -L

# iptables -L -n

Chain FORWARD (policy ACCEPT)


target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto fasttrack
DROP all -- 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto edonkey
DROP all -- 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto msnmessenger
DROP all -- 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto gnutella

Ovviamente esiste un altro importante utilizzo del L7 filtering, ovvero quello di poter modulare
o meglio gestire l’uso della banda per determinati tipi di operazioni, come il P2P.
In effetti è sufficiente “marcare” i pacchetti a livello di postrouting senza effettuarne il DROP ed
il REJECT per poterli poi gestire a livello di QoS.
Questa semplice configurazione può dare un’idea sul come mettere in pratica un filtro per
limitare il bandwidth:

# iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3


# tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

In questo caso ciò che viene marcato con la mangle tables, viene poi gestito al livello di
bandwidth con tc.
Per un approfondimento di questo argomento consiglio il documento pubblicato sul Bandwidth
Limiting:

• http://www.sistemistiindipendenti.org/modules/news/article.php?storyid=186

Vediamo alcuni script standard che possono essere utilizzati per bloccare alcuni tipi di servizi
suddivisi per categorie:

 Blocco di Download Audio/Video


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto fasttrack -j DROP
# 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 napster -j DROP

 Blocco di Accesso Audio/Video


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto audiogalaxy -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto httpaudio -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto http-itunes -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto httpvideo -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto quicktime -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto shoutcast -j DROP

 Blocco di Download di file con estensioni particolari


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto exe -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto ogg -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto flash -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto zip -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto rar -j DROP

 Blocco di sistemi di Chat/Scambio Files


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto aim -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto msn-filetransfer -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto irc -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto jabber -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto skypeout -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto skypetoskype -j DROP

 Blocco di sistemi di Giochi Online


# iptables -t mangle -A POSTROUTING -m layer7 --l7proto battlefield2 -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto doom3 -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto halflife2-deathmatch -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto quake-halflife -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto quake1 -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto worldofwarcraft -j DROP
# iptables -t mangle -A POSTROUTING -m layer7 --l7proto xboxlive -j DROP

Ovviamente questi pat files vanno comunque sperimentati, ed per alcuni viene indicato il livello
di testing effettuato.
Consiglio sempre di verificare con attenzione il loro utilizzo, ed monitorare con attenzione il
sistema specie nelle prime fasi in cui vengono messe in funzioni tali azioni.

Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG

http://www.sistemistiindipendenti.org
e-mail: info@sistemistiindipendenti.org

Note

Provate effettivamente queste configurazioni, si sono rivelate perfettamente funzionanti, anche


se il sistema ci è sembrato piuttosto impegnato ad effettuare il filtering per questo tipo di
connessioni.
Le risorse hardware vanno tenute seriamente in considerazione, ed un sistema con una buona
CPU e molta RAM rappresenta il punto di partenza per realizzare un sistema che si occupi di
filtering a questo tipo di livello.
Il sistema si è comunque rivelato molto utile poter bloccare le connessioni msnmessenger
oppure intercettare il traffico P2P, come Gnutella e WinMX, comprese alcune forme di tunneling
fraudolento attraverso la porta http.
In realtà un utilizzo approfondito di questo sistema permette anche di studiare particolari
regexp o espressioni regolari per intercettare il traffico a noi interessato.
Va fatto notare che per poter prendere davvero confidenza con il sistema occorre dare
un’occhiata alla directory relativa ai protocolli (/etc/l7-protocols), che oltre a fornirci una
directory piena di pat files per diversi tipo di servizi, ci offre anche un paio di esempi per
identificare connessioni dovute a malware (Nimda e Redcode), oltre ad alcuni pat file molto
interessanti per intercettare connessioni normalmente effettuate attraverso il protocollo http o
attraverso il suo tunneling.
Di tutte le estensioni che il kernel possiede, questa l’ho trovata davvero molto utile è mi ha
permesso di risolvere il problema del P2P e dell’uso illecito dell’accesso ad internet in
determinati casi, ulteriore dimostrazione della grande versatilità del kernel e del sistema
operativo Linux, che in questo modo diventa a tutti gli effetti un vero è proprio firewall a livello
applicativo.

Risorse

Application Layer Packet Classifier for Linux


http://l7-filter.sourceforge.net/

Layer 7 Classifier HOWTO - QoS Version


http://l7-filter.sourceforge.net/L7-HOWTO-QoS

Netfilter with layer7 patch, QoS, Ethernet bridging tables


http://l7-filter.sourceforge.net/L7-Netfilter-example

Doc: Linux_layer7.pdf

Dott. Paolo PAVAN [Netlink Sas]– pavan@netlink.it


Data: Gennaio-Marzo 2006

Note finali
 Il presente documento è a semplice scopo divulgativo
 L’autore non si assume la responsabilità di eventuali danni diretti o indiretti derivanti dall'uso dei programmi, o
dall’applicazione delle configurazioni menzionate nel seguente articolo
 I marchi citati sono di proprietà dei rispettivi proprietari e sono stati utilizzati solo a scopo didattico o divulgativo.
 I contenuti di questo documento vengono rilasciati sotto Licenza Creative Commons.
http://creativecommons.org/licenses/by-nc-sa/2.0/
 Sono possibili errori o imprecisioni, segnalatemele a pavan@netlink.it
 Chi volesse integrare il presente documento, può scrivere a pavan@netlink.it.

Sistemisti Indipendenti.ORG