[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

182. Mascheramento IP e proxy trasparente secondo la gestione del kernel Linux 2.2.*

Il kernel Linux 2.2.*, assieme alla gestione del filtro dei pacchetti IP, può occuparsi anche del mascheramento IP e della gestione del proxy trasparente, cosa che consente di collegare all'esterno una rete privata con indirizzi IP esclusi dalla rete pubblica.

182.1 Mascheramento IP

Attraverso il mascheramento IP si fa in modo di mostrare all'esterno che l'origine delle connessioni è sempre il nodo che esegue questo compito, anche quando in realtà si tratta di un nodo interno alla rete privata. Naturalmente, il nodo che esegue il mascheramento è poi in grado di distinguere quali siano stati i nodi mascherati che hanno originato la connessione, girando a loro i pacchetti di loro competenza.

			+---------------+
			|   filtro di   |          Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica		|      IP       |	|           |
(Internet)		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 182.1: Mascheramento IP.

In linea di principio, i nodi collocati nella rete privata mascherata, sono in grado di accedere all'esterno, per mezzo del filtro di mascheramento degli indirizzi, mentre dall'esterno potrebbe mancare l'instradamento verso tali nodi. In effetti, quando la rete privata mascherata utilizza indirizzi IP esclusi dalla rete pubblica, tale instradamento (dall'esterno verso l'interno) non può esistere.

L'attivazione nel kernel delle funzionalità di mascheramento richiede prima di tutto che siano state attivate quelle di firewall, e quelle di ricomposizione dei pacchetti frammentati (nello stesso modo già visto nella sezioni dedicate al filtro di pacchetto IP), dove in particolare sia stata poi aggiunta anche quella di mascheramento.

182.1.1 ipchains per l'amministrazione del mascheramento

Attualmente (con i kernel 2.2.*), la gestione del mascheramento IP del kernel è un'estensione di quella del filtro di pacchetto IP, e deve essere attivata espressamente attraverso ipchains, utilizzando il filtro di inoltro, forward, assieme a una politica di accettazione (ACCEPT) con l'aggiunta dell'indicazione che si tratta di mascheramento per mezzo dell'obbiettivo MASQ. La cosa si può rappresentare schematicamente attraverso il modello seguente che comunque potrebbe essere esteso o precisato meglio.

ipchains -A|-I forward -s <indirizzi-da-mascherare> -d 0/0 -j MASQ

Ricapitolando quindi, il mascheramento si ottiene definendo una regola nel filtro di inoltro, in cui sia stato attivato il mascheramento dell'origine nei confronti della destinazione.

182.1.2 Mascheramento in pratica

In generale, il mascheramento IP si utilizza per consentire a una rete privata, che utilizza indirizzi IP esclusi da Internet, di accedere all'esterno. In questa situazione potrebbe essere sensata ugualmente una strategia di difesa attraverso le funzionalità di filtro già discusse nelle sezioni dedicate a questo argomento, perché dall'esterno, qualcuno potrebbe creare un proprio instradamento verso la rete privata.

In ogni caso, la situazione comune per il mascheramento IP è quella dello schema che appare in figura 182.2. L'interfaccia di rete del nodo di mascheramento connessa alla rete privata (eth0) deve avere un indirizzo IP che appartenga a tale spazio, e inoltre deve essere stato previsto un instradamento corretto. L'altra interfaccia, quella rivolta verso la rete pubblica (ppp0), avrà un indirizzo IP pubblico, e l'instradamento dovrà essere quello predefinito.

			+---------------+          192.168.1.0
		   ppp0 |               | eth0     Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica		|      IP       |	|           |
(Internet)		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 182.2: Esempio di mascheramento di una rete privata.

In questa situazione, la regola che consente alla rete privata di raggiungere l'esterno può essere definita con uno dei due comandi seguenti: il primo è un esempio approssimativo, mentre il secondo fa un riferimento esplicito agli indirizzi esterni in modo che non coincidano con quelli interni.

/sbin/ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

/sbin/ipchains -A forward -s 192.168.1.0/24 -d ! 192.168.1.0/24  -j MASQ

Visualizzando la regola attraverso ipchains -L forward -n, si ottiene una tra le due informazioni seguenti (a seconda del comando prescelto).

Chain forward (policy ACCEPT):
target     prot opt     source                destination           ports
MASQ       all  ------  192.168.0.0/16        0.0.0.0/0             n/a

Chain forward (policy ACCEPT):
target     prot opt     source                destination           ports
MASQ       all  ------  192.168.0.0/16       !192.168.0.0/16        n/a

Si è accennato al fatto che non si può escludere che qualcuno voglia provare a definire un proprio instradamento verso la rete privata che in condizioni normali dovrebbe essere irraggiungibile dall'esterno. Per questo, conviene escludere esplicitamente il traffico nella direzione opposta, oppure semplicemente definire che la politica predefinita del firewall deve essere DENY.

#!/bin/sh
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

182.2 Proxy trasparente

Il proxy trasparente, o transparent proxy, è una funzionalità attraverso la quale si fa in modo di ridirigere il traffico (TCP) verso un servizio proxy del nodo locale, quando altrimenti sarebbe diretto verso altri nodi, a porte determinate.

Il kernel Linux fornisce questa funzionalità come estensione di quelle di filtro dei pacchetti IP; ma per farlo deve essere aggiunta esplicitamente la gestione di questa caratteristica.

Naturalmente, per attivare un sistema di proxy trasparente occorre il proxy. In effetti, il vantaggio di usare questo sistema al posto del mascheramento IP sta proprio nell'inserzione di un proxy, possibilmente di una cache proxy, per ridurre il traffico nella connessione con la rete pubblica. In questo modo, il software utilizzato nei nodi della rete privata non ha bisogno di essere configurato per inviare tutte le sue richieste al proxy, ma quando i pacchetti tentano di raggiungere l'esterno, allora vengono presi in considerazione da questo.

182.2.1 ipchains per il proxy trasparente

La ridirezione attraverso cui si ottiene il proxy trasparente si definisce esclusivamente per mezzo del filtro di ingresso, input, specificando una porta di ridirezione con l'obbiettivo REDIRECT. Considerato che il proxy trasparente viene usato normalmente solo per il protocollo TCP, la sintassi di ipchains per questo scopo si traduce nello schema seguente:

ipchains -A|-I input -p tcp -s <origine> -d <destinazione> <porte> -j REDIRECT <porta-locale>

Quello che si ottiene è che il traffico proveniente dagli indirizzi previsti, diretto verso le destinazioni indicate, complete dell'informazione sulle porte, viene ridiretto alla porta specificata dopo l'obbiettivo REDIRECT nel nodo locale.

182.2.2 Proxy trasparente in pratica

Un proxy trasparente può funzionare solo se il traffico relativo deve attraversarlo per forza. Pertanto, si può attivare questa funzionalità solo in un router, che eventualmente può fungere sia da firewall che da proxy trasparente. Di conseguenza, il proxy per il quale il servizio viene avviato, deve risiedere fisicamente nello stesso elaboratore che svolge il ruolo di router o di firewall.

			+---------------+
			|     Proxy     |          Rete privata mascherata
- - - ------------------|  trasparente  |-------*-----------*-------- - - -
Rete esterna 		|               |	|           |
        		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 182.3: Il proxy trasparente deve essere attraversato dal traffico che poi lì può essere ridiretto verso il proxy locale.

Lo scopo del proxy trasparente può essere semplicemente quello di «obbligare» a utilizzare una cache proxy, senza importunare gli utenti pretendendo da loro che configurino gli applicativi per questo, oppure può essere il modo attraverso cui si definisce un firewall proxy, impedendo l'attraversamento del proxy per mezzo del filtro di pacchetto IP.

A titolo di esempio viene mostrato in che modo si potrebbe ridirigere il traffico di una rete locale con indirizzi 192.168.1.0/24, quando questo è rivolto alla porta 80, cioè a un servizio HTTP, verso la porta locale 8080 (tipica di una cache proxy).

/sbin/ipchains -A input -p tcp \
	-s 192.168.1.0/24 -d ! 192.168.1.0/24 80 -j REDIRECT 8080

Come si può intendere, il comando è stato suddiviso su due righe per motivi tipografici. Visualizzando la regola attraverso ipchains -L input, si ottiene l'informazione seguente:

Chain input (policy ACCEPT):
target     prot opt     source          destination      ports
REDIRECT   tcp  ------  192.168.0.0/24  !192.168.0.0/24  any ->   80 => 8080

Naturalmente, il proxy trasparente può essere combinato anche con il mascheramento IP, per cui, dato l'esempio già visto, si potrebbe anche aggiungere l'istruzione seguente:

/sbin/ipchains -A forward -s 192.168.0.0/24 -d ! 192.168.0.0/24  -j MASQ

182.2.3 Sistemazione del programma che funge da proxy

Perché il proxy trasparente funzioni non è sufficiente il dirottamento dei pacchetti attraverso ipchains, perché 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

182.3 Riferimenti

---------------------------

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


1.) Nel momento in cui si vuole realizzare il proxy trasparente, si intende implicitamente che tutto il traffico debba passare per il proxy, di conseguenza ha senso imporre la ricomposizione dei pacchetti frammentati.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]