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