16.2. Concetto di inline cache

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.

La rete IP pubblica è la rete di proprietà dell'ISP (Internet Service Provider), il router è la porta di accesso che delimita la rete pubblica dal nostro segmento di rete pubblico. Nella DMZ vengono mappati gli indirizzi pubblici, nella MZ gli indirizzi IP sono quelli riservati alle reti private. Con questo sistema tutti gli accessi di tipo www verranno convogliati al gateway, il Transparent Proxy funziona unicamente per le richieste di tipo HTTP. E' possibile paragonare la tecnica del transparent proxy ad uno switch di livello sette. Si tratta in effetti di una apparecchiatura molto sofisticata che opera al livello sette del modello OSI, quindi lavora sullo strato delle applicazioni. Per operare correttamente questo tipo di apparati hanno la necessità di tradurre gli indirizzi internet e di interpretare il traffico IP. Il protocollo di trasporto TCP opera però sul quarto livello del modello OSI. Uno switch di livello sette fornisce le stesse opzioni che uno switch di livello quattro offre solo addizionalmente. Nel caso della tecnica del transparent proxy, Squid si istalla su una macchina che opera da gateway, questo tipo di configurazione viene utilizzata nelle grandi LAN/WAN dove il numero dei PC client è molto elevato. I pacchetti inviati dai PC client che fanno richiesta del protocollo HTTP vengono ridirezionati dal gateway o dallo switch di livello quattro, che nel caso specifico è appunto incluso nella nostra macchina Linux o nel nostro sistema BSD dove viene eseguito Squid. Il processo di ridirezione dei pacchetti non viene effettuato direttamente dal proxy server ma viene processato da una applicazione che si occupa di gestire le regole del traffico IP, questo tipo di applicativo consente di filtrare e manipolare i pacchetti. Quando il Kernel del sistema operativo riceve i pacchetti diretti verso la porta 80 verifica le regole di ridirezione ed aggiusta il pacchetto ricevuto cambiandone la porta di destinazione. Se Squid è in ascolto sulla porta 3128 il traffico IP verrà intercettato e rediretto verso la porta 3128 dove normalmente rimane in ascolto Squid. Per effettuare il setup del proxy trasparente è necessario effettuare due attività

  1. configurare l'applicazione che esegue il filtro dei pacchetti

  2. configurare Squid

mostriamo ora uno schema esplicativo con il quale illustreremo il funzionamento switch di livello sette

tutte le richieste provenienti dalla rete mz-l2 e dirette verso la porta 80 dei sistemi che sono oltre il segmento di rete mz, verranno manipolate dalla applicazione che esegue il filtro dei pacchetti e che lavora sia a livello tre che a livello quattro della pila OSI, questi pacchetti vengono ridirezionati ed inviati alla porta 3128 dove normalmente rimane in ascolto Squid che lavora invece al livello sette, ovvero al livello delle applicazioni della pila OSI.

16.2.1. L'applicazione che esegue il filtro dei pacchetti

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.

16.2.2. Alcune annotazioni

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

16.2.3. Filtraggio con GNU Linux

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

16.2.4. Filtraggio con FreeBSD

I sistemi BSD ed i sistemi UNIX® utilizzano approcci differenti per eseguire il filtraggio dei pacchetti

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.

16.2.4.1. utilizziamo ipfw

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)

16.2.5. Filtraggio con altri sistemi UNIX®

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

16.2.5.1. utilizziamo ipf

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

16.2.6. Esempi di inline cache con Linux

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.

16.2.6.1. Configurare il proxy trasparente con Linux kernel 2.0.x

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

16.2.6.2. Configurare il proxy trasparente con Linux kernel 2.2.x

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

16.2.6.3. Configurare il proxy trasparente con Linux kernel 2.4.x e 2.6.x

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.

16.2.7. Abilitare inline cache con Squid

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

16.2.8. L'ipmasquerade con LINUX kernel 2.2.x/2.4.x

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)