FIREWALL

Transcript

FIREWALL
Dott.Ing.Ivan Ferrazzi
FIREWALL
iptables
V1.1 del 18/03/2013
1/18
Dott.Ing.Ivan Ferrazzi
Copyright ©2013 Dott.Ing. Ivan Ferrazzi
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License, Version 1.2 or any later version published by the
Free Software Foundation; with no Invariant Sections, no
Front-Cover Texts, and no Back-Cover Texts.
2/18
Dott.Ing.Ivan Ferrazzi
Indice generale
CONCETTI BASE...................................................................................................4
Che cosa è iptalbes?........................................................................................4
Il modello a tabelle/catene di iptables.............................................................4
IL COMANDO iptables..........................................................................................7
La struttura del comando.................................................................................7
Le operazioni su tabelle e catene....................................................................7
Il controllo sui pacchetti...................................................................................9
Le azioni sui pacchetti identificati..................................................................12
ip_forward del kernel.....................................................................................13
Eseguire iptables all'avvio.............................................................................14
ESEMPI PRATICI.................................................................................................16
Regole per aprire il collegamento internet....................................................16
Regole per aprire il collegamento FTP...........................................................16
Regole per proxy server trasparenti..............................................................17
Regole per inoltrare le richieste ad un servizio ssh interno..........................17
3/18
Dott.Ing.Ivan Ferrazzi
CONCETTI BASE
Che cosa è iptalbes?
iptables è il programma per la gestione del netfiltering su sistemi
GNU/Linux. Un pacchetto quando passa per il nostro computer per
raggiungere la destinazione prescelta effettua un percorso ben preciso.
All'interno di questo percorso deve passare attraverso a delle tappe ben
precise. La potenzialità di iptables è proprio quella di riuscire a
riconoscere, e all'occorrenza manipolare, i pacchetti che gli interessano.
Ogni pacchetto viene sottoposto a determinate regole che definiscono un
comportamento all'interno di ogni tappa. Le regole desiderate vengono
registrare all'interno di catene appartenenti a tabelle, dove combinazione
tabella/catena rappresenta una tappa diversa all'interno dell'intero
percorso.
Il nome di iptables deriva proprio dal fatto di utilizzare delle tabelle per
la registrazione di regole sui pacchi ip.
Il modello a tabelle/catene di iptables
Le tabelle gestite da iptables sono tre, ossia: MANGLE, NAT e FILTER.
Ogni tabella contiene delle catene ben precise. La parola “catena” viene
utilizzata per rappresentare simbolicamente le regole concatenate in
sequenza tra loro (come gli anelli di una catenta). Le catene presenti
all'interno delle varie tabelle sono:
MANGLE:
4/18
Dott.Ing.Ivan Ferrazzi
●
●
●
●
●
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
NAT:
●
●
●
PREROUTING
OUTPUT
POSTROUTING
FILTER:
● INPUT
● FORWARD
● OUTPUT
Quando un pacchetto entra all'interno del nostro computer passando per
una scheda di rete entra nel così chiamato kernel space. Il kernel space
è lo spazio del kernel dove il pacchetto passa per la tappa “mangle
PREROUTING”, poi per “nat PREROUTING”. Il kernel ora deve
controllare la destinazione del pacchetto indirizzandolo per INPUT (se il
pacchetto è destinato ad un servizio che gira sul computer in locale)
oppure FORWARD (se il pacchetto è indirizzato ad un computer diverso
dal nostro e va quindi mandato avanti).
Se il pacchetto è destinato ad un servizio locale passa per la tappa
“mangle INPUT”, poi “filter INPUT”, esce dal kernel space ed entra
nel user space dove trova il servizio desiderato.
Se il pacchetto è invece destinato ad un altro computer il pacchetto
rimane all'interno del kernel space passando in sequenza per le tappe
“mangle FORWARD”, “filter FORWARD”, “mangle POSTROUTING” e
“nat POSTROUTING”, per poi uscire su un'interfaccia di rete.
Pacchetti che vengono generati nello user space in locale attraversano il
kernel space passando per le tappe “nat OUTPUT”, “filter OUTPUT”,
“mangle POSTROUTING” e “nat POSTROUTING”, per poi uscire su
un'interfaccia di rete.
5/18
Dott.Ing.Ivan Ferrazzi
6/18
Dott.Ing.Ivan Ferrazzi
IL COMANDO iptables
La struttura del comando
Il comando iptables è composto da una sezione all'interno della quale
vanno definite le operazioni da eseguire, una per il controllo del
pacchetto ed un'altra per definire l'azione da eseguire nel caso in cui il
pacchetto corrisponda al controllo effettuato. Abbiamo quindi la seguente
struttura
iptables <operazione> <controllo> <azione>
Le operazioni su tabelle e catene
Come definito precedentemente ogni regola viene inserita in sequenza
all'interno della catena di una rispettiva tabella. Per questo motivo
abbiamo a disposizione diverse opzioni che ci permettono di effettuare
determinate operazioni.
La prima opzione che di solito si utilizza è -t con la quale è possibile
definire la tabella all'interno della quale vogliamo inserire le regole di
controllo. Se non utilizzata all'interno del comando verrà utilizzata la
tabella filter. Altrimenti possiamo utilizzare mangle oppure nat.
Alcune opzioni generali del comando iptables sono:
-v, --verbose
Attiva la visualizzazione verbale (più dettagliata).
7/18
Dott.Ing.Ivan Ferrazzi
-n, --numeric
Quando vengono utilizzati degli indirizzi ip all'interno delle
regole iptables cerca di risolverle prima di visualizzare su
schermo mediante parametro -L. Questo parametro mostra il
contenuto della regola senza effettuare il resolving.
--line-numbers
Questo parametro visualizza il numero identificativo di ogni
regola presente all'interno di una catena.
Le opzioni che possiamo utilizzare per gestire le tabelle ed i loro
contenuti sono:
-N, --new-chain catena
Per creare una nuova catena personalizzata all'interno della
rispettiva tabella
-X, --delete-chain [catena]
Per cancellare catene personalizzate, se vuote
-E, --rename-chain [catena vecchia] [catena nuova]
Per rinominare una catena personalizzata. Vengono passati
come parametri il nome vecchio e quello nuovo.
-L, --list [catena]
Elenca le regole presenti all'interno di una tabella. Questa
opzione può essere utilizzata con l'opzione --line-numbers che
visualizza vicino ad ogni regola il rispettivo numero di riga (da
utilizzare in caso di -I, -D oppure -R).
-F, --flush [catena]
Cancella le regole all'interno della catena in questione. Se non
viene passato nessun parametro questa cancella il contenuto
di tutte le catene presenti all'interno della tabella identificata
da -t oppure filter se non indicato.
-Z, --zero [catena]
Azzera i contatore di una catena, o di tutte se non si passa
nessun parametro.
-P, --policy catena policy
Permette di definire le policy di default, ossia l'azione da
effettuare su tutti i pacchetti che raggiungono la fine della
catena. Possono essere modificate solamente le policy delle
catene di sistema e non di eventuali catene personalizzate.
Opzioni per gestire le regole:
-A, --append catena regole
8/18
Dott.Ing.Ivan Ferrazzi
Permette di aggiungere una nuova regola come ultimo
elemento dell'elenco attualmente presente nella catena.
-D, --delete catena posizione
Permette di eliminare una regola identificata dalla sua
posizione numerica. La prima regola all'interno di una catena
viene identificata dal numero 1.
iptables -D INPUT 1
-R, --replace catena posizione
Permette di rimpiazzare una regola identificata dalla sua
posizione numerica. La prima regola all'interno di una catena
viene identificata dal numero 1.
iptables -R INPUT 1 -p tcp --dport 22 -j DROP
-I, --insert catena [posizione]
Inserire una nuova regola in una posizione specifica all'interno
della catena. La prima regola all'interno di una catena viene
identificata dal numero 1. La nuova regola viene inserita
all'interno della posizione specificata. Tutte le regole a partire
dalla posizione indicata vengono spostate verso il basso.
iptables -I INPUT 1 -p tcp --dport 22 -j DROP
Il controllo sui pacchetti
Nel momento in cui un pacchetto raggiunge una tappa dovrà essere
sottoposto ad un controllo ben preciso. iptables mette a disposizione una
serie di opzioni che permettono di controllare le informazioni contenute
all'interno di un pacchetto. Vediamo alcune di esse:
[!] -p, --protocol protocollo
La presente opzione definisce il protocollo del
pacchetto, ossia tcp, udp, udplite, icmp, esp, ah, sctp,
oppure all. L'utilizzo del protocollo tcp e udp attivano
nuove opzioni come:
con la quale si può definire la porta
sorgente
con la quale si può definire la porta
di destinazione
--sport
--dport
[!] -s, --source indirizzo_ip[/maschera]
Permette di definire l'indirizzo ip di sorgente.
[!] -d, --destination indirizzo_ip[/maschera]
9/18
Dott.Ing.Ivan Ferrazzi
Permette di definire l'indirizzo ip di destinazione.
-j, --jump azione
Permette di definire l'azione da utilizzare per la regola
in questione.
-g, --goto catena_personalizzata
Permette di passare ad una catena personalizzata.
[!] -i, --in-interface nome
Identifica l'interfaccia
pacchetto.
utilizzata
per
ricevere
il
[!] -o, --out-interface nome
Identifica l'interfaccia utilizzata per inviare il pacchetto.
permette di utilizzare dei moduli aggiuntivi. Per poter utilizzare
un modulo con tutte le sue opzioni possibili all'interno di un comando di
iptables mettiamo -m con il nome del modulo. Vediamo alcuni moduli:
iptables
-m mac
Il presente modulo attiva le proprietà utilizzate per
identificare la mac address. L'opzione da usare per
identificare un indirizzo mac è --mac-source.
-m ttl
Il presente modulo attiva le proprietà utilizzate per
identificare il campo ttl. Le opzioni da usare per
identificare il campo ttl sono --ttl-eq, (il valore deve
essere uguale), --ttl-gt (il valore deve essere
maggiore al valore inserito) oppure --ttl-lt (il valore
deve essere minore al valore inserito).
-m state
Il presente modulo attiva le proprietà utilizzate per
identificare lo stato di un pacchetto in relazione alle
eventuali connessioni effettuate. L'opzione da usare per
identificare lo stato di un pacchetto è --state. Come
stato di connessione ne possiamo identificare uno dei
seguenti:
In questo caso vengono riconosciuti i
pacchetti SYN utilizzati per effettuare
una connessione
In questo caso vengono riconosciuti
tutti i pacchetti che appartengono ad
una connessione, tranne il SYN
iniziale
In questo caso vengono riconosciuti
tutti i pacchetti che appartengono ad
una connessione di riferimento, es.
NEW
ESTABLISHED
RELATED
10/18
Dott.Ing.Ivan Ferrazzi
FTP su porta 21 per i comandi e 20
per il passaggio dei dati.
In questo caso vengono riconosciuti
tutti
i
pacchetti
che
non
appartengono ad una connessione.
Nel caso in cui arrivasse un
pacchetto FIN senza connessione
iniziale verrebbe identificato come
non valido
INVALID
-m time
Il presente modulo attiva le proprietà utilizzate per
identificare l'ora e la data del pacchetto in arrivo. Tutte
le opzioni qui di seguito sono opzionali, ma vengono
concatenate con e-logico se inserite. Vediamo alcune
opzioni che si attivano con l'utilizzo di questo modulo:
--datestart AAAA[-MM[-GG[Thh[:mm[:ss]]]]]
--datestop AAAA[-MM[-GG[Thh[:mm[:ss]]]]]
Con queste opzioni possiamo definire
l'intervallo di tempo in base alle
nostre esigenze dove AAAA definisce
l'anno, MM il mese, GG il giorno, hh
l'ora, mm i minuti e ss i secondi.
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
In questo caso definiamo solo il
periodo di tempo in base all'orario
dove hh definisce l'ora, mm i minuti e
ss i secondi.
[!] --monthday giorno[,giorno...]
In questo caso definiamo il giorno del
mese con dei valori che vanno da 1 a
31. Il punto esclamativo (!) permette
di escludere i giorni definiti.
[!] --weekdays giorno[,giorno...]
In questo caso definiamo il giorno
della settimana con dei valori che
vanno
da
1
a
7,
oppure
rispettivamente Mon, Tue, Wed, Thu, Fri,
Sat e Sun. E' possibile utilizzare anche
una forma a due caratteri come Mo,
Tu, ecc.
Le azioni sui pacchetti identificati
Nel momento in cui un pacchetto raggiunge una tappa dovrà essere
sottoposto ad un controllo ben preciso. Il kernel dovrà, infatti, sottoporre
il pacchetto alle singole regole presenti all'interno della rispettiva catena
11/18
Dott.Ing.Ivan Ferrazzi
per identificare eventuali corrispondenze. Nel caso in cui venisse trovata
una corrispondenza il kernel terminerebbe il controllo. Ora però dovrebbe
anche sapere che farne del pacchetto identificato.
Ecco che diventa importante quindi definire per ogni regola l'azione da
svolgere sul pacchetto in questione. iptables permette di utilizzare delle
azioni elementari, chiamate special target, oppure delle azioni definite da
moduli aggiuntivi, chiamate target extension. Le azioni vengono
introdotto dal comando iptables mediante opzione -j. Le azioni
elementari sono:
ACCEPT
DROP
QUEUE
RETURN
I pacchetti passano direttamente e vengono mandati alla
prossima tappa
I pacchetti vengono direttamente scartati e non più mandati
avanti. Al mittente non viene mandato un messaggio di errore.
I pacchetti vengono mandati direttamente allo user space dove
possono essere elaborati dai dovuti programmi.
I pacchetti interrompono l'attraversamento dell'attuale catena
e vengono rimandati alla catena principale. Nel caso in cui il
pacchetto si trovasse già nella catena principale verrà
sottoposto all'azione di default di essa.
Alcune delle azioni aggiuntive sono:
DNAT
Con questa azione è possibile modificare l'indirizzo ip di
destinazione dei pacchetti. Il DNAT (Destination
Network Address Translation) è però presente come
azione solamente all'interno delle catene PREROUTING
e OUTPUT della tabella nat. Le opzioni che possiamo
utilizzare sono:
--to-destination [ip][:port]
con il quale possiamo definire
l'indirizzo ip di destinazione (con
relativa porta), oppure un intervallo
di indirizzi ip da utilizzare. E'
possibile definire anche solo la porta.
Alcuni esempi:
--to-destination 192.168.0.1
--to-destination :80
--to-destination 192.168.0.1-192.168.0.5
LOG
Con questa azione abilitiamo la registrazione nel logfile
di determinati pacchetti. Il logging viene effettuato da
syslog all'interno del file /var/log/messages al quale
viene passato il pacchetto utilizzando la facility kern.
Questa azione mette a disposizione una serie di opzioni,
alcune delle quali sono:
12/18
Dott.Ing.Ivan Ferrazzi
--log-level
--log-prefix
con il quale possiamo definire il livello di
log definito all'interno di syslog.
con questa opzione possiamo definire una
stringa di caratteri (massimo 29) da
aggiungere al messaggio di log oridinale.
MASQUERADE
Questa azione è presente solamente all'interno della
catena POSTROUTING della tabella nat. Questa azione
è una forma abbreviata dell'azione SNAT e ha il compito
di sostituire l'indirizzo ip di sorgente con il proprio
indirizzo.
REJECT
Questa azione è equivalente a DROP solo che viene
invato un messaggio di errore per indicare la
cancellazione del pacchetto.
REDIRECT
Questa azione è presente solamente all'interno delle
catene PREROUTING e OUTPUT della tabella nat.
Possiamo utilizzare questa azione per modificare il
numero della porta di destinazione con l'opzione
aggiuntiva --to-ports.
SNAT
Questa azione viene utilizzata per cambiare l'indirizzo ip
di sorgente del pacchetto. L'azione è presente
solamente all'interno della catena POSTROUTING della
tabella nat. Con questa azioni si possono utilizzare le
seguenti opzioni:
--to-source
con il quale possiamo definire l'indirizzo ip
di sorgente, oppure un intervallo di
indirizzi ip da utilizzare
Alcuni esempi:
--to-source 192.168.0.1
--to-source 192.168.0.1-192.168.0.5
ip_forward del kernel
Il kernel mette a disposizione una serie di funzionalità che si possono
attivare quando il kernel è in esecuzione. Queste funzionalità vengono
messe a disposizione degli utente mediante una serie di file di testo che,
il più delle volte, possono contenere il valore 0 (funzionalità non attiva),
oppure 1 (funzionalità attiva). La funzionalità che interessa a noi viene
attivata mediante il seguente file di testo:
/proc/sys/net/ipv4/ip_forward
13/18
Dott.Ing.Ivan Ferrazzi
Per attivare questa funzionalità possiamo scrivere semplicemente
echo 1 > /proc/sys/net/ipv4/ip_forward
Questa funzionalità permette al kernel di effettuare l'ip forwarding, ossia
il girare semplicemente pacchetti che arrivano da una rete su un'altra
rete riconosciuta dal computer stesso.
L'ip forwarding è indispensabile sulle macchine che devono unire due o
più reti informatiche, quindi nella realizzazione di un route, gateway,
proxy, firewall, ecc.
Eseguire iptables all'avvio
La serie di inserimenti che effettuiamo con il comando iptables vengono
registrate all'interno delle relative tabelle. Nel momento in cui facciamo
ripartire la nostra macchina perdiamo tutte le regole registrate con
iptables. Per questo motivo si consiglia di creare un bash script con
all'interno tutti i comandi di iptables. Questo file verrà poi reso eseguibile
ed inserito all'interno di un runlevel per farlo partire in automatico.
Come prima cosa creiamo il file lo chiamiamo iptables.conf all'interno
della cartella /etc:
#!/bin/bash
# attivare ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
# svuotare le attuali regole
iptables -F
# regole per disabilitare ssh dall'esterno
iptables -A INPUT -p tcp --dport 22 -j DROP
Dopo aver salvato il file andiamo a renderlo eseguibile. I processi
all'interno del runlevel verranno eseguiti come root. Per questo motivo
attiviamo il permesso per l'esecuzione solamente all'utente proprietario
root come segue
chmod 744 iptables.conf
Ora proviamo ad eseguire il file creato con
./iptables.conf
e controlliamo l'attuale contenuto delle catene della tabella filter
iptables -L
Se vediamo apparire la regola che abbiamo inserito non abbiamo
14/18
Dott.Ing.Ivan Ferrazzi
commesso errori.
Ora controlliamo l'attuale runlevel per capire da dove far partire il nostro
bash script.
runlevel
In base al runlevel creiamo un link simbolico all'interno della rispettiva
cartella. Se runlevel restituisce 2 ci spostiamo nella cartella /etc/rc2.d e
creiamo il link simbolico come segue
ln -s /etc/iptables.conf S99iptables
15/18
Dott.Ing.Ivan Ferrazzi
ESEMPI PRATICI
Regole per aprire il collegamento internet
Vediamo come aprire il collegamento ad internet su un firewall che
gestisce sull'interfaccia eth0 la rete interna e sull'interfaccia eth1 la rete
esterna. Per un collegamento ad internet dobbiamo aprire le porte 53 e
80 (DNS e HTTP).
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth0 -p udp --dport 53 \
-m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD –i eth0 -p tcp --dport 80 \
-m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -p udp --sport 53 \
-m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD –i eth1 -p tcp --sport 80 \
-m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -j DROP
Regole per aprire il collegamento FTP
Vediamo come aprire le porte di un server ftp per garantire il passaggio
a connessioni ftp attive e passive. Qui è importante attivare i moduli
ip_conntrack_ftp e ip_nat_ftp per garantire il giusto funzionamento.
modprobe ip_conntrack
modprobe ip_conntrack_ftp
16/18
Dott.Ing.Ivan Ferrazzi
modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
# connessione FTP su porta 21
iptables -A INPUT -p tcp --sport 21 -m state --state RELATED,ESTABLISHED \
-j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED \
-j ACCEPT
# connessione FTP attivo
iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED \
-j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED \
-j ACCEPT
# connessione FTP passivo
iptables -A INPUT -p tcp --sport 1024: --dport 1024: \
-m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: \
-m state --state ESTABLISHED,RELATED -j ACCEPT
Regole per proxy server trasparenti
Vediamo come rendere un proxy server trasparente, ossia facciamo
utilizzare il proxy server senza dover modificare le impostazioni
dell'utente. L'interfaccia eth0 è l'interfaccia utilizzata direttamente
dall'utente per contattare il server.
Proxy server trasparente in caso di Squid:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j REDIRECT --to-ports 3128
Proxy server trasparente in caso di DansGuardian:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j REDIRECT --to-ports 8080
Il comando iptables è composto da una sezione all'interno della quale
vanno definite le operazioni da eseguire, una per il controllo del
pacchetto ed un'altra per definire l'azione da eseguire nel caso in cui il
pacchetto corrisponda al controllo effettuato. Abbiamo quindi la seguente
struttura
Regole per inoltrare le richieste ad un servizio ssh interno
Il nostro esempio è composto da una rete interna (10.0.0.0/24) ed una
rete esterna (192.168.0.0/24). Le due reti sono collegate da un computer
con due schede di rete con rispettivi indirizzi ip 10.0.0.100 su eth0 e
192.168.0.100 su eth1. Nella rete interna è presente un computer con
indirizzo ip 10.0.0.1 sul quale è attivo il server ssh. Il computer centrale
(router) ha il compito di girare le richieste effettuate dal computer
17/18
Dott.Ing.Ivan Ferrazzi
esterno con indirizzo ip 192.168.0.1 al computer interno. Vediamo il file di
configurazione:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables
-j DNAT
iptables
iptables
-j DNAT
iptables
-t nat -A PREROUTING -i eth1 -p tcp --dport 22 \
--to-destination 10.0.0.1
-t nat -A POSTROUTING -i eth1 -p tcp --dport 22 -j MASQUERADE
-t nat -A PREROUTING -i eth0 -p tcp --sport 22 \
--to-destination 192.168.0.1
-t nat -A POSTROUTING -i eth0 -p tcp --sport 22 -j MASQUERADE
18/18