Debian e iptables: differenze tra le versioni
Wtf (discussione | contributi) |
Wtf (discussione | contributi) Nessun oggetto della modifica |
||
Riga 20: | Riga 20: | ||
* '''filter''', la tabella usata per decidere il destino dei pacchetti, ovvero accettarli o scartarli. È, usando un'espressione impropria, la tabella delle regole del firewall; | * '''filter''', la tabella usata per decidere il destino dei pacchetti, ovvero accettarli o scartarli. È, usando un'espressione impropria, la tabella delle regole del firewall; | ||
* '''nat''', la tabella usata per alterare e instradare i pacchetti. Questa tabella viene usata per esempio per sostituire l'ip sorgente di un pacchetto in uscita dalla LAN (masquerading) o per reindirizzare ad una certa macchina della LAN tutti i pacchetti provenienti da internet e diretti verso una certa porta. | * '''nat''', la tabella usata per alterare e instradare i pacchetti. Questa tabella viene usata per esempio per sostituire l'ip sorgente di un pacchetto in uscita dalla LAN (masquerading) o per reindirizzare ad una certa macchina della LAN tutti i pacchetti provenienti da internet e diretti verso una certa porta. | ||
{{Box|Nota|Omettere la dichiarazione della tabella di riferimento equivale a dichiarare implicitamente ''filter'' come tabella di riferimento.}} | |||
Le catene possono essere pensate come le colonne che compongono le tabelle. | Le catene possono essere pensate come le colonne che compongono le tabelle. | ||
* ''filter'' | * ''filter'' |
Versione delle 11:03, 17 set 2015
Versioni Compatibili Tutte le versioni supportate di Debian |
Introduzione a IPTables/Netfilter
Questo semplice HOW-TO è rivolto a tutti coloro che usano iptables (molti, credo) con Debian GNU/Linux.
Il tool iptables è (a partire dalla serie 2.4.x) il comando in user-space - a livello utente - che permette all'amministratore di interagire con netfilter ovvero il programma a livello kernel che si occupa del filtraggio dei pacchetti.
Per quanto riguarda Debian, Netfilter è presente in tutti i kernel installabili durante il setup di Debian. È pertanto sufficiente per iniziare ad utilizzare il proprio firewall installare il programma IPTables:
# apt-get install iptables
Attenzione che se avete un kernel ricompilato per conto vostro dovrete assicuratevi di avere abilitato tutte le opzioni ed i moduli necessari.
Nozioni di base
Prima di addentrarsi nel magico mondo di iptables
è bene aver chiare alcune informazioni preliminari, assolutamente necessarie per comprendere i comandi che saranno presentati più avanti.
In linea generale ogni regola di iptables, per quanto lunga e complessa, è così strutturata:
- tabella cui attribuire la regola, ad esempio filter;
- catena cui attribuire la regola, ad esempio input;
- condizioni che fanno applicare la regola al pacchetto in esame, ad esempio proveniente da fuori LAN, basato su protocollo TCP e diretto alla porta numero X;
- azione da intraprendere, ad esempio accettare o scartare il pacchetto.
Ci sono cinque tabelle indipendenti predefinite, ma all'utente comune normalmente ne interessano solo due:
- filter, la tabella usata per decidere il destino dei pacchetti, ovvero accettarli o scartarli. È, usando un'espressione impropria, la tabella delle regole del firewall;
- nat, la tabella usata per alterare e instradare i pacchetti. Questa tabella viene usata per esempio per sostituire l'ip sorgente di un pacchetto in uscita dalla LAN (masquerading) o per reindirizzare ad una certa macchina della LAN tutti i pacchetti provenienti da internet e diretti verso una certa porta.
Nota Omettere la dichiarazione della tabella di riferimento equivale a dichiarare implicitamente filter come tabella di riferimento. |
Le catene possono essere pensate come le colonne che compongono le tabelle.
- filter
- INPUT, raggruppa tutte le regole riguardanti i pacchetti che arrivati ad una delle interfacce di rete della macchina devono essere indirizzati alla macchina stessa;
- OUTPUT, raggruppa tutte le regole riguardanti i pacchetti generati dalla macchina e destinati ad essere inviati altrove;
- FORWARDING, raggruppa tutte le regole riguardanti i pacchetti che arrivati ad una delle interfacce di rete della macchina devono essere instradati direttamente ad un'altra sua interfaccia, poiché non destinati a questa macchina.
- nat
- PREROUTING, raggruppa tutte le regole che modificano i pacchetti in arrivo ad una delle interfacce della macchina, prima che raggiungano la tabella filter;
- OUTPUT, raggruppa tutte le regole che modificano i pacchetti generati dalla macchina prima di transitare attraverso la catena output della tabella filter;
- POSTROUTING, raggruppa tutte le regole che modificano i pacchetti in uscita da una delle interfacce della macchina, dopo che hanno già oltrepassato la tabella filter, catena output o catena forwarding a seconda della provenienza del pacchetto;
Se si considerano le sole due tabelle qui descritte l'ordine di transito dei pacchetti attraverso le diverse catene è il seguente:
- nat PREROUTING
- instradamento del pacchetto:
- se diretto alla macchina
- filter INPUT
- elaborazione locale. Se nessuna risposta deve essere data il percorso si conclude qui, viceversa il pacchetto di risposta attraverserà:
- nat OUTPUT
- filter OUTPUT
- se diretto ad un altro dispositivo attraverserà invece filter FORWARD
- se diretto alla macchina
- nuovo instradamento del pacchetto
- nat POSTROUTING
Iniziamo
Ovviamente, trattandosi di GNU/Linux, vi sono più modi differenti per ottenere i risultati desiderati. Lasciando ad ognuno il suo, ecco un excursus per vedere da dove iniziare.
Come interagire con Netfilter
Se Netfilter è il cuore del kernel che fa per noi il lavoro sporco di spulciarci/forwardare i pacchetti, IPTables è il potente tool User-space con il quale eseguire la configurazione. Oltre all'uso di IPTables sono nati anche varie GUI nel tentativo di fornire un approccio più user-friendly.
IPTables
Il comando IPTables, da dare con privilegi di root, ci permette di modificare le regole di netfilter. A grandi linee il comando è così schematizzabile:
# iptables [-t table] {A|I|D|R|P|N|X|S|E|L...} [chain] rule-specification [option]
Tradotto in Italiano: indichiamo a iptables su quale tabella se aggiungere/eliminare una nuova catena [di regole] o se inserire/appendere/eliminare in una data catena una certa regola. Per esempio, se inseriamo le seguente regola:
# iptables -I OUTPUT -d 127.0.0.1 -j DROP
indichiamo a iptables di inserire [-I] alla posizione 1 della catena d'uscita [OUTPUT] questa direttiva: ogni pacchetto indirizzato all'interfaccia di loop back [-d 127.0.0.1] deve essere [-j] scartato [DROP]. Pertanto non sarà più possibile pingarsi (ping 127.0.0.1). È possibile visualizzare tutte le regole attive con:
iptables -L
Per visualizzare anche il numero corrispondente ad ogni regola è sufficiente aggiungere al precedente comando l'opzione --line-numbers
. Fatta la prova è possibile eliminare tutte le regole presenti in tutte le tabelle e catene (predefinite) digitando:
iptables -F
Per cambiare il comportamento predefinito di iptables
, cioè la sua policy, è possibile usare l'opzione -P
. Ad esempio per imporre di scartare ogni pacchetto transitante attraverso la catena INPUT della tabella filter, fatta salva la definizione di regole specifiche che ne prevedano l'accettazione, basterebbe digitare:
iptables -P INPUT DROP
NAT e FORWARD
l Network Address Translation è la tecnica grazie alla quale un nodo di rete capace di lavorare al layer Network (quale un router, un gateway ecc) modifica l’header dei pacchetti che transitano attraverso di esso, mantenendo traccia dello storico delle modifiche effettuate per redirigere una connessione verso un’altra macchina (Destination NAT), per modificare l’indirizzo IP sorgente di un pacchetto (Source NAT), condividere una connessione ad Internet tra tutta la rete che utilizza un gateway (Masquerading) o infine reindirizzare un pacchetto destinato ad una porta verso un’altra.
I vantaggi di utilizzare questa tecnica sono molteplici, si pensi, per esempio, alla possibilità da parte degli amministratori di rete di condividere l'accesso ai servizi di Internet senza conferire indirizzi IP limitati ad ogni nodo presente sulla LAN. Un modo comunemente usato è quello di un indirizzo IP privato, in modo da permettere a tutti i nodi sulla LAN di accedere in modo corretto ai servizi della rete sia interni che esterni. I firewall possono ricevere da Internet, le trasmissioni in entrata e direzionare i pacchetti al nodo LAN specifico; allo stesso tempo i firewall/gateway possono direzionare le richieste in uscita da un nodo della LAN al servizio remoto di Internet. Questo inoltro di traffico della rete alle volte può essere pericoloso, soprattutto con la disponibilità di tool moderni, capaci di eseguire delle azioni di spoof nei confronti di indirizzi IP interni, e rendere la macchina di un aggressore remoto, comportarsi come un nodo sulla vostra LAN. Per evitare tutto questo, iptables fornisce delle policy di forwarding e di routing, che possono essere implementate per prevenire un uso improprio delle risorse della rete.
La catena FORWARD permette ad un amministratore di controllare dove vengono diretti i pacchetti all'interno di una LAN. Per esempio, per abilitare il forwarding per l'intero LAN (assumendo che il firewall/gateway ha un indirizzo IP interno su eth1), possono essere impostate le seguenti regole:
iptables -A FORWARD -i eth1 -j ACCEPT iptables -A FORWARD -o eth1 -j ACCEPT
Questa regola conferisce ai sistemi situati dietro un firewall/gateway, la possibilità di accedere alla rete interna. Il gateway direziona i pacchetti da un nodo LAN alla sua destinazione prevista, passando tutti i pacchetti attraverso il proprio dispositivo eth1.
Per default, la policy IPv4 nei kernel Debian disabilita il supporto per l'inoltro IP, il quale evita alle macchine Debian di non comportarsi come dei router. Per abilitare l'inoltro IP modificare il file /etc/sysctl.conf sostituendo 0 con 1 alla seguente voce:
net.ipv4.ip_forward = 0 (1)
Accettando i pacchetti inoltrati tramite il dispositivo IP interno si abilita la comunicazione tra i nodi LAN; tuttavia essi non sono ancoraabilitati a comunicare esternamente con Internet. Per abilitare i nodi LAN con indirizzi IP privati alla comunicazione con le reti pubbliche esterne configurate il firewall per l'IP masquerading, il quale maschera le richieste provenienti dai nodi LAN con l'indirizzo IP dei dispositivi esterni del firewall (in questo caso, eth0):
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
La regola utilizza il NAT packet matching table (-t nat), e specifica la catena POSTROUTING interna per NAT (-A POSTROUTING), sul dispositivo networking esterno del firewall (-o eth0). POSTROUTING permette ai pacchetti di essere modificati quando gli stessi abbandonano il dispositivo esterno del firewall. Il target -j MASQUERADE viene specificato in modo da poter mascherare l'indirizzo IP privato di un nodo, con l'indirizzo IP esterno del firewall/gateway. Pertanto, il masquerading è permette ad una rete interna con IP statico e quindi non routabile all’esterno, di uscire su internet con il solo IP pubblico del dispositivo(router, firewall) sul quale è in funzione un’implementazione di questa tecnica.
Concludiamo il discorso sul NAT, parlando del REDIRECT che consente di cambiare la destinazione del pacchetto forzandolo verso la macchina stessa e volendo di modificare contestualmente anche la sua porta di destinazione. Anche questa operazione si svolge nella chain di PREROUTING.
La sintassi è la seguente:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
-i interfaccia di destinazione -p protocollo di destinazione (tcp o udp) --dport porta di destinazione da reindirizzare --to-port nuova porta di destinazione
GUI - Grafical User Interfaces
Queste alternative non hanno avuto un enorme successo, forse perché si fa prima a capire come funzione Netfilter piuttosto che un programma che configura Netfilter. In ogni caso ecco una breve lista di possibili alternative, a discrezione dell'utente (l'ordine è puramente casuale):
- shorewall <-- guida debianizzata;
- fwbuilder <-- guida debianizzata;
- Turtle Firewall Project;
- Integrated Secure Communications System;
- Tanti, tanti altri.
Salvare la configurazione del firewall
Questa parte presenta una particolarità rispetto a quanto solitamente abituati nell'impostare le configurazioni. Infatti, lavorando a livello di kernel (netfilter) non è possibile salvare in modo permanente la configurazione del proprio firewall ma è necessario richiamarla volta per volta. Anche qui, a seconda dei gusti, propongo due differenti soluzioni che consiglio magari da utilizzare entrambi.
Tools di IPTables
Dopo aver creato la directory di configurazione (suggerisco /etc/iptables/) è possibile, dopo che si hanno inserito tutte le opzione tramite shell, salvare il lavoro svolto nel seguente modo:
# iptables-save > /etc/iptables/firewall.config
In questo modo, al riavvio successivo, sarà sufficiente richiamare il file di configurazione appena creato:
# iptables-restore < /etc/iptables/firewall.config
Sarà ovviamente possibile creare uno script che in automatico attivi la configurazione del firewall all'accensione.
I vantaggi di questo metodo sono la rapidità di esecuzione del comando iptables-restore ma obbligano, qualora si volesse effettuare delle modifiche alle regole, ad intervenire per forza tramite shell.
Automatizzare la procedura
In alternativa si può utilizzare il pacchetto iptables-persistent:
# apt-get install iptables-persistent
che permette di salvare le regole attualmente in uso in un apposito file che sarà poi automaticamente caricato ad ogni avvio. Nel caso di IPv4:
# iptables-save > /etc/iptables/rules.v4
Script di Bash
Questo metodo consente, secondo personale parere, un maggiore ordine delle regole. Infatti l'idea è di creare uno script di Bash che, eseguendolo, imposti tutte le regole del firewall.
Esempi
LAN casalinga
Script bash per inserire tutte le regole del caso. ppp0
è l'interfaccia di collegamento al modem ADSL, mentre br0
è il bridge tra eth0
e wlan0
che consente il collegamento ad internet di tutti gli altri dispositivi della LAN.
#!/bin/bash # # INTERFACCE: br0 è l'interfaccia LAN, mentre ppp0 quella ADSL # ------------ # FILTER TABLE # ------------ # INPUT chain # ----------- # Politica del negare in modo .predefinito quando non esplicitamente permesso iptables -P INPUT DROP # Permette tutto il traffico su loopback (lo0) ed elimina tutto il traffico che non usa lo0 verso 127/8 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accetta tutte le nuove connessioni che NON provengono da internet (ppp0) iptables -A INPUT -m state --state NEW ! -i ppp0 -j ACCEPT # Accetta tutte le connessioni già stabilite iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Accetta tutti i tipi di connessione, purché HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Accetta anche le nuove connessioni per le porte 4662 e 4672 iptables -A INPUT -p tcp -m state --state NEW --dport 4662 -j ACCEPT iptables -A INPUT -p udp -m state --state NEW --dport 4672 -j ACCEPT # Accetta tutte le nuove connessioni SSH iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT # Permettere ping # notare che bloccare altri tipi di pacchetti icmp è considerata da alcuni una cattiva idea # rimuovere -m icmp --icmp-type 8 da questa riga per permettere tutti i tipi di icmp: # https://security.stackexchange.com/questions/22711 iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # Registrare le sole chiamate negate (accesso via il comando 'dmesg') iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Respingere tutto il resto del traffico in entrata: politica del negare # in modo predefinito quando non esplicitamente permesso iptables -A INPUT -j REJECT # OUTPUT chain # ------------ # Imposta il comportamento predefinito (accetta tutto) iptables -P OUTPUT ACCEPT # FORWARD chain # ------------- # Imposta il comportamento predefinito (scarta tutto) iptables -P FORWARD DROP # Accetta tutto il traffico entrante diretto alla lan (br0), # purché veicolato da connessioni già stabilite o ad esse riconducibile iptables -A FORWARD -i ppp0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Programmi specifici iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 443 -j ACCEPT # COD4 iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport 20800 -j ACCEPT iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport 20810 -j ACCEPT iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW --dport 28960 -j ACCEPT # Non inoltrare il restante traffico in entrata iptables -A FORWARD -i ppp0 -o br0 -j REJECT # Inoltra tutto il traffico uscente proveniente dalla LAN iptables -A FORWARD -i br0 -o ppp0 -j ACCEPT # Inoltra tutto il traffico proveniente da wlan0 a eth0 e viceversa (quindi entrante e uscente # da br0) iptables -A FORWARD -i br0 -o br0 -j ACCEPT # --------- # NAT table # --------- # PREROUTING chain # ---------------- # COD4 iptables -t nat -A PREROUTING -i ppp0 --dport 20800 -j DNAT --to-destination 192.168.1.172 iptables -t nat -A PREROUTING -i ppp0 --dport 20810 -j DNAT --to-destination 192.168.1.172 iptables -t nat -A PREROUTING -i ppp0 --dport 28960 -j DNAT --to-destination 192.168.1.172 # POSTROUTING chain # ----------------- iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Approfondimenti
Manpages
man iptables
man iptables-extensions
Sitografia
- sez. "Comunicare 5" di Appunti di informatica libera;
- homepage degli sviluppatori di netfilter: sono presenti una ottima mailinglist (consigliata) e ricca documentazione.
- iptables su wiki.debian.org
- iptables howto, su help.ubuntu.com
- Oskar Andreasson tutorial, su frozentux.net
Guida scritta da:
(originariamente scritta da Keltik) |
Debianized 60% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |