NAT con iptables: differenze tra le versioni

revisionata, corretti alcuni errori, modificata gerarchia titoli
(revisionata, corretti alcuni errori, modificata gerarchia titoli)
Riga 1: Riga 1:
{{Versioni compatibili|Debian Etch 4.0<br/>Debian Lenny 5.0<br/>Debian Squeeze<br/>Debian Sid|}}
{{Versioni compatibili|Debian Etch 4.0<br/>Debian Lenny 5.0<br/>Debian Squeeze<br/>Debian Sid|}}
=Scenario=
==Scenario==
Abbiamo una macchina Debian che vogliamo usare come gateway per internet, per poter fornire uno o più dei seguenti servizi:
Abbiamo una macchina Debian che vogliamo usare come gateway per Internet, per poter fornire uno o più dei seguenti servizi:
* Firewall
* Firewall
* Transparent Proxy
* Transparent Proxy
Riga 22: Riga 22:
     Rete LAN
     Rete LAN
</pre>
</pre>
Il nostro scopo è quello di utilizzare il modem ADSL per permettere a tutte le macchine della nostra rete LAN di andare in internet, passando attraverso il firewall Debian. Inoltre sarà configurato un accesso SSH da internet verso una macchina della nostra rete LAN.<br/>
Il nostro scopo è quello di utilizzare il modem ADSL per permettere a tutte le macchine della nostra rete LAN di andare in Internet, passando attraverso il firewall Debian. Inoltre sarà configurato un accesso SSH da Internet verso una macchina della nostra rete LAN.<br/>
Per tutta la guida verranno utilizzati i seguenti indirizzi:
Per tutta la guida verranno utilizzati i seguenti indirizzi:
* Rete LAN: 192.168.1.0
* Rete LAN: 192.168.1.0
Riga 29: Riga 29:
* Eth1 Debian NAT: 172.16.200.254
* Eth1 Debian NAT: 172.16.200.254
* Modem ADSL: 172.16.200.1
* Modem ADSL: 172.16.200.1
=Installazione=
==Installazione==
In quasi tutte le versioni di Debian, il pacchetto iptables dovrebbe già essere installato, ma può esser utile controllare:
In quasi tutte le versioni di Debian, il pacchetto iptables dovrebbe già essere installato, ma può esser utile controllare:
<pre>
<pre>
# apt-get install iptables
# apt-get install iptables
</pre>
</pre>
=Configurazione - I Modo=
==Configurazione - I Modo==
La prima configurazione proposta prevede l'utilizzo del pacchetto <tt>ipmasq</tt>, presente nei repository di Debian. Ipmasq è una collezione di script molto ben congegnata, che facilita la configurazione di un IP Masquerade su Debian GNU/Linux. L'IP Masquerade è una funzionalità del kernel di Linux che permette a un'intera rete di computer di essere connessa ad un'altra rete (quasi sempre internet) utilizzando l'indirizzo IP pubblico del gateway.<br>
La prima configurazione proposta prevede l'utilizzo del pacchetto <tt>ipmasq</tt>, presente nei repository di Debian. Ipmasq è una collezione di script molto ben congegnata, che facilita la configurazione di un IP Masquerade su Debian GNU/Linux. L'IP Masquerade è una funzionalità del kernel di Linux che permette a un'intera rete di computer di essere connessa ad un'altra rete (quasi sempre internet) utilizzando l'indirizzo IP pubblico del gateway.<br>
Di default, ipmasq configura il sistema sul quale è installato con le seguenti funzionalità:
Di default, ipmasq configura il sistema sul quale è installato con le seguenti funzionalità:
Riga 47: Riga 47:
risolviamo tutti i nostri problemi e otteniamo un firewall e un gateway perfettamente funzionanti.
risolviamo tutti i nostri problemi e otteniamo un firewall e un gateway perfettamente funzionanti.


