NAT con iptables: differenze tra le versioni
mNessun oggetto della modifica |
|||
(14 versioni intermedie di 5 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
=Scenario= | {{Versioni compatibili | NO_REVISION | wheezy | jessie | stretch | buster}} | ||
Abbiamo una macchina Debian che vogliamo usare come gateway per | ==Scenario== | ||
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 21: | 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 | 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 28: | 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 | In tutte le versioni di Debian il pacchetto <code>iptables</code> è già essere installato di default. In caso non fosse presente, con [[privilegi di amministrazione]] è sufficiente eseguire: | ||
<pre> | <pre> | ||
apt-get install iptables | # apt-get install iptables | ||
</pre> | </pre> | ||
=Configurazione | ==Configurazione== | ||
In questo capitolo vedremo come effettuare una semplice configurazione manuale di iptables. Si assume si stia utilizzando unicamente il classico [[IPv4]] (riconoscibile in particolare dagli indirizzi a 32 bit nella forma 0-255.0-255.0-255.0-255), e '''non''' il nuovo [[IPv6]], per cui invece si disabilita semplicemente il ''forwarding'' (inoltro).<br> | |||
Generalmente iptables viene configurato da linea di comando e non prevede | Generalmente iptables viene configurato da linea di comando e non prevede file di configurazione; il modo migliore per rendere definitive le modifiche alla configurazione e mantenerle anche dopo un riavvio del server è utilizzare uno script.<br> | ||
Il seguente script configura iptables per un servizio di routing DNAT and SNAT ( | Il seguente script configura iptables per un servizio di routing DNAT and SNAT (Destination/Source Network Address Translation) e in più imposta una regola per accettare le connessioni entranti sulla porta 22 (SSH), dirottandole verso la macchina locale di indirizzo IP 192.168.1.200: | ||
<pre> | <pre> | ||
#!/bin/sh | #!/bin/sh | ||
Riga 67: | Riga 56: | ||
case "$1" in | case "$1" in | ||
start) | start) | ||
iptables -t nat -A POSTROUTING -d | iptables -t nat -A POSTROUTING ! -d ${LOCALNET} -j SNAT --to ${EXTERNIP} | ||
iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST} | iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST} | ||
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding | echo 1 > /proc/sys/net/ipv4/conf/all/forwarding | ||
Riga 73: | Riga 62: | ||
stop) | stop) | ||
echo 0 > /proc/sys/net/ipv4/conf/all/forwarding | echo 0 > /proc/sys/net/ipv4/conf/all/forwarding | ||
echo 0 > /proc/sys/net/ipv6/conf/all/forwarding | |||
iptables -t nat -F | iptables -t nat -F | ||
;; | ;; | ||
Riga 84: | Riga 74: | ||
exit 0 | exit 0 | ||
</pre> | </pre> | ||
Modificate gli indirizzi IP secondo le vostre esigenze e salvate il file come < | Modificate gli indirizzi IP secondo le vostre esigenze e salvate il file come <code>/etc/init.d/firewall</code>. | ||
A questo punto rendiamolo eseguibile con il comando: | A questo punto rendiamolo eseguibile con il comando: | ||
<pre> | <pre> | ||
chmod +x firewall | # chmod +x firewall | ||
</pre> | </pre> | ||
e automatizziamolo: | e automatizziamolo: | ||
<pre> | <pre> | ||
update-rc.d firewall defaults | # update-rc.d firewall defaults | ||
</pre> | </pre> | ||
==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 < | ===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 <code>iptables</code>.<br> | |||
Il primo comando iptables che troviamo nello script è: | Il primo comando iptables che troviamo nello script è: | ||
<pre> | <pre> | ||
iptables -t nat -A POSTROUTING -d | iptables -t nat -A POSTROUTING ! -d ${LOCALNET} -j SNAT --to ${EXTERNIP} | ||
</pre> | </pre> | ||
Il comando imposta il SNAT, cioè indirizza verso internet i pacchetti generati dalle macchine della LAN.<br> | Il comando imposta il SNAT, cioè indirizza verso internet i pacchetti generati dalle macchine della LAN.<br> | ||
Vediamo di capirci qualcosa di più: | Vediamo di capirci qualcosa di più: | ||
* < | * <code>-t nat</code> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading | ||
* < | * <code>-A POSTROUTING</code> appende una regola alla catena <code>POSTROUTING</code>: la regola sarà processata dopo tutte le altre regole esistenti | ||
* < | * <code>! -d ${LOCALNET}</code> indica ogni pacchetto destinato a un indirizzo IP non facente parte di <code>${LOCALNET}</code> | ||
* < | * <code>-j SNAT</code> indica di saltare alla regola <code>SNAT</code> | ||
* < | * <code>--to ${EXTERNIP}</code> 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 111: | Riga 102: | ||
iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST} | iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST} | ||
</pre> | </pre> | ||
* < | * <code>-t nat</code> specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading | ||
* < | * <code>-A PREROUTING</code> appende una regola alla catena <code>PREROUTING</code>: la regola sarà processata prima di tutte le altre regole esistenti | ||
* < | * <code>--dst ${EXTERNIP}</code> specifica il destinatario originale del pacchetto (il firewall) | ||
* < | * <code>-p tcp</code> indica che verrà utilizzato il protocollo TCP | ||
* < | * <code>--dport 22</code> specifica la porta di destinazione del pacchetto | ||
* < | * <code>-j DNAT</code> 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> | ||
Il servizio di NAT del firewall può essere avviato o stoppato con i seguenti comandi: | Il servizio di NAT del firewall può essere avviato o stoppato con i seguenti comandi: | ||
<pre> | <pre> | ||
# service firewall start | |||
# service firewall stop | |||
</pre> | </pre> | ||
Teniamo presente che, stoppando il servizio di NAT, impediremo l'accesso a internet a ogni macchina della nostra rete LAN. | Teniamo presente che, stoppando il servizio di NAT, impediremo l'accesso a internet a ogni macchina della nostra rete LAN. | ||
{{Autori | |||
|Autore=[[Utente:Ferdybassi|Ferdybassi]] 17:35, 4 gen 2010 (CET) | |||
|Verificata_da= | |||
[[ | :[[Utente:HAL 9000|HAL 9000]] ([[Discussioni utente:HAL 9000|discussioni]]) 13:08, 13 mar 2021 (UTC) | ||
[[ | |Numero_revisori=1 | ||
[[Categoria: | }} | ||
[[Categoria:Firewall]] |
Versione attuale delle 15:00, 27 mar 2021
Versioni Compatibili Debian 7 "wheezy" Debian 8 "jessie" Debian 9 "stretch" Debian 10 "buster" |
Scenario
Abbiamo una macchina Debian che vogliamo usare come gateway per Internet, per poter fornire uno o più dei seguenti servizi:
- Firewall
- Transparent Proxy
- Content Filtering
- Routing verso un modem ADSL
La nostra rete LAN si presenta quindi in questo modo:
INTERNET | | Modem ADSL | | Debian NAT | | Switch | | Rete LAN
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.
Per tutta la guida verranno utilizzati i seguenti indirizzi:
- Rete LAN: 192.168.1.0
- Macchina accessibile via SSH: 192.168.1.200
- Eth0 Debian NAT: 192.168.1.254
- Eth1 Debian NAT: 172.16.200.254
- Modem ADSL: 172.16.200.1
Installazione
In tutte le versioni di Debian il pacchetto iptables
è già essere installato di default. In caso non fosse presente, con privilegi di amministrazione è sufficiente eseguire:
# apt-get install iptables
Configurazione
In questo capitolo vedremo come effettuare una semplice configurazione manuale di iptables. Si assume si stia utilizzando unicamente il classico IPv4 (riconoscibile in particolare dagli indirizzi a 32 bit nella forma 0-255.0-255.0-255.0-255), e non il nuovo IPv6, per cui invece si disabilita semplicemente il forwarding (inoltro).
Generalmente iptables viene configurato da linea di comando e non prevede file di configurazione; il modo migliore per rendere definitive le modifiche alla configurazione e mantenerle anche dopo un riavvio del server è utilizzare uno script.
Il seguente script configura iptables per un servizio di routing DNAT and SNAT (Destination/Source Network Address Translation) e in più imposta una regola per accettare le connessioni entranti sulla porta 22 (SSH), dirottandole verso la macchina locale di indirizzo IP 192.168.1.200:
#!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin NAME=firewall DESC="Routing - NAT - SSH" # Indirizzo IP della eth1 del firewall EXTERNIP="172.16.200.254" # La macchina della rete che risponde alle richieste SSH SSHHOST="192.168.1.200" # Il range IP della LAN LOCALNET="192.168.1.0/24" case "$1" in start) iptables -t nat -A POSTROUTING ! -d ${LOCALNET} -j SNAT --to ${EXTERNIP} iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST} echo 1 > /proc/sys/net/ipv4/conf/all/forwarding ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/forwarding echo 0 > /proc/sys/net/ipv6/conf/all/forwarding iptables -t nat -F ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop}" >&2 exit 1 ;; esac exit 0
Modificate gli indirizzi IP secondo le vostre esigenze e salvate il file come /etc/init.d/firewall
.
A questo punto rendiamolo eseguibile con il comando:
# chmod +x firewall
e automatizziamolo:
# update-rc.d firewall defaults
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 iptables
.
Il primo comando iptables che troviamo nello script è:
iptables -t nat -A POSTROUTING ! -d ${LOCALNET} -j SNAT --to ${EXTERNIP}
Il comando imposta il SNAT, cioè indirizza verso internet i pacchetti generati dalle macchine della LAN.
Vediamo di capirci qualcosa di più:
-t nat
specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading-A POSTROUTING
appende una regola alla catenaPOSTROUTING
: la regola sarà processata dopo tutte le altre regole esistenti! -d ${LOCALNET}
indica ogni pacchetto destinato a un indirizzo IP non facente parte di${LOCALNET}
-j SNAT
indica di saltare alla regolaSNAT
--to ${EXTERNIP}
specifica che ogni pacchetto che lascia la rete deve avere indirizzo IP${EXTERNIP}
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.
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:
iptables -t nat -A PREROUTING --dst ${EXTERNIP} -p tcp --dport 22 -j DNAT --to-destination ${SSHHOST}
-t nat
specifica che il tipo di regola è network address translation (NAT), cioè IP masquerading-A PREROUTING
appende una regola alla catenaPREROUTING
: la regola sarà processata prima di tutte le altre regole esistenti--dst ${EXTERNIP}
specifica il destinatario originale del pacchetto (il firewall)-p tcp
indica che verrà utilizzato il protocollo TCP--dport 22
specifica la porta di destinazione del pacchetto-j DNAT
indica di saltare alla regolaDNAT
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.
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.
Il servizio di NAT del firewall può essere avviato o stoppato con i seguenti comandi:
# service firewall start # service firewall stop
Teniamo presente che, stoppando il servizio di NAT, impediremo l'accesso a internet a ogni macchina della nostra rete LAN.
Guida scritta da: Ferdybassi 17:35, 4 gen 2010 (CET) | Debianized 40% |
Estesa da: | |
Verificata da:
| |
Verificare ed estendere la guida | Cos'è una guida Debianized |