[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 350.   Kernel Linux 2.4 e 2.6: NAT/PAT

Il kernel Linux 2.4.*, assieme alla gestione del filtro dei pacchetti IP, può occuparsi anche della trasformazione degli indirizzi e delle porte, ovvero del NAT/PAT. Ciò consente, tra le altre cose, di ottenere il mascheramento IP e la gestione del proxy trasparente.

È molto probabile che queste funzionalità siano disponibili solo per i protocolli IPv4.

350.1   Struttura e punti di intervento

La gestione NAT/PAT può essere applicata in tre punti, denominati PREROUTING, POSTROUTING e OUTPUT.

Figura 350.1. Punti di intervento per la gestione del NAT/PAT e influenza relativa.

NAT/PAT

Il PREROUTING si riferisce a una posizione ideale che precede l'instradamento da parte dell'elaboratore. In questa posizione è possibile modificare gli indirizzi di destinazione, in modo che l'instradamento possa avvenire correttamente in base a tali trasformazioni.

Il POSTROUTING si riferisce a una posizione ideale successiva all'instradamento da parte dell'elaboratore. In questa posizione è possibile modificare gli indirizzi di origine.

Il punto denominato OUTPUT si riferisce ai pacchetti generati da un processo locale. Questi vengono vagliati successivamente anche dal punto POSTROUTING; a ogni modo si può gestire solo la trasformazione degli indirizzi di destinazione.

350.2   Gestione con IPTables

La configurazione della trasformazione degli indirizzi avviene per mezzo di IPTables, intervenendo nella tabella nat:

iptables -t nat opzione_di_comando punto_di_intervento regola obiettivo_di_trasformazione

Le opzioni di comando sono le stesse che si utilizzano per la gestione del filtro dei pacchetti IP. Anche in questo caso è prevista la presenza di una politica predefinita, dove la parola chiave ACCEPT serve a specificare l'assenza di trasformazioni. In condizioni normali, la tabella risulta vuota, come si vede nell'esempio seguente:

iptables -t nat -L[Invio]

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Sono disponibili le opzioni che identificano il protocollo, gli indirizzi, le porte e le interfacce di rete, come già avviene nell'utilizzo di IPTables per la gestione del filtro IP.

350.3   Modifica dell'origine

Per comprendere il significato della trasformazione degli indirizzi di origine, conviene fare riferimento a un esempio, come si vede nella figura 350.3. In questo caso, il NAT si trova collegato a una rete privata, in cui si usano indirizzi 192.168.1.*, mentre dalla parte connessa alla rete esterna, dispone di quattro indirizzi validi: 1.2.3.4, 1.2.3.5, 1.2.3.6, 1.2.3.7. Per consentire i collegamenti che partono dalla rete interna a quella esterna, il NAT deve sostituire gli indirizzi di origine utilizzando convenientemente i quattro indirizzi di cui dispone. Naturalmente, i quattro indirizzi in questione corrispondono tutti alla stessa interfaccia ed esistono gli instradamenti necessari dalla rete esterna a questi indirizzi.

Figura 350.3. Modifica degli indirizzi di origine.

NAT

Per raggiungere questo risultato, si può utilizzare il comando seguente, supponendo che eth0 sia l'interfaccia a cui fanno riferimento i quattro indirizzi IP validi per la rete esterna:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source \
  \         1.2.3.4-1.2.3.7
[Invio]

iptables -t nat -L POSTROUTING[Invio]

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  anywhere             anywhere           to:1.2.3.4-1.2.3.7 

Come si può osservare, per ottenere la trasformazione degli indirizzi di origine viene utilizzato l'obiettivo di trasformazione SNAT, che implica l'uso di un'opzione aggiuntiva:

--to-source indirizzo_ip[-indirizzo_finale][:porta_iniziale-porta_finale]
--to indirizzo_ip[-indirizzo_finale][:porta_iniziale-porta_finale]

Come si intende dal modello sintattico, è possibile aggiungere l'indicazione di un intervallo di porte da utilizzare per la trasformazione. In generale, non mettendo questa informazione, la trasformazione delle porte avviene in modo corretto.

Questo tipo di trasformazione precisa degli indirizzi di origine si presta per le situazioni in cui l'interfaccia di rete collegata alla rete esterna ha uno o più indirizzi IP statici da poter mostrare. In alternativa, quando si può disporre soltanto di un indirizzo dinamico, come avviene nelle connessioni PPP comuni, conviene usare l'obiettivo MASQUERADE.

Figura 350.5. Mascheramento IP.

NAT

Seguendo l'esempio della figura 350.5, supponendo che l'interfaccia di rete collegata all'esterno sia ppp0, si procede nel modo seguente:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE[Invio]

iptables -t nat -L POSTROUTING[Invio]

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE all  --  anywhere             anywhere           

Si intende che la sostituzione dell'origine si gioca su un indirizzo IP unico, gestendo convenientemente le porte TCP e UDP. Pertanto, l'indirizzo in questione è implicitamente quello di cui dispone l'interfaccia di rete, che così può essere dinamico.

350.4   Modifica della destinazione

La modifica della destinazione si definisce con l'obiettivo DNAT, che può intervenire nel punto PREROUTING, oppure nei pacchetti generati localmente. Questo tipo di sostituzione serve per dirottare i pacchetti, per qualche motivo.

Figura 350.7. Il NAT/PAT trasferisce le connessioni dirette a 123.122.121.120:80 a 192.168.7.7:80.

NAT

La figura 350.7 mostra una situazione in cui viene collocato un servente HTTP in una rete locale con indirizzi privati, mentre si vuole fare in modo che all'esterno appaia collocato all'interno del router che svolge il ruolo di NAT. Per realizzare in pratica questa cosa, si può usare il comando seguente:

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
  \         -j DNAT --to-destination 192.168.7.7
[Invio]

iptables -t nat -L PREROUTING[Invio]

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere           tcp \
  \dpt:www to:192.168.1.7

Come si può vedere dall'esempio, l'obiettivo di trasformazione DNAT implica l'uso di un'opzione aggiuntiva:

--to-destination indirizzo_ip[-indirizzo_finale][:porta_iniziale-porta_finale]
--to indirizzo_ip[-indirizzo_finale][:porta_iniziale-porta_finale]

Come si intende dal modello sintattico, è possibile aggiungere l'indicazione di un intervallo di porte da utilizzare per la trasformazione. In generale, non mettendo questa informazione, la trasformazione delle porte avviene in modo corretto.

Nelle situazioni più comuni, modificando la destinazione si indica un solo indirizzo ed eventualmente una sola porta.

Un'altra situazione tipica è quella rappresentata dall'esigenza di ridirigere il traffico diretto a una certa porta, verso una porta differente di un certo nodo, nel quale esiste probabilmente una cache proxy (che ovviamente deve essere configurato correttamente per gestire tale situazione).

Figura 350.9. Realizzazione di un proxy trasparente per una rete locale.

proxy trasparente

Supponendo di gestire una rete locale simile a quella che si vede nella figura 350.9, si vuole fare in modo che tutte le richieste di accesso a servizi HTTP, da parte della rete locale, siano dirottati verso il proxy, collocato nello stesso elaboratore che ospita il NAT, alla porta 8 080 (si parla in questo caso di proxy trasparente).

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 \
  \         -j DNAT --to-destination 192.168.1.1:8080
[Invio]

In questo caso particolare, dal momento che si vuole intervenire nello stesso elaboratore che ospita sia il NAT che il servizio proxy, è possibile utilizzare l'obiettivo speciale REDIRECT, che richiede l'indicazione dell'opzione --to-port:

--to-port porta
--to porta

L'esempio precedente potrebbe quindi essere semplificato nel modo seguente:

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 \
  \         -j REDIRECT --to-port 8080
[Invio]

iptables -t nat -L PREROUTING[Invio]

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             anywhere           tcp \
  \dpt:www redir ports 8080

Il cambiamento della destinazione per quanto riguarda i pacchetti generati dalle applicazioni locali (interne al NAT), funziona nello stesso modo, ma è meno probabile la necessità di intervenire in questo modo.

350.4.1   Sistemazione del programma che funge da proxy

Perché il proxy trasparente funzioni non è sufficiente il dirottamento dei pacchetti attraverso IPTables, anche il programma che gestisce il proxy deve poi essere in grado di gestire la cosa.

Attualmente, se si utilizza Apache non dovrebbe essere necessaria alcuna modifica nella sua configurazione, mentre nel caso di Squid vanno inserite le direttive seguenti nel file /etc/squid.conf.

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

350.5   Altri programmi affini

350.6   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) netstat-nat   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome kernel_linux_2_4_e_2_6_nat_pat.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!