Iptables per tutti
Transcript
Iptables per tutti
Iptables per tutti Analizziamo come utilizzare al massimo il firewall del kernel 2.4 e come munirci dell'indispensabile per affrontare l'etere telematico in piena sicurezza. Una guida pratica alla portata di tutti per capire ogni segreto di iptables esplorandone ogni singola caratteristica. Oramai il kernel 2.4 ha dato dimostrazioni della sua stabilità e si è tuttora imposto nella maggior parte delle distribuzioni mettendo alla luce tutte le sue caratteristiche e novità rispetto al suo predecessore. Fra le tante spicca il suo tool di filtraggio pacchetti: Iptables. Anche se il supporto di ipchains (il firewall del kernel 2.2.x) è stato garantito, iptables si sta prepotentemente guadagnando le attenzioni dell'utenza proprio per alcune features di indiscutibile qualità: a questo proposito ho deciso di scrivere questa guida, adatta ad ogni tipo di utenza, per scoprire completamente tutte le potenzialità di questo firewall, e facilitarne il travaglio a chi è ancora fedele a ipchains e ha difficoltà a apprenderne le differenze. Quando abbiamo bisogno di un firewallIl firewall, nei veicoli motorizzati, serve ad isolare le persone nel cabinato dalle fiamme del motore nell'eventualità che il motore prenda fuoco. Analogamente al compito prettamente fisico del firewall dei veicoli a motore, la firewall che conosciamo nel campo informatico agisce metaforicamente nella stessa maniera, isolando un computer in rete da eventuali attacchi esterni. Tempo fa soltanto gli amministratori di sistema ricorrevano al filtraggio dei pacchetti per prevenire sinistri informatici nelle proprie reti, ma ora, con l'avvento sopratutto dell'IRC (Internet Relay Chat) e di nuovi servizi telematici, che permettono ad una miriade di utenti di venire a conoscenza di un ip privato, il fattore sicurezza è sicuramente stato messo a rischio. Quanti di noi nella propria "vita telematica" si sono imbattuti in fastidiosi nonchè squallidi nukes, floods e DoS (Denial of Services) di vario genere; e quanti altri hanno avuto difficoltà nel rendere irragiungibili da internet alcuni servizi di sistema ( ftp, smb, X...). A tutti questi problemi pone fine il firewall, e nel nostro caso iptables. Installiamo iptables Prima di fiondarci sulla costruzione e sulla sintassi di una "catena" di filtraggio pacchetti è bene verificare le caratteristiche del nostro kernel per appurarne le opzioni necessarie (integrate nel kernel o compilate come moduli). Come avrete notato, una delle differenze sostanziali che c'è tra il firewall di linux e quella di altri OS è che quest'ultimo non agisce come un processo di un programma a se stante, bensì è integrato nel kernel stesso garantendo maggiore stabilità e flessibilità. Prima di poter proseguire è necessario verificare di avere i sorgenti del kernel 2.4 (potete utilizzare quelli della vostra distribuzione oppure scaricarne dei nuovi da http://www.kernel .org), e dirigendoci nella directory /usr/src/'linuxdir' digitiamo il seguente comando per accedere al menu delle opzioni: $ make menuconfig Dopo aver verificato le opzioni seguenti ricompilate il kernel e i moduli con la solita prassi (make dep && make clean && make bzImage && make modules && make modules_install) e nel caso in cui non tutto dovesse andare per il meglio eseguite un make mrproper per cancellare ogni configurazione precedente e ripetete nuovamente l'operazione. Ecco come compilare il kernel per non rinunciare a nessuna delle funzionalità di Iptables, vi ricordo che in base alle vostre esigenze potrete aggiungere altri moduli per espandere le funzionalità del firewall o magari per sfruttare netfilter su ipv6. networking options [*] Network Packet filtering ( replaces ipchains) [*] Network Packet filtering debugging (opzionale) IP Netfilter configuration ----> in questa sezione compilate tutte le voci come moduli (abiliterete anche il masquerade, supporto ipchains e ipfwadm) [M] Iptables support [M] packet filtering [M] etc.etc. Se abbiamo caricato iptables con modprobe o lo abbiamo inserito in /etc/modules.conf, possiamo verificarlo con un semplice comando eseguito anche come utente semplice (permessi permettendo): $ /sbin/lsmod Nel caso voi stiate utilizzando distribuzioni user-friendly come Red Hat o Mandrake potete saltare questa parte installando il pacchetto rpm di iptables presente nei cd di installazione o reperibili da internet (qualora non l'aveste installato di default). Ma secondo me ci perdete tutto il gusto.... Primo approccio A differenza di come ci lasciano intendere alcuni How-to reperibili su internet, iptables non filtra "tutti" i pacchetti tramite le sue tabelle di regole, bensì soltanto il primo o l'ultimo, accettandolo, rifiutandolo, ignorandolo o applicando predeterminati criteri. Se 2 host non si sincronizzano, i pacchetti vanno in time-out senza raggiungere la destinazione, Iptables scartando il primo pacchetto (i syn-packets, i pacchetti di sincronizzazione) fa sì di non dover applicare le stesse regole a tutti i pacchetti, come invece avviene con conntrack (connection tracking, traccia i pacchetti). Prima di tentare un approccio pratico è bene decidere di attivare nei servizi di boot del nostro runlevel (probabilmente il 5) iptables. Nulla di più facile per chi usa Mandrake o RedHat, basta eseguire come root il seguente: $chkconfig --level 5 iptables on Dove "--level 5" indica su quale runlevel va attivato il supporto iptables. Chi usa Debian (mi auguro che cresciate di numero con l'imminente Woody release) non dovrà fare altro che andare il /etc/default/ e modificare il file iptables oppure vedersela con debconf. Una volta garantito di avere il firewall attivo ad ogni boot possiamo prendere confidenza con il primo comando: $ /sbin/iptables -L -n Come illustrato in Figura 3, l'output di questo comando ci mostra le regole attive; nel caso in cui durante l'installazione della vostra distribuzione abbiate selezionato un livello sicurezza (di solito appaiono come "medio, alto, basso" nelle odierne distro), probabilmente il firewall è stato già installato nel vostro sistema e configurata con delle regole predefinite. In questo caso l'output sarà diverso, in quanto vi mostrerà le regole attive, proprio come se l'aveste inserite voi, vedere in Figura 4 per avere un esempio. Catene per fare che ? Quando ci riferiamo ad una tabella di regole di iptables intendiamo una ‘catena’, un insieme di regole concatenate fra loro che vanno ad agire sulle intestazioni IP dei pacchetti per verificarne la corrispondenza. Con il comando "iptables -L -n" siamo venuti a conoscenza delle tre catene di iptables : INPUT FORWARD OUTPUT In un precedente articolo riguardante il Nat (Ip Masquerade e NAT, maggio 2002), abbiamo visto con il comando "iptables -t nat -L -n" le catene del NAT o MASQUERADING: POSTROUTING PREROUTING Ma come orientarci nel loro corretto uso?INPUT e OUTPUT sono due catene che agiscono specificatamente sui pacchetti i quali, destinazione o sorgente, riguardano soltanto il nostro host locale. La prima comprende quelli in entrata (da un host verso il nostro pc), l'altra quelli in uscita (dal nostro host verso un altro pc). FORWARD è specificatamente riservata ai pacchetti che passano (in gergo “forwardati”) da un'interfaccia all'altra (chi è rimasto fedele a ipchains vada a vedere il paragrafo delle "differenze" per un concetto più ampio). Pensate invece che le catene POSTROUTING e PREROUTING agiscano concettualmente agli estremi della firewall una alla fine e l'altra all'inizio come descritto in Figura 5. Le catene contengono le regole (ogni regola è un anello della catena), dove per ordine di "altezza" ogni regola è assegnata ad un numero, come se iptables assegnasse un ordine gerarchico alle regole, la prima regola ad essere letta è appunto la prima (quella che sta più in alto), e finchè il pacchetto non è influenzato da nessun'altra regola iptables continua a scendere di "anello in anello" leggendo tutte le regole fino alla fine della catena (in questo caso il pacchetto passa attraverso la firewall tranquillamente fino a raggiungere i processi interni dell'OS). Premesso ciò mi è obbligatorio sottolineare che la prima regola è capace di annullare tutte le altre, ne vediamo un pratico esempio in Figura 6, anche se ancora non siamo arrivati all'analisi della sintassi di iptables è bene che lo teniate a mente. Le Tabelle dei filtri Pensavate fosse finita lì?! eh eh eh... Si usa specificare le tabelle (altrimenti si ricorre sempre a quella di default) con la seguente sintassi: $/sbin/iptables -t <nometabella> -L Con la precedente abbiamo specificato di vedere le regole attive di una determinata tabella, ma cosa sono le tabelle? Quando ricorriamo ad una tabella è per specificare un target di pacchetti non "incatenabili" da quella di default. La tabella di default è filter ed è caricata dal modulo iptables_filter (che deve essere a sua volta presente nel listato di lsmod insieme a ip_tables per formare il "minimo indispensabile") e non è obbligatoriamente da specificare nella sintassi di iptables. Proprio come gli esempi precedenti il comando $/sbin/iptables -L -n non fa altro che visualizzare l'output della tabella filter. Le altre tabelle che troviamo in iptables sono nat e mangle (caricate entrambi dai rispettivi moduli), la prima è stata già trattata in un articolo precedente e riguarda le regole di DNAT, SNAT e MASQUERADE, l'altra è utilizzata quando un amministratore di sistema deve inserire una marcatura su un pacchetto (in pratica è come se facesse una "rifinitura" di una determinata regola) oppure specificare il TOS (Type Of Service). Per avere specifiche sul TOS vi consiglio di consultare il paragrafo di riferimento. Prima di abbandonarci ai veri e propri comandi di iptables, è bene che voi sappiate che ulteriori tabelle possono essere create per soddisfare varie strategie di firewall... ma ora i comandi ! I comandi di Iptables Per impartire comandi a iptables dobbiamo rispettare una sintassi semplice ed intuitiva, in Figura 7 ne troviamo un pratico esempio illustrato. A voi, tutti i comandi di iptables: • • • • • • • • • • • -A = append, appende una regola, seguono a questo comando il nome della catena, eventuali opzioni ed il target. • -D = delete, segue a delete il nome della catena e il numero di una regola (es . iptables -D OUTPUT 4 : la quarta regola a contare dall'alto della catena OUTPUT). Questo comando cancella la regola selezionata. • -C : check, segue il nome della catena e il numero della regola. Effettua un test. -I = insert, inserisce una regola nella catena (in pratica la "infila" tra 2 regole, se l'avesse "appesa" sarebbe apparsa come l'ultima regola della catena, e sarebbe stata influenzata dalle precedenti) è obbligatorio il nome della catena e il numero con cui vogliamo inserire la regola (se 1 diventa la prima, se 2 la seconda..etc) -R = replace, in pratica fonde i comandi Insert e Delete. Sostituisce una regola con un'altra. -F = flush, se usato senza specificazione cancella tutte le regole di tutte le catene, altrimenti specificare il nome della catena. -L = list, abbiamo già analizzato questo comando precedentemente. -Z = zero, azzera i contatori della catena (se specificata) o di tutte le catene. -N = new, crea una nuova catena. Segue a questo comando il nome della catena. -X = cancella una catena che avete creato con -N, va specificato il suo nome. -P = policy, è la politica del firewall (vedere paragrafi successivi) ed è seguita dal nome della catena e dal target. -E = rename, rinomina una catena, da inserire obbligatoriamente il vecchio nome della catena ed il nuovo. -h = help, è l'help! Le opzioni di Iptables Le opzioni seguono il nome della catena ed alcuni di essi hanno bisogno di moduli specifici; se avete seguito le indicazioni di questo articolo non riscontrerete nessuna difficoltà nell'applicazione di essi in una regola. • • • • • • • • • L'opzione "!" non è obbligatoria ma può essere applicata alle opzioni per invertirne il significato. -p = protocol, segue il nome del protocollo, icmp, udp, tcp o all (per avere specifiche su "all" consultare /etc/protocols) -s = source, specifica l'indirizzo sorgente, in pratica l'host/ip da cui arrivano i pacchetti. Può essere specificata anche una netmask o una porta applicando come seguente: -s 194.168.0.5/24 o -s 194.168.0.5/255.255.255.0 per la netmask, per la porta invece -s 194.168.0.5:21. -d = destination, è l'ip dove sono diretti i pacchetti. Di solito è il nostro ip, e sono possibili le stesse specificazioni di -s. -i = interface, serve a specificare l'interfaccia d'input. Al nome dell'interfaccia, eth0, ppp1 etc.etc. possiamo applicare la variabile + per specificare un'interfaccia attiva. Es -i ppp+, se l'interfaccia ppp0 è attiva ppp+ assumerà il valore di ppp0. -o = output/interfaces, è l'interfaccia di uscita usata nelle catene OUTPUT e POSTROUTING, catene che con l'opzione precedente non hanno applicazioni (se i pacchetti escono che c'entra l'interfaccia d' entrata?). -j = è la fine che facciamo fare ai pacchetti. ACCEPT, DROP, RETURN etc.etc. -n = fornisce un output numerico di porte ed indirizzi ( es. iptables -L -n). -v = verbose, o " -vv" per avere un listato delle regole attive più dettagliato. Per capirlo a fondo provate con: $/sbin/itpables -L -vv • • • -x = exac, se i contatori dei pacchetti o dei byte sono utilizzati visualizzano un output numerico al posto di K, M o G (kilobyte, megabyte, gigabyte). -f = fragment, la regola si riferisce al secondo frammento o ai successivi. E' applicata sui pacchetti frammentati e può essere preceduto da "!" per controllare solo gli "head fragments" o "unfragment packets". Frammentati? Durante una connessione in rete spesso capita che un pacchetto venga frammentato per la sua eccessiva grandezza. Immaginiamo un pacchetto che per le sue dimensioni viene suddiviso in 2 parti, la prima (head fragment) con l'intestazione, che va a soddisfare o meno le regole del firewall, la seconda senza. Iptables potrebbe confondersi e scartare uno o più frammenti di un pacchetto. --tcp-flags = applicabile solo se specificato il protocollo tcp. Questa opzione verifica i flags dei pacchetti per trovarne la corrispondenza. Se vogliamo analizzare i flags SYN, FIN, RST e ACK ma accettare solo i SYN e ACK (pacchetti di risposta di avvenuta connessione) utilizziamo la seguente sintassi. Come noterete i flags accettati sono divisi dal resto non con una virgola ma con uno spazio: -p tcp --tcp-flags SYN,FIN,RST,ACK SYN,ACK • • • • --syn = valida solo se applicata al protocollo tcp. Questa regola specifica soltanto i pacchetti di risposta ad un'avvenuta connessione (è esattamente l'abbreviazione dell'esempio precedente sui flags). --icmp-type = valida solo se applicata al protocollo icmp (-p icmp), questa regola specifica a quale categoria di icmp packets la regola deve trovare applicazione. Per visualizzare tutti i tipi di pacchetti icmp digitare: $/sbin/iptables -p icmp -h --mac-source = valida dopo l'opzione -m mac come il seguente esempio -m mac --mac-source 00:00:ab:c0:45:a7 questa opzione serve a specificare l'applicazione della regola su un'indirizzo sorgente MAC. --limit = imposta un limite, una frequenza massima di una regola. La frequenza può essere specificata in un periodo con /hour, /minute, /second, /day. Ad esempio, se vogliamo che il nostro server non accetti più di una connessione alla volta per secondo basta usare -m limit con l'opzione p tcp --syn. Il seguente esempio vi mostra la corretta sintassi: -m limit --limit 1/sec • • • • • • • • • • • • • --limit-burst = è complementare a --limit ed è seguito da un numero, quello di default è 5. Ogni volta che un pacchetto soddisfa l'opzione --limit, --limit-burst fa da massimo burst (raffica) prima che il limite succitato li respinga. Anche se a prima vista possa sembrare inutile, limit e limit-burst si possono rivelare come delle ottime soluzioni a vari tipi di flood, come ad esempio i syn-floods: $iptables -A FORWARD -p tcp --syn -m limit 1/sec -j ACCEPT --port = questa opzione è valida solo con -m multiport e -p tcp, -p udp, e viene applicata quando sia la porta sorgente che quella di destinazione sono uguali. --mark = riguarda i pacchetti con un valore mark. Questo valore va impostato con il target MARK che verrà trattato successivamente. --uid-owner = valido solo per la catena OUTPUT ed è seguito da l'id di un utente. Funziona solo per i pacchetti creati sul pc locale. --gid-owner = uguale al precedente, unica differenza che comprende i gruppi e non gli utenti. --pid-owner = a differenza dei precedenti in questa opzione va applicato l'ID di un processo (PID). --sid-owner = segue questa opzione l'ID di una sessione. --state = questa opzione identifica lo stato di una connessione TCP con i seguenti valori: NEW: connessione appena stabilita o in stallo. ESTABILISHED: connessione stabilita. RELATED: nuova connessione "relativa" ad una connessione stabilita (come ad esempio dei messaggi d'errore icmp inerenti ad una connessione ). INVALID: riguardano i pacchetti di scansione. -m state "VALORE" unclean = quest'opzione è adatta per specificare i pacchetti inusuali o creati male, dato che è ancora in fase sperimentale ne sconsiglio l'uso. La sintassi è -m unclean. Chi pensa che le opzioni di iptables siano finite si sta illudendo pietosamente, infatti passiamo ora ad analizzare meglio il già citato "type of service" (tipo di servizio). • • --tos = è un'opzione usata per soddisfare una TOS MASK (vedere tabella di riferimento). Qui rappresentato uno stralcio di regola: -m tos--tos 16 TOS specifica i pacchetti relativi a determinati tipi di servizi, e può essere impostato indipendentemente a netfilter dal target.... …e iniziamo con i targets... • TOS = permette l'impostazione del valore del "type of service" ed è valido sono nelle catene di OUTPUT e PREROUTING. Segue il seguente argomento obbligatorio che "può" contenere uno dei valori numerici della tabella dedicata, per visualizzare con iptables una lista di "valid TOS names" digitare da prompt: $iptables -j TOS -h la sintassi per impostare il valore è la seguente: --set-tos "numeroTOS" Policy e Targets I Targets, o in parole spicciole, dove vogliamo destinare i pacchetti che soddisfano le caratteristiche di una regola, sono specificati nelle regole e sono valori che determinano o meno l'entrata, il forwarding, l'uscita, il logging, il mascheramento etc.etc. di uno o più pacchetti. A differenza dei Targets la Policy è sì, applicata ad una regola, ma agisce nei confronti di un'intera catena. Per Policy si intende la politica adottata in una catena, ogni catena ne ha una di default che ha come valore ACCEPT. Il seguente esempio ci svela la sua applicazione nella catena di FORWARD: $iptables -P FORWARD -j DROP Questa regola cambia la FORWARD's policy di default in DROP, se non appendiamo nessuna regola che permetta una "via di fuga" per i pacchetti, nessun pacchetto verrà forwardato dal nostro pc. Eccovi esposta un piccolo firewall con policy "paranoica" e con l'aggiunta delle sopraccitate "vie di fuga" per permettere al pc alcune transizioni indispensabili: $iptables -A INPUT -s 127.0.0.1/255.0.0.0 -j ACCEPT $iptables -A INPUT -s 194.168.0.0/255.255.255.0 -j ACCEPT $iptables -A INPUT -p tcp --dport 22 -j ACCEPT $iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT $iptables -P INPUT -J DROP La precedente è un firewall con policy DROP in INPUT, non accetta nessun genere di pacchetto dall'esterno se non quelli espressamente specificati nelle regole della catena. • • • • La regola n° 1 specifica che tutti i pacchetti provenienti dal nostro pc locale devono essere accettati (altrimenti iptables rifiuta anche quelli!). La regola n° 2 specifica che tutti i pacchetti provenienti dalla nostra piccola rete LAN devono essere accettati. La regola n° 3 lascia passare dall'esterno soltanto i pacchetti destinati sulla porta 22 di protocollo tcp (di solito quella porta è abbinanta a ssh). La regola n° 4, quella che precede la Policy, accetta dall'esterno soltanto le risposte dei ping (detti pong). Ed infine abbiamo inserito la Policy (se l'avessimo inserita prima delle regole avremmo avuto difficoltà nell'interagire con il nostro pc... eheheh, è assurdo ma vero, iptables se vuole essere paranoico ci riesce veramente bene!), per rendere raggiungibile dall'esterno soltanto la porta 22 (almeno in INPUT ). Abbiamo parlato di Targets e Policy, vediamo le loro caratteristiche fondamentali: • • • • • • ACCEPT = accetta i pacchetti specificati nella regola. DROP = rifiuta i pacchetti specificati nella regola. REJECT = come DROP, unica differenza che restituisce all'host sorgente un messaggio d'errore che possiamo decidere con la seguente opzione: --reject-with-type = quest'opzione vi permette di cambiare il messaggio predefinito "icmp-netunreachable" in icmp-host-unreachable, icmp-port-unreachable o in icmp-proto-unreachable. RETURN = ha lo stesso effetto di quando si arriva alla fine di una catena: se l'ultima regola appartiene a una catena predefinita, allora viene eseguita la tattica della catena. Altrimenti se appartiene ad una catena definita dall'utente, si prosegue con la catena precedente, con la regola successiva a quella che aveva causato il salto nella catena dell'utente. QUEUE = è un gestore delle code, il suo compito è quello di accodare i pacchetti per elaborazioni "userspace". Per funzionare ha bisogno del modulo "ip_queue". Tutti i seguenti target hanno bisogno di un loro specifico modulo: • • • • • LOG = effettua il logging dei pacchetti che soddisfano la regola. E' consigliabile associare a questo target la precedente opzione -limit. I seguenti argomenti sono facoltativi: --log-level = permette di specificare il livello di logging. --log-prefix = permette di aggiungere un massimo di 14 caratteri all'inizio del log per identificarne il tipo. --log-tcp-sequence = logga i numeri di sequenza tcp. --log-tcp-options = logga il campo options dell'instestazione del pacchetto tcp. • • • • • • • • • --log-ip-options = uguale al precedente soltanto che è valido per i pacchetti ip. MARK = è valido solo nella tabella mangle ed associa al pacchetto un valore mark. --set-mark "valorenumerico" MIRROR = inverte gli indirizzi sorgente/destinazione dei pacchetti. E' valido nelle catene INPUT, OUTPUT e FORWARD ed è ancora in fase sperimentale. SNAT = Source NAT, richiede la tabella nat ed è valido nella catena di POSTROUTING. E' stato trattato in un articolo (maggio 2002) precedente insieme ai seguenti targets. DNAT = Destination NAT, valido in PREROUTING. MASQUERADE = valido nella tabella POSTROUTNG. REDIRECT = valido solo in PREROUTING, OUTPUT o in una catena definita dall'utente, questo target effettua un redirect sui pacchetti all' host locale. --to-ports = valido con protocolli tcp e udp questa opzione seguente REDIRECT ci permette di modificare le regole euristiche di selezione della porta predefinita. Strategie Finora ci siamo occupati dell'analisi dei comandi, opzioni e targets di iptables, ora bisogna decidere come mettere insieme più regole nelle catene per ottenere un firewall sicuro. Tutto dipende dalla strategia che intendete adottare per il vostro firewall. Potete scegliere di piazzare un bel DROP come Policy sia in INPUT che in OUTPUT che in FORWARD e poi decidere minuziosamente quale pachetto deve entrare o uscire, oppure potete lasciare le vostre catene in ACCEPT e appendere soltanto le regole che ritenete necessarie per la vostra sicurezza. Il primo passo da fare è conoscere i propri servizi e le proprie esigenze, chi meglio di netstat è capace di visualizzarle?! $netstat -tau con il listato di netstat potete capire che servizi attivi avete, attraverso quali protocolli stanno comunicando, lo stato in cui sono (leggere l'opzione -m state) gli indirizzi locali e gli indirizzi remoti, con queste informazioni bisogna plasmare il proprio firewall. Una firewall semplice Costruiamo un firewall minimalista per soddisfare le nostre esigenze casalinghe: $iptables -F INPUT $iptables -F OUTPUT $iptables -F FORWARD dopo aver ripulito le nostre catene andiamo ad appendere le regole. Ammettiamo di avere un X server, samba e ssh come servizi attivi: $iptables -A INPUT -s 127.0.0.1 -j ACCEPT $iptables -A INPUT -s 194.168.0.0/24 -j ACCEPT $iptables -A INPUT -p tcp --dport 6000 -j DROP $iptables -A INPUT -p all --dport 137:139 -j DROP $iptables -A INPUT -p icmp --icmp-type echo-request -j DROP $iptables -A INPUT -p icmp ! --icmp-type echo-reply -j DROP $iptables -A INPUT -p udp --dport 33435:33525 -j DROP $iptables -A FORWARD -p tcp --syn -m limit –limit 3/s -j ACCEPT $iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT In INPUT le prime due regole le abbiamo già analizzate in precedenza, la tre e la quattro specificano di non far passare nessun pacchetto diretto al nostro X server o a samba, la cinque rifiuta gli echo-request mentre la sei risponde solo ai echo-reply inviati dal nostro host. In FORWARD la prima regola ci protegge dai SynFloods, la seconda da scans remoti sospetti. Come avete notato soltanto la nostra rete LAN raggiunge tutti i servizi del nostro pc, su internet soltanto ssh è stato reso raggiungibile con delle semplici precauzioni, e il nostro pc non ha nessun problema nel compiere azioni quotidiane su internet, come chattare o prelevare le e-mails. Iptables vs Ipchains http://www.netfilter.org/documentation/HOWTO/it/packet-filtering-HOWTO-10.html . In questa pagina web leggerete delle differenze (anche a livello sintattico) descritte dagli sviluppatori stessi di netfilter. A ciò che è stato scritto dagli stessi sviluppatori vorrei aggiungere qualche piccola caratteristica: • • A differenza di Iptables, Ipchains filtrava i pacchetti della catena FORWARD prima attraverso INPUT e poi attraverso OUTPUT. le ispezioni stateful di iptables sono state implementate nel kernel come moduli. Un firewall con ispezioni stateful è in grado di monitorare i protocolli per verificare che la comunicazione esegue correttamente le regole di tale connessione ed è capace di verificare l'autenticità dell'ip e della porta sorgente e di destinazione. Salvare le regole Una volta settato il firewall è bene salvare le regole correnti (o attive) in modo tale da non dover riscrivere il tutto al prossimo boot della macchina. Gli utenti di Red hat o Mandrake possono ricorrere al seguente metodo: $/sbin/iptables-save –c > /etc/syconfig/iptables Chi utilizza distribuzioni differenti dovrebbe dare un’occhiata agli script di init.d inerenti iptables. Per Debian basta indicare a /etc/init.d/*iptables di salvare le regole attive: /etc/init.d/*iptables save active Per ogni necessità consultare in /usr/share/doc/*iptables* per avere specifiche sulle metodologie di salvataggio delle regole. Security Issue Anche netfilter ha avuto le sue pecche per quanto concerne l’ambito della sicurezza, ricordiamo il piccolo bug inerente al Masquerade della rete. Un utente poteva rilevare i computer nattati (mascherati dietro il firewall) inviando pacchetti TCP con delle specifiche TTL. Il bug è stato risolto, chi desidera risolvere quest’inconveniente dovrebbe patchare il proprio netfilter (trovate l’indispensabile in www.netfilter.org) oppure ricorrere ai ripari con la seguente regola in OUTPUT: iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP Questa regola evita il rilascio di informazioni “pericolse” tramite il firewall. Anche se è stato un articolo adatto ad ogni tipo di utenza, spero che ogni esigenza sia stata soddisfatta, e vi ricordo che per qualsiasi approfondimento il sito di netfilter (www.netfilter.org) mette a disposizione How-to e FAQ in lingua italiana e vari link ad altri siti dedicati ad iptables. Per chi ha avuto difficoltà con alcuni termini chiave quali, protocollo, flags, MAC ed altre terminologie presenti in questo articolo consiglio vivamente una "letturina" agli Appunti di informatica Libera (http://a2.swlibero.org/), che tenuti costantemente aggiornati dall'autore, stanno diventando una vera e propria bibbia italiana dell'informatica. Per il resto vi ricordo le man ("man iptables"), e la morale del giorno : "chi fa da se fa per tre".
Documenti analoghi
iptables passo-passo - Portale Memolinux
Meccanismo alla base delle connessioni TCP/IP.
Numero tre rimpalli per instaurare la comunicazione “affidabile” con eventuale ritrasmissione.
Packet Filter in LINUX (iptables)
IPTABLES: filter
• Regole possibili della chain:
– ACCEPT (accetta il pacchetto), DROP (scarta il
pacchetto), REJECT (rifiuta il pacchetto), QUEUE
(passa il pacchetto allo user-space), RETURN (e...
Iptables - Giacomo Strangolino
TCP (Transmission Control Protocol, protocollo
Gestisce la di
controllo della trasmissione):
ritrasmissione e il