16.4. WCCP (Web Cache Coordination Protocol)

Si tratta di un protocollo di incapsulamento che è stato sviluppato dalla Cisco Systems e che viene implementato nei routers e negli switch di livello quattro. WCCPv1 viene supportato da diversi vendors e viene incluso come componente di serie in tutti i sistemi di webcache come Squid. Esistono due versioni del protocollo WCCP che è un protocollo aperto e viene documentato dalla RFC 3040 (http://www.faqs.org/rfcs/rfc3040.html). Per utilizzare questo protocollo è comunque richiesta la licenza di utilizzo dalla Cisco Systems. Il protocollo WCCP si compone di due parti, il protocollo di controllo e la ridirezione del traffico, il protocollo di controllo utilizza tre tipi di messaggi

HERE_I_AM
I_SEE_YOU
ASSIGN_BUCKETS
  

l'applicazione di cache avvisa della sua presenza lanciando un messaggio I_SEE_YOU, il router e Squid continuano a scambiare messaggi periodicamente per verificare il loro livello di interconnessione, grazie a questo sistema il router riconosce lo stato operativo di Squid e può quindi eseguire la deviazione del traffico HTTP verso la device di webcache. WCCP non necessita che il proxy server sia connesso direttamente con il router perchè i pacchetti deviati vengono incapsulati con il protocollo GRE che è l'acronimo di Generic Routing Incapsulation - RFC 2784 (http://www.faqs.org/rfcs/rfc2784.html) ed il sistema operativo che esegue Squid deve essere in grado di interpretare i pacchetti GRE che riceverà dal router. Il protocollo WCCP è stato codificato per deviare solo i pacchetti TCP che vengono identificati con la porta di destinazione 80 (ovvero quella solitamente utilizzata dai server HTTP). I pacchetti incapsulati vengono inviati a Squid che esegue la decodifica del protocollo GRE per interpretare correttamente i pacchetti TCP. Il protocollo WCCP supporta inoltre il clustering degli apparati di webcache e le tecniche di load balancing: un router sul quale viene abilitato il protocollo WCCP è in grado di deviare il traffico verso diversi sistemi Squid. Grazie al messaggio I_SEE_YOU il router notifica alle webcache la presenza di altri apparati, la macchina Squid configurata con l'indirizzo IP più basso viene automaticamente designata come cache master. Il protocollo WCCP supporta la rilevazione dei guasti, Squid invia un messaggio del tipo HERE_I_AM ogni 10 secondi, se il router non riceve questo messaggio per una durata massima di 30 secondi marca come indisponibile (bad) la cache designata come master, la richiesta non verra dunque deviata verso la macchina Squid al momento indisponibile.

16.4.1. Configurare WCCP con Cisco IOS

WCCPv1 è supportato dal sistema operativo Cisco IOS nelle sue versioni a partire dalla 11.1(19) e successive, il protocollo WCCPv2 viene pienamente supportato dal sistema operativo Cisco IOS a partire dalla versione 12.0(4).

In questo esempio possiamo vedere la configurazione del protocollo WCCPv1 per il sistema operativo Cisco IOS 11.x

ip wccp enable
!
interface fastethernet0/0
ip wccp web-cache redirect
   

In questo esempio invece vediamo la configurazione più comune del protocollo WCCPv1 per il sistema operativo Cisco IOS 12.x

ip wccp version 1
ip wccp web-cache
!
interface fastethernet0/0
ip wccp web-cache redirect out
   

il sistema operativo Cisco IOS Release 12.2 consente di abilitare le funzionalità WCCPv1 o WCCPv2 utilizzando il comando ip wccp version. La configurazione automatica del protocollo WCCPv1 è stata sostituita, l'interfaccia del router utilizzata in questo esempio (fastethernet 0/0) può non essere adeguata alla Vostra installazione.

16.4.2. Configurare WCCP con Squid

Dopo aver configurato il router analizziamo i TAG che consentono di attivare il protocollo WCCPv1 con Squid, si rammenta che il protocollo WCCPv2 verrà implementato nelle future versioni di Squid (http://devel.squid-cache.org/projects.html#visolve_wccpv2)

wccp_router 192.168.1.254
wccp_version 4
   

il TAG wccp_router indica l'indirizzo IP del router sul quale è stato abilitato il protocollo WCCP, il TAG wccp_version identifica il tipo di versione. Il sistema operativo Cisco IOS 11.2 supporta unicamente la versione 3, Squid viene normalmente compilato con il supporto al protocollo WCCP abilitato, non dimentichiamo che, se si decide di utilizzare il protocollo WCCP, non sarà possibile abilitare alcun modello di autenticazione.

16.4.3. Abilitare l'interfaccia GRE con FreeBSD

Se si intende utilizzare il protocollo WCCP con FreeBSD sarà necessario compilare il Kernel del sistema operativo abilitando il supporto GRE. A partire dalla versione 4.7 di FreeBSD, l'istruzione che consentirà di abilitare il protocollo GRE nel file che definisce le impostazioni del Kernel (/usr/src/sys/i386/conf/GENERIC) sarà

pseudo-device   gre                     #IP over IP tunneling
   

a questo punto dovremmo configurare FreeBSD per stabilire un tunnel GRE tra il router e la macchina che esegue Squid

% ifconfig gre0 create
% ifconfig gre0 <Host-IP> <Router-IP> netmask 255.255.255.255 up
% ifconfig gre0 tunnel <Host-IP> <Router-IP>
% route delete <Router-IP>
   

dove <Host-IP> è l'indirizzo IP della macchina che esegue Squid e <Router-IP> è l'indirizzo IP del router che intercetta i pacchetti HTTP.

16.4.4. Abilitare l'interfaccia GRE con Linux

Il Kernel di Linux 2.2 supporta l'incapsulamento GRE soltanto se il modulo relativo verrà compilato nel Kernel. Per assicurarsi che il codice GRE sia stato compilato staticamente oppure come modulo dinamico del Kernel è possibile utilizzare il seguente comando

% modprobe ip_gre
   

le versioni 2.4 del kernel di linux vengono fornite con una pseudo interfaccia GRE ma questa non è comunque in grado di operare per eseguire la decodifica dei pacchetti GRE che vengono inviati durante una sessione WCCP. Il progetto Squid fornisce un modulo WCCP specifico per il kernel di Linux (http://www.squid-cache.org/WCCP-support/Linux/). Sarà necessario compilare questo file http://www.squid-cache.org/WCCP-support/Linux/ip_wccp.c come modulo del kernel di Linux posizionandolo nella directory dei sorgenti del kernel per poi eseguire il comando make modules. Il passo successivo è quello di caricare il modulo nella memoria del kernel utilizzando il comando insmod(8).

% insmod ip_wccp.o
   

il modulo ip_wccp accetta i pacchetti GRE/WCCP da qualsiasi indirizzo sorgente pertanto qualsiasi utente è in grado di inviare del traffico WCCP al nostro proxy, per proteggerci utilizzeremo il comando iptables(8)

% iptables -A INPUT -p gre -s 192.168.1.254 -j ACCEPT
% iptables -A INPUT -p gre -j DROP
   

dove l'indirizzo IP 192.168.1.254 è l'indirizzo del nostro router, potremmo salvare la nostra regola utilizzando il comando service

% service iptables save
   

a questo punto dovremmo configurare Linux per stabilire un tunnel GRE tra il router e la macchina che esegue Squid

% iptunnel add gre1 mode gre remote <Router-IP> local <Host-IP> dev <interface>
% ifconfig gre1 127.0.0.2 up
   

dove <Router-IP> è l'indirizzo IP del router che intercetta i pacchetti HTTP, <Host-IP> è l'indirizzo IP della cache e <interface> è il nome dell'interfaccia di rete che riceve questi pacchetti (molto probabilmente eth0).