Una cache di questo tipo combina in un unico apparato sia il webcaching che le tecniche di routing e/o di bridging, questo apparato può essere configurato con due o più interfaccie di rete, il classico esempio di inline cache è una macchina UNIX® sulla quale viene eseguito Squid, questo tipo di device viene posizionato sul percorso di rete per consentirgli di catturare il traffico HTTP e ridirezionarlo verso Squid. Non sono molti gli apparati dedicati disegnati per svolgere questo compito perchè una inline cache può rappresentare un single point of failure. Molti produttori infatti raccomandano di utilizzare sistemi sviluppati da terze parti come gli switch di livello quattro che garantiscono un maggior livello di disponibilità del servizio. Possiamo progettare una inline cache a basso costo utilizzando dei semplici PC che vengono equipaggiati con GNU Linux o FreeBSD e Squid proxy server. Qualsiasi sistema UNIX® è in grado di eseguire il routing tra diverse interfaccie di rete così come la ridizione del traffico, ma se Squid va in errore ne risentirà tutto il traffico web che attraversa quel percorso della rete.
In dettaglio possiamo affermare che il transparent proxying è un termine piuttosto comune che descrive una metodologia con la quale si posiziona un gateway tra la zona militarizzata (MZ) e la rete degli utenti o zona militarizzata di secondo livello (MZ-L2) per controllare, filtrare e redirezionare il traffico HTTP.

configurare l'applicazione che esegue il filtro dei pacchetti
configurare Squid
mostriamo ora uno schema esplicativo con il quale illustreremo il funzionamento switch di livello sette

