[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 178.   Kernel Linux 2.4: 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.

178.1   Struttura e punti di intervento

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

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

                .--------------.             .--------------.
                |  PREROUTING  |             | POSTROUTING  |
Ingresso ------>|   NAT sulla  |    .------->|     NAT      |-----------> Uscita
                | destinazione |    |        | sull'origine |
                `--------------'    |        `--------------'
                       |            |
                       |            |
                       V            |
                 Instradamento------'
                       |   ^             .--------------.
                       |   |             |    OUTPUT    |
                       |   `-------------|   NAT sulla  |
                       |                 | destinazione |
                       V                 `--------------'
               Processi locali                  ^
                                                |
                                                |
                                        Processi locali

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.

178.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.

178.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 178.2. 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 178.2. Modifica degli indirizzi di origine.

                1.2.3.4 .---------------.
                1.2.3.5 |               |          Rete privata 192.168.1.*
- - - ------------------|     N A T     |-------*-----------*-------- - - -
Rete pubblica   1.2.3.6 |               |       |           |
(Internet)      1.2.3.7 `---------------'   .--------.  .--------.
                                            |  host  |  |  host  |
                                            `--------'  `--------'

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

iptables -t nat -L POSTROUTING

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 178.3. Mascheramento IP.

           Indirizzo IP .---------------.
             dinamico   |               |          Rete privata 192.168.1.*
- - - ------------------|     N A T     |-------*-----------*-------- - - -
Rete pubblica           |               |       |           |
(Internet)              `---------------'   .--------.  .--------.
                                            |  host  |  |  host  |
                                            `--------'  `--------'

Seguendo l'esempio della figura 178.3, 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

iptables -t nat -L POSTROUTING

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.

178.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 178.4. Il NAT/PAT trasferisce le connessioni dirette a 123.122.121.120:80 a 192.168.7.7:80.

                                .-------------.
Rete pubblica              eth0 |             |
------------------------------->|    N A T    |
            123.122.121.120:80  |             |
                                `-------------'
                                       |  ^
                    Rete locale  - - - |  | - - -
                                       |  |         .------------.
                                       |  `---------|  servente  |
                                       `----------->|    HTTP    |
                                    192.168.7.7:80  |   reale    |
                                                    `------------'

La figura 178.4 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

iptables -t nat -L PREROUTING

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere           tcp  (segue)
  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 178.5. Realizzazione di un proxy trasparente per una rete locale.

                        .---------------.
                   eth0 |     Proxy     | eth1      Rete privata 192.168.1.*
- - - ------------------|  trasparente  |----------------*-----------*- - - -
Rete esterna    1.2.3.4 |               | 192.168.1.1    |           |
                        `---------------'            .--------.  .--------.
                                                     |  host  |  |  host  |
                                                     `--------'  `--------'

Supponendo di gestire una rete locale simile a quella che si vede nella figura 178.5, 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

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

iptables -t nat -L PREROUTING

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             anywhere           tcp  (segue)
  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.

178.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 sono indispensabili le due direttive seguenti, che vanno collocate nel file /etc/squid.conf (vengono lasciati i commenti originali del sorgente di questo file).


# HTTPD-ACCELERATOR OPTIONS
#-----------------------------------------------------------------------------

#  TAG: httpd_accel
#       If you want to run squid as an httpd accelerator, define the
#       host name and port number where the real HTTP server is.
#
#       If you want virtual host support then specify the hostname
#       as "virtual".
#
httpd_accel virtual 80

#  TAG: httpd_accel_with_proxy
#       If you want to use squid as both a local httpd accelerator
#       and as a proxy, change this to 'on'.
#
httpd_accel_with_proxy on

178.5   Riferimenti

Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org

Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome kernel_linux_2_4_nat_pat.html

[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]