Debian e iptables: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
mNessun oggetto della modifica
Nessun oggetto della modifica
 
(76 versioni intermedie di 11 utenti non mostrate)
Riga 1: Riga 1:
==Introduzione==
{{Versioni compatibili}}{{Gateway-Router}}
Con questa guida intendo spiegare all'utente debian come configurare un server mail basato su Postfix (http://www.postfix.org).
==Introduzione a IPTables/Netfilter==
Postfix � un MTA abbastanza sicuro e di recente sviluppo, molto semplice da usare e per alcuni � considerato il successore di sendmail per altro troppo complicato da gestire e con noti problemi di sicurezza.
Questo semplice HOW-TO è rivolto a tutti coloro che usano iptables (molti, credo) con Debian GNU/Linux.


==Installazione di Postfix==
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.
Prima di tutto abbiamo bisogno di due demoni uno per la gestione del protocollo pop3 e uno per l'imap. Io consiglio popa3d e imapd


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:
<pre># apt-get install iptables</pre>
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 <code>iptables</code> è 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.
{{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.
* ''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'''
# nuovo instradamento del pacchetto
# '''nat POSTROUTING'''
{{Suggerimento|Un bel diagramma di flusso completo è quello realizzato da [https://stuffphilwrites.com/2014/09/iptables-processing-flowchart/ Phil Hagens].}}
==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:
<pre># iptables [-t table] {A|I|D|R|P|N|X|S|E|L...} [chain] rule-specification [option]</pre>
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:
<pre># iptables -I OUTPUT -d 127.0.0.1 -j DROP</pre>
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: <pre>iptables -L</pre>
Per visualizzare anche il numero corrispondente ad ogni regola è sufficiente aggiungere al precedente comando l'opzione <code>--line-numbers</code>. Fatta la prova è possibile eliminare tutte le regole presenti in tutte le tabelle e catene (predefinite) digitando:
<pre>iptables -F</pre>
{{Box|Nota|Poiché il comportamento predefinito di iptables in debian è accettare (policy ACCEPT) e visto che nessuna regola è definita durante l'installazione del sistema operativo, allora tutto il traffico risulta permesso in ogni direzione a meno che l'utente non definisca esplicitamente regole che lo blocchino.}}
Per cambiare il comportamento predefinito di <code>iptables</code>, cioè la sua ''policy'', è possibile usare l'opzione '''<code>-P</code>'''. 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:
<pre>iptables -P INPUT DROP</pre>
====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.
<br/>
<br/>
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:
<pre>
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
</pre>
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.
<br/>
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:
<pre>
net.ipv4.ip_forward = 0 (1)
</pre>
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):
<pre>
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
</pre>
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.
<br/>
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:
<pre>
<pre>
# apt-get update
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
# apt-get install popa3d uw-imapd
</pre>
</pre>
-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):
* [[Configurare Netfilter con Shorewall | shorewall]] <-- guida debianizzata;
* [[Firewall Builder | 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:
<pre># iptables-save > /etc/iptables/firewall.config</pre>
In questo modo, al riavvio successivo, sarà sufficiente richiamare il file di configurazione appena creato:
<pre># iptables-restore < /etc/iptables/firewall.config</pre>
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''':
<pre># apt-get install iptables-persistent</pre>
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:
<pre># iptables-save > /etc/iptables/rules.v4</pre>
====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 domestica ===
==== Wireless access point ====
Nel caso più semplice non è necessario configurare iptables poiché per comportamento predefinito questo permette il passaggio di tutti i dati. L'unica modifica necessaria è a livello di kernel per abilitare il ''forwarding'', ovvero è necessario modificare il file <code>/etc/sysctl.conf</code> impostando a ''1'' il valore del parametro <code>net.ipv4.ip_forward</code>.
Questo non esclude naturalmente che l'utente debba saper configurare correttamente le interfacce di rete necessarie (nel caso dare uno sguardo all'esempio ''Wireless access point e ADSL'' in cui vengono elencate alcune guide di debianizzati).
==== Wireless access point e ADSL ====


fatto questo in /etc/inetd.conf verranno aggiunti i servizi per il pop3 e l'imapd.
Macchina dedicata al ruolo di router/gateway/firewall. È dato per scontato quanto segue:
Procediamo all'installazione dell'MTA vero e proprio
* configurazione corretta dell'interfaccia wireless in modalità master ([[Wireless Access Point (WAP) personalizzato]])
* configurazione corretta di un bridge di rete per le interfacce cablate e senza fili ([[Ethernet Bridging]])
* configurazione corretta di una connessione ADSL ([[Pppoeconf]])
* configurazione corretta di server DNS e DHCP qualora tali servizi non fossero già disponibili ([[Un server DNS e DHCP su Debian]])
 
Di seguito un esempio di script bash per inserire tutte le regole del caso.
* <code>ppp0</code> è l'interfaccia di collegamento al modem ADSL
* <code>br0</code> è il bridge tra <code>eth0</code> e <code>wlan0</code> che consente il collegamento ad internet di tutti gli altri dispositivi della LAN.


<pre>
<pre>
# apt-get install postfix
#!/bin/bash
</pre>
#
# 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 anche le nuove connessioni per le porte 4662 e 4672
iptables -A INPUT -m state --state NEW -p tcp --dport 4662 -j ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 4672 -j ACCEPT
# Accetta tutte le nuove connessioni SSH
iptables -A INPUT -m state --state NEW -p tcp --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


==Configurazione base==
# Accetta tutto il traffico entrante diretto alla lan (br0),
Quasi tutte le opzioni di configurazione di Postfix si trovano nel file /etc/postfix/main.cf
# 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, ad esempio un server di COD4
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --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


Ecco i principali tag a cui conviene prestare attenzione:


<pre>
# ---------
myhostname = valore indica il nome che assumer� il vostro server mail (es: mail.nomedominio.it).
# NAT table
myorigin = valore indica il dominio usato per la posta inviata dal server.
# ---------
mydestination = localhost, altri_valori indicano i domini che il server dovr� riconoscere come locali e che smister� internamente.
mydomain = valore indica il dominio a cui appartiene il server.
relayhost = valore indica a quale server inoltrare le mail che non si riconoscono come locali.
mailbox_size_limit = 0 indica la dimensione massima delle caselle mail, 0 per nessun limite.
mynetworks = valore altri_valori indica le reti nelle quali il server deve operare (es. 127.0.0.1/8 192.168.0.1/24).
mynetworks_syle = host/subnet/class
</pre>


Su questi ultimi due punti il caso di soffermarsi. Stiamo considerando ora quali ip considerare validi per l'invio della posta.


Postfix non autorizza l'invio della posta da parte di client non autorizzati a farlo e/o di domini sconosciuti, ovvero non � un open-relay. Questo � un gran vantaggio perch� impedisce che il vostro server possa essere usato per spam o peggio.
# PREROUTING chain
# ----------------


Tranute mynetworks abilito gli ip presenti nella lista a spedire mail, con mynetworks_style posso specificare uno tra i seguenti tre valori:
# Programmi specifici, ad esempio un server di COD4
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172


;host: l'invio sar consentito solo per la macchina locale.
;class: l'invio sar consentito a tutti i client appartenenti al network di classe A, C o C a cui il server appartiene.
;subnet: indica che Postfix autorizza alla trasmissione tutti i client che appartengono alla stessa sottorete locale del mailserver e costituisce il valore di default.


==Gestione degli Alias==
# POSTROUTING chain
In teoria ad ogni utente locale del vostro server corrisponde una sola casella mail.
# -----------------
Si possono per� creare degli alias che corrispondano ad un particolare utente, un secondo indirizzo a cui inviare mail per quel dato user.
Di default esiste il file /etc/aliases che contiene una lista di alias a sinistra e i rispettivi utenti ai quali appartengono a destra.
In /etc/postfix/main.cf basta solo aggiungere


<pre>
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
alias_maps = hash:/etc/aliases
</pre>
</pre>


e per rendere questo file una mappa utilizzabile da Postfix lanciamo il comando
 
==== Uso di una VPN commerciale ====
 
{{Suggerimento|Prima di procedere si consiglia la lettura della corrispondente sezione presente nella guida dedicata a [[Openvpn]].}}
 
===== Caso 1 =====
 
Questo esempio si basa sulla precedente configurazione (''Wireless access point e ADSL'') per adattarla al caso in cui si decida di configurare il proprio gateway per far transitare tutto il traffico della propria LAN attraverso un tunnel VPN. Si ipotizza inoltre che sul computer che agisce come gateway sia in funzione un servizio che richiede di accettare nuove connessioni dall'esterno attraverso la porta 6666 e che il proprio fornitore di VPN permetta di reindirizzare una sola porta, la 6666 appunto (motivo per cui è stato eliminata la parte di configurazione relativa al forwording delle nuove connessioni come quelle basate sulla porta 20800).
{{Box|Nota|La seguente configurazione farà si che tutte le connessioni provenienti da internet non transitanti per il tunnel VPN saranno rifiutate.}}


<pre>
<pre>
# postalias /etc/aliases
#!/bin/bash
</pre>
#
# INTERFACCE: br0 è l'interfaccia LAN, mentre ppp0 quella ADSL
 
# ------------
# FILTER TABLE
# ------------


==Multidominio, Virtual Domain e Sender Canonical==
# INPUT chain
Nel caso il vostro Server debba ricevre la posta per pi� domini non dobbiamo fare altro che modificare la tag mydestination come segue
# -----------


<pre>
# Politica del negare in modo .predefinito quando non esplicitamente permesso
mydestination = localhost, /etc/postfix/local-domain
iptables -P INPUT DROP
</pre>


creare il file /etc/postfix/local-domain e inserire li i domini da considerare locali uno per riga senza virgole.
# 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


Fatto questo conviene preparare un file per la gestione dei domini virtuali in modo tale da associare il giusto dominio al dato utente
# Accetta tutte le nuove connessioni che NON provengono da internet
creiamo allora il file /etc/postfix/virtual
iptables -A INPUT -m state --state NEW -i br0 -j ACCEPT
La sintassi da usare � la seguente:
# Accetta tutte le connessioni già stabilite
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accetta anche le nuove connessioni per la porta 6666
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -j ACCEPT


<pre>
# Permettere ping
info@dominio1.it marco -> le mail in arrivo per tale indirizzo sono redirezionate a marco
# notare che bloccare altri tipi di pacchetti icmp è considerata da alcuni una cattiva idea
webmaster@dominio2.it andrea@dominio4.it -> le mail verranno inviate a andrea@dominio4.it
# rimuovere -m icmp --icmp-type 8 da questa riga per permettere tutti i tipi di icmp:
@dominio3.com alessandro -> tutte le mail inviate a qualsiasi indirizzo @dominio3.com sono inviate all'utente alessandro
# https://security.stackexchange.com/questions/22711
</pre>
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT


aggiungiamo in /etc/postfix/main.cf
# 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


<pre>
virtual_maps = hash:/etc/postfix/virtual
</pre>


e prepariamo la map con il comando
# OUTPUT chain
# ------------


<pre>
# Imposta il comportamento predefinito (accetta tutto)
# postmap /etc/postfix/virtual
iptables -P OUTPUT ACCEPT
</pre>


Pu essere utile sempre per la gestione di pi domini usare un file che associ ad un nome utente un indirizzo mittente particolare.
Creiamo perci un file /etc/postfix/sender_canonical dove con la precedente sintassi associamo al nome utente l'indirizzo mittente da mostrare nelle mail inviate.
Aggiungiamo in /etc/main.cf la seguente riga:


<pre>
# FORWARD chain
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# -------------
</pre>


ed infine prepariamo la map con
# Imposta il comportamento predefinito (scarta tutto)
iptables -P FORWARD DROP


<pre>
# Accetta tutto il traffico entrante diretto alla lan (br0),
# postmap /etc/postfix/sender_canonical
# purché veicolato da connessioni già stabilite o ad esse riconducibile
</pre>
iptables -A FORWARD -i ppp0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Non inoltrare il restante traffico in entrata
iptables -A FORWARD -i tun0 -o br0 -j REJECT
# Inoltra tutto il traffico uscente proveniente dalla LAN
iptables -A FORWARD -i br0 -o tun0 -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


==Antivirus - Amavis e ClamaV==
Passiamo ora alla configurazione dell'antivirus da installare sul vostro MTA.
Procediamo all'installazione:


<pre>
# ---------
# apt-get install amavisd-new clamav clamav-daemon
# NAT table
</pre>
# ---------


Dopo l'installazione dobbiamo dire a Postfix di far processare le mail dal vostro antivirus. Aggiungiamo a /etc/postfix/main.cf quanto segue:
# POSTROUTING chain
# -----------------


<pre>
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
content_filter = amavis:[127.0.0.1]:10024
</pre>
</pre>
mentre nel file /etc/postfix/master.cf:
<pre>
amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes


127.0.0.1:10025 inet n - n - - smtpd
===== Caso 2 =====
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
</pre>


Di per se non si richiedono altre modifiche per il corretto funzionamento, comunque pu� essere utile dare un occhiata al file /etc/amavis/amavisd.conf per eventuali modifiche.
Anche questo esempio si basa sulla precedente configurazione (''Wireless access point e ADSL''), ma diversamente dal caso precedente qui si presenta la situazione in cui parte del traffico internet non venga dirottato verso il tunnel VPN. In particolare si suppone come prima di avere un servizio sulla porta 6666 accessibile da internet solo attraverso il tunnel VPN ed altri applicativi accessibili sulle porte 22, 4662 e 4672, ma solo dalla normale interfaccia adsl.
Il Demone clamav-daemon (freshclam) tiene aggiornato il vostro antivirus aggiornandosi 12 volte al giorno, per eventuali modifiche /etc/clamav/fresclam.conf e /etc/clamv/clamavd.conf
In tale situazione, onde evitare il rischio che qualcuno possa correlare l'IP di uscita della VPN a quello pubblico proprio, si impostano delle regole anche nella catena di output, in modo che sia impossibile per un servizio rispondere sia attraverso l'interfaccia ADSL che il tunnel VPN.


==Antispam - Spamassassin==
{{Box|Nota|Per permettere il traffico internet in ingresso sull'interfaccia ppp0 è necessario creare e configurare un'apposita tabella di routing aggiuntiva a quella predefinita.}}
Pu� essere utile installare un antispam che filtri le mail nel vostro server. Spamassassin � ci� che fa per voi. Installiamolo insieme a procmail:


<pre>
<pre>
# apt-get install spamassassin procmail
#!/bin/bash
</pre>
#
# INTERFACCE: br0 è l'interfaccia LAN, mentre ppp0 quella ADSL
 
# ------------
# FILTER TABLE
# ------------


a questo punto aggiungiamo in /etc/postfix/main.cf quanto segue
# INPUT chain
# -----------


<pre>
# Politica del negare in modo .predefinito quando non esplicitamente permesso
mailbox_command = /usr/bin/spamc | procmail -a "$EXTENSION"
iptables -P INPUT DROP
</pre>


abilitiamo spamassassin modificando in /etc/default/spamassassin
# 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


<pre>
# Accetta tutte le nuove connessioni che NON provengono da internet (ppp0)
ENABLE=1
iptables -A INPUT -m state --state NEW -i br0 -j ACCEPT
</pre>
# Accetta tutte le connessioni già stabilite
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accetta tutte le nuove connessioni SSH
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 22 -j ACCEPT
# Accetta anche le nuove connessioni per le seguenti porte
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 4662 -j ACCEPT
iptables -A INPUT -i ppp0 -m state --state NEW -p udp --dport 4672 -j ACCEPT
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -j ACCEPT


aggiungiamo al file /etc/procmailrc quanto segue:
# 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


<pre>
# Registrare le sole chiamate negate (accesso via il comando 'dmesg')
DROPPRIVS=yes
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
:0fw
# Respingere tutto il resto del traffico in entrata: politica del negare
| /usr/bin/spamassassin
# in modo predefinito quando non esplicitamente permesso
</pre>
iptables -A INPUT -j REJECT


Per settaggi particolari di spamassassin vi consiglio di dare un'occhiata al file /etc/spamassassin/local.cf oppure consultare il sito web http://www.yrex.com/spam/spamconfig.php che vi consente di creare un file di configurazione personalizzato rispondendo alle varie domande.


==WebMail - Openwebmail==
# OUTPUT chain
Per poter usufruire del servizio di webmail � necessario usare un server web.
# ------------
Io vi consiglio apache con supporto php e cgi. In questa guida presumo che nel vostro server sia gi� presente apache configurato a dovere.
Esistono diversi servizi di WebMail, io ho scelto openwebmail, installiamolo dopo aver aggiunto la repository in /etc/apt/source.list


deb http://people.debian.org/~srua/openwebmail/stable/ ./
# Imposta il comportamento predefinito (accetta tutto)
iptables -P OUTPUT ACCEPT


<pre>
# Blocca le connessioni in uscita sulle interfacce "errate".
# apt-get install openwebmail
iptables -A OUTPUT -o tun0 -p tcp --dport 22 -j REJECT
</pre>
iptables -A OUTPUT -o tun0 -p tcp --dport 4662 -j REJECT
iptables -A OUTPUT -o tun0 -p udp --dport 4672 -j REJECT
iptables -A OUTPUT -o ppp0 -p tcp --dport 6666 -j REJECT


Dopo l'installazione recatevi in /etc/openwebmail e date un occhiata al file apache.conf che contiene le specifiche per configurare apache.
# FORWARD chain
Apriamo ora /etc/openwebmail/openwebmail.conf e apportiamo le nostre personalizzazioni.
# -------------
Attenzione alla voce domainnames, spesso auto pu� portare a dei problemi, vi consiglio di specificare il dominio di appartenenza.
Per altre modifiche consultate il file /usr/share/openwebmail/configs/openwebmail.conf


==Gestione Mailing-List Mailman + Hypermail==
# Imposta il comportamento predefinito (scarta tutto)
Ogni mailserver che si rispetti ha anche un gestore di mailing-list. Io vi consiglio di installare mailman che possiede un ottimo supporto web per le varie configurazioni:
iptables -P FORWARD DROP


<pre>
# Inoltra tutto il traffico proveniente dalla LAN
# apt-get install mailman hypermail
iptables -A FORWARD -i br0 -j ACCEPT
</pre>
# Accetta tutto il traffico entrante diretto alla lan (br0),
# purché veicolato da connessioni già stabilite o ad esse riconducibile
iptables -A FORWARD ! -i br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Programmi specifici, ad esempio un server di COD4
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 28960 -j ACCEPT
# Non inoltrare il restante traffico in entrata proveniente da internet, a prescindere
# che arrivi da tun0 o ppp0
iptables -A FORWARD ! -i br0 -j REJECT


Fatto questo modificate /etc/postfix/main.cf aggiungendo quanto segue:


<pre>
# ---------
alias_maps = hash:/etc/aliases
# NAT table
hash:/var/lib/mailman/data/aliases
# ---------
transport_maps = hash:/etc/postfix/transport
relay_domains = lists.vostrodominio.com
mailman_destination_recipient_limit = 1
</pre>


creiamo /etc/postfix/transport e trasformiamolo in una mappa


<pre>
# PREROUTING chain
# echo lists.vostrodominio.com mailman: > /etc/postfix/transport
# ----------------
# postmap /etc/postfix/transport
</pre>


Modificate ora il file /etc/postfix/master.cf:
# Programmi specifici, ad esempio un server di COD4
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172


<pre>
mailman unix - n n - - pipe flags=FR user=list argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
</pre>


Modificate nel file /etc/mailman/mm_cfg.py i seguenti tag:
# POSTROUTING chain
# -----------------


<pre>
iptables -t nat -A POSTROUTING ! -o br0 -j MASQUERADE
DEFAULT_EMAIL_HOST = 'vostrodominio.com'
DEFAULT_URL_HOST = 'www.vostrosito.com'
MTA='Postfix'
PUBLIC_EXTERNAL_ARCHIVER = 'hypermail -L it -m /var/lib/mailman/archives/private/%(listname)s.mbox/%(listname)s.mbox -l %(listname)s -d /var/lib/mailman/archives/public/%(listname)s'
PRIVATE_EXTERNAL_ARCHIVER = 'hypermail -c -L it -m /var/lib/mailman/archives/private/%(listname)s.mbox/%(listname)s.mbox -l %(listname)s -d /var/lib/mailman/archives/private/%(listname)s'
PUBLIC_ARCHIVE_URL = '/archives/%(listname)s'
PRIVATE_ARCHIVE_URL = '/archives/%(listname)s'
ARCHIVE_TO_MBOX = 2
</pre>
</pre>


Fate attenzione alle voci PUBLIC_ARCHIVE_URL e PRIVATE_ARCHIVE_URL.
== Approfondimenti ==
Sono i link che in mailman verranno associati all'archivio delle vostre mailinglist (www.vostrodominio.it/archives/nomelista). di conseguenza un mio consiglio � creare un link simbolico nella DocumentRoot del server apache in questione:


<pre>
=== Manpages ===
# ln -s /var/lib/mailman/archives/public/ archives
</pre>


Create poi una lista mailman di default per il server (altrimenti il suo demone si rifiuta di partire)
* <code>man iptables</code>
* <code>man iptables-extensions</code>


<pre>
=== Sitografia ===
# newlist mailman
</pre>


ed il gioco � fatto.
* [http://a2.pluto.it/a2/a258.htm#almlindex4169 sez. "IPTables per l'amministrazione del firewall" di Appunti di informatica libera];
Per creare nuove mailing-list basta usare il comando newlist e per rimuoverle rmlist.
* [http://www.netfilter.org/ homepage degli sviluppatori di netfilter]: sono presenti una ottima mailinglist (consigliata) e ricca documentazione.
Per le altre configurazione mailman crea nella vostra directory cgi-bin un programma che vi consente tramite web di accedere alle varie mailing-list per poter modificarne alcuni parametri, anche in questo caso si richiede una corretta configurazione di apache.
* [https://wiki.debian.org/it/iptables iptables] su wiki.debian.org
* [https://help.ubuntu.com/community/IptablesHowTo iptables howto], su help.ubuntu.com
* [https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#IPFILTERING Oskar Andreasson tutorial], su frozentux.net


----
Per qualsiasi informazione


www.giorgioravera.it
{{Autori
|Autore = :[[Utente:Risca86 | Risca]]
(originariamente scritta da [[User:Keltik|Keltik]])
|Verificata_da =
:[[Utente:Gigipin| Gigipin]]
: [[Utente:Wtf|Wtf]] 22:05, 16 set 2015 (CEST)
|Estesa_da =
:[[Utente:Gigipin| Gigipin]]
: [[Utente:Wtf|Wtf]] 22:05, 16 set 2015 (CEST)
|Numero_revisori=2
}}


giorgio@giorgioravera.it
[[Categoria:Firewall]]
[[Categoria:Server]][[Categoria:Networking]]

Versione attuale delle 19:49, 23 gen 2019

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian
Gateway-Router

Sommario

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:

  1. tabella cui attribuire la regola, ad esempio filter;
  2. catena cui attribuire la regola, ad esempio input;
  3. 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;
  4. 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.
Info.png 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:

  1. nat PREROUTING
  2. instradamento del pacchetto:
    • se diretto alla macchina
      1. filter INPUT
      2. elaborazione locale. Se nessuna risposta deve essere data il percorso si conclude qui, viceversa il pacchetto di risposta attraverserà:
      3. nat OUTPUT
      4. filter OUTPUT
    • se diretto ad un altro dispositivo attraverserà invece filter FORWARD
  3. nuovo instradamento del pacchetto
  4. nat POSTROUTING
Bulb.png Suggerimento
Un bel diagramma di flusso completo è quello realizzato da Phil Hagens.


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
Info.png Nota
Poiché il comportamento predefinito di iptables in debian è accettare (policy ACCEPT) e visto che nessuna regola è definita durante l'installazione del sistema operativo, allora tutto il traffico risulta permesso in ogni direzione a meno che l'utente non definisca esplicitamente regole che lo blocchino.

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 domestica

Wireless access point

Nel caso più semplice non è necessario configurare iptables poiché per comportamento predefinito questo permette il passaggio di tutti i dati. L'unica modifica necessaria è a livello di kernel per abilitare il forwarding, ovvero è necessario modificare il file /etc/sysctl.conf impostando a 1 il valore del parametro net.ipv4.ip_forward. Questo non esclude naturalmente che l'utente debba saper configurare correttamente le interfacce di rete necessarie (nel caso dare uno sguardo all'esempio Wireless access point e ADSL in cui vengono elencate alcune guide di debianizzati).

Wireless access point e ADSL

Macchina dedicata al ruolo di router/gateway/firewall. È dato per scontato quanto segue:

Di seguito un esempio di script bash per inserire tutte le regole del caso.

  • ppp0 è l'interfaccia di collegamento al modem ADSL
  • 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 anche le nuove connessioni per le porte 4662 e 4672
iptables -A INPUT -m state --state NEW -p tcp --dport 4662 -j ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 4672 -j ACCEPT
# Accetta tutte le nuove connessioni SSH
iptables -A INPUT -m state --state NEW -p tcp --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, ad esempio un server di COD4
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --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
# ----------------

# Programmi specifici, ad esempio un server di COD4
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172


# POSTROUTING chain
# -----------------

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE


Uso di una VPN commerciale

Bulb.png Suggerimento
Prima di procedere si consiglia la lettura della corrispondente sezione presente nella guida dedicata a Openvpn.


Caso 1

Questo esempio si basa sulla precedente configurazione (Wireless access point e ADSL) per adattarla al caso in cui si decida di configurare il proprio gateway per far transitare tutto il traffico della propria LAN attraverso un tunnel VPN. Si ipotizza inoltre che sul computer che agisce come gateway sia in funzione un servizio che richiede di accettare nuove connessioni dall'esterno attraverso la porta 6666 e che il proprio fornitore di VPN permetta di reindirizzare una sola porta, la 6666 appunto (motivo per cui è stato eliminata la parte di configurazione relativa al forwording delle nuove connessioni come quelle basate sulla porta 20800).

Info.png Nota
La seguente configurazione farà si che tutte le connessioni provenienti da internet non transitanti per il tunnel VPN saranno rifiutate.


#!/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
iptables -A INPUT -m state --state NEW -i br0 -j ACCEPT
# Accetta tutte le connessioni già stabilite
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accetta anche le nuove connessioni per la porta 6666
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -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
# Non inoltrare il restante traffico in entrata
iptables -A FORWARD -i tun0 -o br0 -j REJECT
# Inoltra tutto il traffico uscente proveniente dalla LAN
iptables -A FORWARD -i br0 -o tun0 -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
# ---------

# POSTROUTING chain
# -----------------

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Caso 2

Anche questo esempio si basa sulla precedente configurazione (Wireless access point e ADSL), ma diversamente dal caso precedente qui si presenta la situazione in cui parte del traffico internet non venga dirottato verso il tunnel VPN. In particolare si suppone come prima di avere un servizio sulla porta 6666 accessibile da internet solo attraverso il tunnel VPN ed altri applicativi accessibili sulle porte 22, 4662 e 4672, ma solo dalla normale interfaccia adsl. In tale situazione, onde evitare il rischio che qualcuno possa correlare l'IP di uscita della VPN a quello pubblico proprio, si impostano delle regole anche nella catena di output, in modo che sia impossibile per un servizio rispondere sia attraverso l'interfaccia ADSL che il tunnel VPN.

Info.png Nota
Per permettere il traffico internet in ingresso sull'interfaccia ppp0 è necessario creare e configurare un'apposita tabella di routing aggiuntiva a quella predefinita.


#!/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 br0 -j ACCEPT
# Accetta tutte le connessioni già stabilite
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accetta tutte le nuove connessioni SSH
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 22 -j ACCEPT
# Accetta anche le nuove connessioni per le seguenti porte
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 4662 -j ACCEPT
iptables -A INPUT -i ppp0 -m state --state NEW -p udp --dport 4672 -j ACCEPT
iptables -A INPUT -i tun0 -m state --state NEW -p tcp --dport 6666 -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

# Blocca le connessioni in uscita sulle interfacce "errate".
iptables -A OUTPUT -o tun0 -p tcp --dport 22 -j REJECT
iptables -A OUTPUT -o tun0 -p tcp --dport 4662 -j REJECT
iptables -A OUTPUT -o tun0 -p udp --dport 4672 -j REJECT
iptables -A OUTPUT -o ppp0 -p tcp --dport 6666 -j REJECT

# FORWARD chain
# -------------

# Imposta il comportamento predefinito (scarta tutto)
iptables -P FORWARD DROP

# Inoltra tutto il traffico proveniente dalla LAN
iptables -A FORWARD -i br0 -j ACCEPT
# Accetta tutto il traffico entrante diretto alla lan (br0),
# purché veicolato da connessioni già stabilite o ad esse riconducibile
iptables -A FORWARD ! -i br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Programmi specifici, ad esempio un server di COD4
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20800 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 20810 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p tcp --dport 28960 -j ACCEPT
iptables -A FORWARD -i ppp0 -o br0 -m state --state NEW -p udp --dport 28960 -j ACCEPT
# Non inoltrare il restante traffico in entrata proveniente da internet, a prescindere 
# che arrivi da tun0 o ppp0
iptables -A FORWARD ! -i br0 -j REJECT


# ---------
# NAT table
# ---------


# PREROUTING chain
# ----------------

# Programmi specifici, ad esempio un server di COD4
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20800 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 20810 -j DNAT --to-destination 192.168.1.172
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 28960 -j DNAT --to-destination 192.168.1.172


# POSTROUTING chain
# -----------------

iptables -t nat -A POSTROUTING ! -o br0 -j MASQUERADE

Approfondimenti

Manpages

  • man iptables
  • man iptables-extensions

Sitografia




Guida scritta da:
Risca

(originariamente scritta da Keltik)

Swirl-auth60.png Debianized 60%
Estesa da:
Gigipin
Wtf 22:05, 16 set 2015 (CEST)
Verificata da:
Gigipin
Wtf 22:05, 16 set 2015 (CEST)

Verificare ed estendere la guida | Cos'è una guida Debianized