Linux Layer7
Linux Layer7
Linux Layer7
ORG
http://www.sistemistiindipendenti.org
e-mail: [email protected]
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
Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG
http://www.sistemistiindipendenti.org
e-mail: [email protected]
Configurazione ed Utilizzo
Cosa ci serve?
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
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
# 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
A questo punto si possono applicare le patch per il layer7 e poi configurare il kernel
Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG
http://www.sistemistiindipendenti.org
e-mail: [email protected]
# make menuconfig
Networking --->
Networking options --->
Network packet filtering (replaces ipchains) --->
IP: Netfilter Configuration ---
<M> Layer 7 match support (EXPERIMENTAL)
[*] Layer 7 debugging output
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
# 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.
# 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: [email protected]
Una volta riavviato il sistema con il nostro Kernel dotato del supporto layer7 e ricompilato
iptables, possiamo provare qualche configurazione.
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.
# 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:
Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG
http://www.sistemistiindipendenti.org
e-mail: [email protected]
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
# iptables -L -n
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:
Sistemisti Indipendenti.ORG
Sistemisti Indipendenti.ORG
http://www.sistemistiindipendenti.org
e-mail: [email protected]
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:
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: [email protected]
Note
Risorse
Doc: Linux_layer7.pdf
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 [email protected]
Chi volesse integrare il presente documento, può scrivere a [email protected].
Sistemisti Indipendenti.ORG