[>a2290.html>] [<a2288.html<] [^a2.html^]
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.
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 223.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, assieme a 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.
Attualmente (con i kernel 2.2.*), la gestione del mascheramento IP del kernel è un'estensione di quella del filtro di pacchetto IP, che 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'obiettivo 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.
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 223.2. L'interfaccia di rete del nodo di mascheramento connessa alla rete privata (eth0) deve avere un indirizzo IP che appartenga a tale spazio; inoltre deve essere stato previsto un instradamento corretto. L'altra interfaccia, quella rivolta verso la rete pubblica (ppp0), avrà un indirizzo IP pubblico, mentre l'instradamento dovrà essere quello predefinito.
.---------------. 192.168.1.0 ppp0 | | eth0 Rete privata mascherata - - - ------------------| mascheramento |-------*-----------*-------- - - - Rete pubblica | IP | | | (Internet) `---------------' .--------. .--------. | host | | host | `--------' `--------' Figura 223.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
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.
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'obiettivo 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'obiettivo REDIRECT nel nodo locale.
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 223.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
Perché il proxy trasparente funzioni non è sufficiente il dirottamento dei pacchetti attraverso ipchains, 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
Paul Russell, Linux IPCHAINS-HOWTO
Terry Dawson, Linux NET-3-HOWTO, Linux Networking
Mark Grennan, Firewalling and Proxy Server HOWTO
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.