E' necessario configurare l'applicazione che esegue il filtro dei pacchetti IP per accettare il traffico proveniente da qualsiasi indirizzo e diretto verso la porta 80 e redigerlo verso la porta dove è in ascolto l'applicazione di cache (nel nostro caso la 3128). Per effettuare questa attività sono necessarie delle applicazioni che consentono di gestire funzionalità avanzate come ipfiltering e ipforwarding. In genere, questo tipo di applicazioni vengono fornite con il Kernel del sistema operativo. Facciamo ora una piccola panoramica dei sistemi GNU Linux o dei sistemi BSD e UNIX® che consentono di gestire la tecnica del proxy trasparente in maniera efficiente.
Prima di analizzare le varie applicazioni che eseguono il filtraggio dei pacchetti e di mostrare una serie di esempi pratici, si rammenta al lettore che alcune delle soluzioni proposte in questo capitolo sono state testate con
FreeBSD 4.9-STABLE, squid-2.5STABLE5 ed ipfw(8) per eseguire il filtraggio dei pacchetti
Linux Red Hat 7.1, Kernel 2.4.20, Squid 2.3.STABLE4 ed ipchains(8) per eseguire il filtraggio dei pacchetti.
Come sappiamo GNU Linux è un Kernel che utilizza diverse applicazioni per il filtraggio dei pacchetti che sono in stretta relazione con il tipo di Kernel utilizzato, le applicazioni più importanti sono
iptables (netfilter) con il Kernel 2.4.x e 2.6.x
ipchains con il Kernel 2.2.x e 2.4.x
ipfwadm con il Kernel 2.0.x
I sistemi BSD ed i sistemi UNIX® utilizzano approcci differenti per eseguire il filtraggio dei pacchetti
FreeBSD utilizza ipfw(8) e natd(8)
gli altri sistemi BSD e UNIX® utilizzano ipf(8) congiuntamente con ipnat(8)
per abilitare la funzionalità di proxy trasparente è necessario compilare (o ricompilare) il Kernel o aggiungere dei moduli che possono essere caricati dinamicamente. Ora vediamo come procedere per configurare un gateway FreeBSD con le funzionalità di proxy trasparente, la FAQ è di Stefano Tagliaferri.
La prima operazione da eseguire sarà quella di ricompilare il Kernel di FreeBSD utilizzando le opzioni IPFIREWALL, IPFIREWALL_FORWARD ed IPDIVERT
# kernel firewalling support
options IPFIREWALL # firewall
options IPFIREWALL_VERBOSE # abilita il logging
options IPFIREWALL_FORWARD # enable t. proxy support
options IPDIVERT # divert sockets
|
ora utilizzeremo l'ipfw(8) per eseguire il forward dei pacchetti diretti verso la porta 80 direttamente sulla porta 3128 della macchina FreeBSD dove Squid è in ascolto. La regola che dovremo applicare utilizzando il comando ipfw(8) è la seguente
% ipfw add fwd 192.168.0.254,3128 tcp from 192.168.0.0/24 to any www
|
per attivare le funzionalità di proxy trasparente dovremmo abilitare le funzionalità di firewalling ed il demone natd(8) di FreeBSD aggiungendo le seguenti linee al file di init /etc/rc.conf
firewall_enable="YES"
firewall_type="/usr/local/etc/ipfw.rules"
natd_enable="YES"
natd_interface="xl0"
natd_flags="-f /etc/natd.conf"
|
procederemo con la creazione del file /etc/natd.conf con il quale definiremo la configurazione del demone natd(8), nel nostro esempio trattiamo un sistema con una duplice interfaccia di rete (dual-homed host), dove l'interfaccia xl0 fa parte della rete pubblica internet (outside) mentre l'interfaccia rl0 fa parte di una rete privata (inside). L'interfaccia pubblica (outside) è quella che traduce gli indirizzi e le porte eseguendo il NAT (Network Address Translation) o il PAT (Port Address Translation). Per definire le regole che verranno utilizzate dal demone natd(8) e per dare corso alla traduzione degli indirizzi e delle porte, dovremo necessariamente creare un file di configurazione del natd(8) /etc/natd.conf
interface xl0
use_sockets yes
same_ports yes
|
in questo file viene definita l'interfaccia di rete che eseguirà il NAT (outside), le istruzioni use_socket yes e same_ports yes sono fondamentali per il corretto funzionamento di alcuni protocolli applicativi (livello sette) come l'FTP (File Transfer Protocol) e l'IRC (Internet relay chat). Ora dovremmo anche creare il file /usr/local/etc/ipfw.rules il cui contenuto dovrà essere adattato ad una macchina che opera da gateway tra la LAN (local area network) e la WAN (rete pubblica) abilitando il demone natd(8)
## ipfw - regole natd e transparent proxy
# xl0 - interfaccia sulla rete WAN (esegue il NAT)
# rl0 - interfaccia sulla rete LAN
#
add fwd 192.168.0.254,3128 tcp from 192.168.0.0/24 to any www
add divert natd all from any to any via xl0
add pass all from any to any via rl0
add pass all from any to any via xl0
|
192.168.0.254 è l'indirizzo IP della macchina che esegue Squid, rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di ipfw(8)
L'autore di IPFilter è Darren Reed. IPFilter è una applicazione open source che è stata portata su diversi sistemi operativi UNIX®, tra i più importanti possiamo citare FreeBSD, NetBSD, OpenBSD, BSD/OS, GNU Linux, Irix, SunOS, Solaris e Solaris-x86. In questo caso di studio abbiamo utilizzato una macchina FreeBSD
Per utilizzare ipf(8) (http://coombs.anu.edu.au/ipfilter/) dovremmo compilare (o ricompilare) il Kernel abilitando le opzioni IPFILTER e IPFILTER_LOG
# abilita il supporto ipfilter nel Kernel
options IPFILTER
options IPFILTER_LOG
|
per utilizzare le funzionalità di proxy trasparente con ipfilter è necessario compilare Squid con la seguente opzione di configurazione
% ./configure --enable-ipf-transparent
|
dopo aver compilato (o ricompilato) Squid, dovremmo creare un file denominato /etc/ipf.rules, questo deve contenere le seguenti linee
% pass in all
|
a questo punto creeremo un nuovo file dal nome /etc/ipnat.rules, questo deve contenere le seguenti linee
# rl0 è in nome dell'interfaccia di rete
rdr rl0 0.0.0.0/0 port 80 -> 192.168.0.254 port 3128 tcp
|
192.168.0.254 è l'indirizzo IP della macchina che esegue Squid, ora posizioniamoci nella directory /usr/local/etc/rc.d per creare uno script che sia in grado di inizializzare le regole di firewalling che abbiamo appena definito
% ee ipfilter.sh
#!/bin/sh
ipf -Fa -E -f /etc/ipf.rules
ipnat -CF -f /etc/ipnat.rules
% chmod 755 ipfilter.sh
|
dopo aver impostato il modo del file a 755 (esecuzione) potremmo finalmente riavviare la macchina che al successivo reboot sarà pronta per funzionare come proxy trasparente. Rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di ipf(8).
In questa sezione possiamo analizzare alcuni esempi di configurazioni con GNU Linux , in particolare la tecnica del proxy trasparente utilizza un software che esegue il filtraggio dei pacchetti ed in alcuni casi la tecnica del Network Address Translation.
Questa FAQ è stata realizzata da Rodney van den Oever.
E' necessario compilare il Kernel con il supporto per il firewalling e la ridirezione dei pacchetti, è necessario impostare dei parametri importanti in /usr/src/linux/.config
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
#
# Networking options
#
CONFIG_FIREWALL=y
# CONFIG_NET_ALIAS is not set
CONFIG_INET=y
CONFIG_IP_FORWARD=y
# CONFIG_IP_MULTICAST is not set
CONFIG_IP_FIREWALL=y
# CONFIG_IP_FIREWALL_VERBOSE is not set
CONFIG_IP_MASQUERADE=y
CONFIG_IP_TRANSPARENT_PROXY=y
CONFIG_IP_ALWAYS_DEFRAG=y
# CONFIG_IP_ACCT is not set
CONFIG_IP_ROUTER=y
|
è anche necessario abilitare l'opzione di IP Forwarding, un sistema per attivare questa funzionalità è quello di inserire una linea simile alla seguente negli script di init del sistema
% echo 1 > /proc/sys/net/ipv4/ip_forward
|
a questo punto procuriamoci il software ipfwadm(8), per garantire il corretto funzionamento del sistema di filtraggio dei pacchetti è necessaria la versione 2.3.0. Con ipfwadm(8) è possibile ridirezionare il traffico verso Squid utilizzando il seguente comando
% ipfwadm -I -a acc -P tcp -D default/0 80 -r 3128
|
rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di ipfwadm(8).
FAQ scritta da Martin Lyons.
E' necessario configurare il Kernel per utilizzare ipchains(8), la prima cosa da fare è quella di posizionarsi nella directory contenente i sorgenti di GNU Linux
% cd /usr/src/linux
% make menuconfig
|
queste sono le opzioni più importanti da includere nella configurazione del Kernel
[*] Network firewalls
[ ] Socket Filtering
[*] Unix domain sockets
[*] TCP/IP networking
[ ] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
[*] IP: firewalling
[ ] IP: firewall packet netlink device
[*] IP: always defragment (required for masquerading)
[*] IP: transparent proxy support
|
Il Kernel deve essere compilato con il supporto per il firewalling e devono essere inoltre abilitate le funzionalità di always defragment che sono necessarie alla politica di masquerading, compileremo inoltre il supporto per il transparent proxy. E' necessario abilitare la funzionalità di ipforwarding ed installare il pacchetto software ipchains(8). Il comando da utilizzare per ridirezionare il traffico verso Squid è il seguente
% ipchains -A input -p tcp -s 0/0 -d 0/0 80 -j REDIRECT 3128
|
la regola -A input appende delle regole di entrata, l'opzione -p tcp esprime una corrispondenza con il protocollo TCP, le opzioni -s e -d specificano l'indirizzo sorgente e quello di destinazione, utilizzando l'opzione 0/0 si esprime la corrispondenza con qualsiasi indirizzo IP. Rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di ipchains(8).
FAQ di Daniel Kiracofe, Il documento di riferimento è: Transparent Proxy with Linux and Squid mini-HOWTO disponibile alla URLs http://www.linuxdoc.org/HOWTO/mini/TransparentProxy.html.
Il Kernel deve essere compilato con i seguenti prerequisiti
Networking support
Sysctl support
Network packet filtering
TCP/IP networking
Connection tracking (Under ``IP: Netfilter Configuration'' in menuconfig)
IP tables support
Full NAT
REDIRECT target support
/proc filesystem support
l'opzione "Fast switching" deve essere disabilitata ed inoltre dovremmo abilitare la funzionalità del packet forwarding negli script di init
% echo 1 > /proc/sys/net/ipv4/ip_forward
|
per un corretto funzionamento del proxy trasparente è necessario il pacchetto software iptables(8), il comando da utilizzare per configurare l'applicazione che filtra i pacchetti e ridirezionare il traffico www verso Squid è il seguente
% iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
|
rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di iptables(8), maggiori dettagli sono reperibili alla URL http://www.squid-cache.org/Doc/FAQ/FAQ-17.html#ss17.4.
Dopo aver configurato l'applicazione che esegue il filtraggio dei pacchetti vediamo come definire correttamente la configurazione di Squid per eseguire in maniera efficente la tecnica del proxy trasparente. Di seguito mostriamo il TAG da inserire nel file /etc/squid/squid.conf
http_port 3128 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on |
naturalmente le regole impostate sino ad ora consentiranno solo l'inoltro del traffico dei pacchetti IP diretti verso la sola porta 80. Nel caso ci si trovi in una LAN/WAN di medie o di grandi dimensioni è ipotizzabile supporre la necessità di lasciar passare anche altri pacchetti IP. Per rendere possibile questo inoltro si utilizzano le funzionalità offerte dal NAT (Network Address Translation), queste funzioni in ambiente Linux vengono supportate in parte dall'ipmasquerade mentre con i sistemi BSD si utilizza natd(8) e ipnat(8).
Dopo aver mostrato come configurare i diversi Kernel di Linux siamo finalmente in grado di mostrare un esempio di tecnica di mascheramento che consentirà il passaggio dei pacchetti di qualsiasi tipo verso la subnet 192.168.1.0/24, rete sulla quale abbiamo attestato la rete dei server (MZ)
% ipchains -P forward DENY ipchains -A forward -p all -s 192.168.1.0/24 -d 0/0 -j MASQ |
gli indirizzi sorgenti che vengono identificati dall'opzione -s, vengono mascherati ricorrendo alla tecnica del Network Address Translation. Nell'esempio successivo mostriamo come eseguire la tecnica del mascheramento consentendo il passaggio di alcuni pacchetti TCP relativi ad alcune applicazioni di livello sette come ssh, telnet, ftp, smtp, pop3 ed https verso la subnet 192.168.2.0/24, rete sulla quale abbiamo attestato gli utenti finale(MZ-L2), la regola finale eseguirà il forward dei pacchetti dalla porta 80 alla 3128.
% ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport ssh -j MASQ % ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport telnet -j MASQ % ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport ftp -j MASQ % ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport smtp -j MASQ % ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport 110 -j MASQ % ipchains -A forward -p tcp -s 192.168.2.0/24 -d 0/0 --dport 443 -j MASQ % ipchains -A input -p tcp -s 0/0 -d 0/0 80 -j REDIRECT 3128 |
gli indirizzi sorgente che vengono identificati dall'opzione -s, vengono mascherati ricorrendo alla tecnica del Network Address Translation, i pacchetti tcp provenienti da qualsiasi indirizzo sorgente e diretti verso qualsiasi indirizzo di destinazione (0/0) vengono ridirezionati dalla porta 80 alla porta 3128. Ora rendiamo operativo Squid modificando il file /etc/squid/squid.conf
http_port 3128 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on |
rammentiamo al lettore che questo esempio non garantisce alcuna misura di sicurezza per la rete interna, per configurare correttamente il firewall è necessario consultare la man page di ipchains(8)