=Configurazione - II Modo=
==Configurazione - II Modo==
Tuttavia, se volessimo addentrarci in configurazioni particolari, ipmasq potrebbe starci un po' stretto. In questo capitolo vedremo pertanto come effettuare una semplice configurazione manuale di iptables.<br>
Tuttavia, se volessimo addentrarci in configurazioni particolari, ipmasq potrebbe starci un po' stretto. In questo capitolo vedremo pertanto come effettuare una semplice configurazione manuale di iptables.<br>
Generalmente iptables viene configurato da linea di comando e non prevede files di configurazione; il modo migliore per rendere definitive le modifiche alla configurazione e mantenerle anche dopo un riavvio del server è utilizzare uno script.<br>
Generalmente iptables viene configurato da linea di comando e non prevede files di configurazione; il modo migliore per rendere definitive le modifiche alla configurazione e mantenerle anche dopo un riavvio del server è utilizzare uno script.<br>
Riga 94: Riga 94:
# update-rc.d firewall defaults
# update-rc.d firewall defaults
</pre>
</pre>
==Iptables in profondità==
===Iptables in profondità===
Lo script precedente utilizza delle variabili impostate all'inizio dello script stesso, ma possono essere specificati dei valori anche direttamente all'interno dei comandi <tt>iptables</tt>.<br>
Lo script precedente utilizza delle variabili impostate all'inizio dello script stesso, ma possono essere specificati dei valori anche direttamente all'interno dei comandi <tt>iptables</tt>.<br>
Il primo comando iptables che troviamo nello script è:
Il primo comando iptables che troviamo nello script è:
Riga 103: Riga 103:
Vediamo di capirci qualcosa di più:
Vediamo di capirci qualcosa di più:
* <tt>-t nat</tt> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading
* <tt>-t nat</tt> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading
* <tt>-A POSTROUTING</tt> appende una regola alla catena POSTROUTING: la regola sarà processata dopo tutte le altre regole esistenti
* <tt>-A POSTROUTING</tt> appende una regola alla catena <code>POSTROUTING</code>: la regola sarà processata dopo tutte le altre regole esistenti
* <tt>-d ! ${LOCALNET}</tt> indica ogni pacchetto destinato a un indirizzo IP non facente parte di ${LOCALNET}
* <tt>-d ! ${LOCALNET}</tt> indica ogni pacchetto destinato a un indirizzo IP non facente parte di <code>${LOCALNET}</code>
* <tt>-j SNAT</tt> indica di saltare alla regola SNAT
* <tt>-j SNAT</tt> indica di saltare alla regola <code>SNAT</code>
* <tt>--to ${EXTERNIP}</tt> specifica che ogni pacchetto che lascia la rete deve avere indirizzo IP ${EXTERNIP}  
* <tt>--to ${EXTERNIP}</tt> specifica che ogni pacchetto che lascia la rete deve avere indirizzo IP <code>${EXTERNIP}</code>
Tradotta in italiano, la regola suona più o meno così: prendi ogni pacchetto la cui destinazione è esterna alla LAN e sparalo su internet, dopo aver cambiato il suo indirizzo IP di provenienza con l'indirizzo IP del firewall Debian.<br><br>
Tradotta in italiano, la regola suona più o meno così: prendi ogni pacchetto la cui destinazione è esterna alla LAN e sparalo su internet, dopo aver cambiato il suo indirizzo IP di provenienza con l'indirizzo IP del firewall Debian.<br><br>
Il secondo comando iptables fa esattamente la cosa opposta: prende i pacchetti SSH che arrivano da internet, bloccando invece tutti gli altri, e li indirizza ad una macchina interna:
Il secondo comando iptables fa esattamente la cosa opposta: prende i pacchetti SSH che arrivano da internet, bloccando invece tutti gli altri, e li indirizza ad una macchina interna:
Riga 113: Riga 113:
</pre>
</pre>
* <tt>-t nat</tt> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading
* <tt>-t nat</tt> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading
* <tt>-A PREROUTING</tt> appende una regola alla catena PREROUTING: la regola sarà processata prima di tutte le altre regole esistenti
* <tt>-A PREROUTING</tt> appende una regola alla catena <code>PREROUTING</code>: la regola sarà processata prima di tutte le altre regole esistenti
* <tt>--dst ${EXTERNIP}</tt> specifica il destinatario originale del pacchetto (il firewall)
* <tt>--dst ${EXTERNIP}</tt> specifica il destinatario originale del pacchetto (il firewall)
* <tt>-p tcp</tt> indica che verrà utilizzato il protocollo TCP
* <tt>-p tcp</tt> indica che verrà utilizzato il protocollo TCP
* <tt>--dport 22</tt> specifica la porta di destinazione del pacchetto
* <tt>--dport 22</tt> specifica la porta di destinazione del pacchetto
* <tt>-j DNAT</tt> indica di saltare alla regola DNAT per effettuare la destination network address translation  
* <tt>-j DNAT</tt> indica di saltare alla regola <code>DNAT</code> per effettuare la destination network address translation  
Tradotta in italiano, la regola suona più o meno così: prendi ogni pacchetto TCP che arriva alla porta 22 del firewall, cambiagli l'indirizzo di destinazione e giralo all'interno della rete LAN.<br>
Tradotta in italiano, la regola suona più o meno così: prendi ogni pacchetto TCP che arriva alla porta 22 del firewall, cambiagli l'indirizzo di destinazione e giralo all'interno della rete LAN.<br>
Se, oltre all'accesso SSH, desideriamo fornire altri servizi su altre porte, dovremo scrivere una regola simile per ogni servizio che debba essere raggiunto dall'esterno.<br><br>
Se, oltre all'accesso SSH, desideriamo fornire altri servizi su altre porte, dovremo scrivere una regola simile per ogni servizio che debba essere raggiunto dall'esterno.<br><br>
1 508

contributi