[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]

137. Cache proxy

Nella terminologia utilizzata per le reti, una cache proxy è un servizio di memoria tampone per le risorse della rete richieste più frequentemente. Con il termine ``risorsa'' si deve intendere un oggetto a cui si accede attraverso un URL.

L'utilizzo di un proxy offre due vantaggi principali: l'accesso rapido a risorse già accumulate nella cache e la riduzione del traffico nella rete che precede il proxy stesso.

137.1 Schema essenziale

Il servizio di cache proxy può essere collocato in posizioni differenti nella rete, a seconda delle esigenze o delle particolarità delle situazioni. Generalmente, lo scopo è quello di servire un segmento di rete, indifferentemente dal fatto che questo segmento utilizzi indirizzi privati o sia accessibile dall'esterno.

137.1.1 Servire un segmento di rete

Quando un proxy viene utilizzato per servire un segmento di rete rispetto alla rete esterna, e non vengono fatte altre considerazioni, è sufficiente che il computer su cui viene collocato il servizio sia accessibile da questo segmento di rete e che a sua volta sia in grado di accedere all'esterno.

Rete esterna <------------+
                          |
			  |            segmento di rete da servire
- - - +------------+------+-----+------------+---- - - -
      |            |            |            |
  +---+----+   +---+----+   +---+----+   +---+----+
  | client |   | client |   | client |   | SERVER |
  | proxy  |   | proxy  |   | proxy  |   | proxy  |
  +--------+   +--------+   +--------+   +--------+

Figura 137.1: In questa situazione, il server proxy è collegato come tutti gli altri computer al segmento di rete da servire.

A questa situazione appartiene anche il caso limite in cui il proxy serve solo se stesso, quindi la stessa macchina è server e anche client.

137.1.2 Proxy a più livelli

Un proxy potrebbe servirsi di altri proxy quando si tratta di accedere a determinate reti, alleggerendo in questo modo il carico della rete anche in altri punti, e non solo nel tratto immediatamente precedente.

Rete esterna <-------//---+
                    (A)   |
                          |        +--------+
			  |        | SERVER |
      +------------+      |        | proxy  |   +--------+
      |   SERVER   |      |        | locale |   | client | ...
      |   proxy    +------+        +---+----+   +---+----+
      | principale |      |  (B)       |            |                 
      +------------+      +---//-------+------------+------------------ - - -
		          |                                segmento di rete
			  |
                          // (C)
			  |
			  |            segmento di rete
- - - +------------+------+-----+------------+---- - - 
      |            |            |            |
  +---+----+   +---+----+   +---+----+   +---+----+
  | client |   | client |   | client |   | SERVER |
  +--------+   +--------+   +--------+   | proxy  |
                                         | locale |
                                         +--------+

Figura 137.2: Ogni collegamento ha un proprio proxy locale che però si avvale di un proxy principale prima di raggiungere la rete esterna.

La figura 137.2 mostra il caso di un collegamento a una rete esterna, (A), condiviso da due segmenti di rete, che si collegano a questa attraverso i collegamenti B e C. A valle del collegamento A si trova un proxy il cui scopo è quello di ridurre il più possibile il traffico attraverso quel tratto; a valle dei collegamenti B e C si trovano altri proxy locali il cui scopo è quello di ridurre il traffico attraverso i collegamenti rispettivi. In questa situazione, i proxy locali utilizzano a loro volta il server principale, e tutto quello che viene accumulato nei proxy locali, viene conservato anche in quello principale.

137.1.3 Proxy come filtro verso l'esterno

Il server proxy, se si trova in un computer che è connesso simultaneamente, attraverso interfacce di rete differenti, a una rete interna con indirizzi privati (cioè esclusi da Internet) e alla rete esterna, può essere utilizzato per permettere ai client della rete privata di avere accesso all'esterno attraverso il proxy stesso.

Questo accesso si limita ai protocolli gestiti dal proxy; spesso si tratta solo di HTTP e FTP.

Rete esterna <-------//---+
                          |
                    +-----+------+
                    |   SERVER   |
                    |   proxy    |
                    |   filtro   |
                    +-----+------+
		          |
			  |    rete con indirizzi IP privati
- - - +------------+------+-----+------------+---- - - -
      |            |            |            |
  +---+----+   +---+----+   +---+----+   +---+----+
  | client |   | client |   | client |   | client |
  +--------+   +--------+   +--------+   +--------+

Figura 137.3: Come caso estremo, il proxy può ricoprire anche un ruolo di filtro e inoltro di pacchetti tra una rete privata e la rete esterna.

137.2 Dal lato del client

I client come Netscape, vanno configurati per poter sfruttare il servizio di cache del proxy. Per prima cosa, se nella stessa macchina risiede il servizio proxy, conviene probabilmente annullare la cache interna al client stesso, quindi si può configurare il server proxy in modo manuale.


Figura 137.4: La configurazione del client Netscape per l'utilizzo della cache proxy. Si osservi il fatto che per usare la porta 8080 occorre che il server sia in ascolto sulla stessa.

Il proxy risponde alle richieste dei client attraverso una porta particolare, che dipende dalla configurazione del servizio. Apparentemente, ogni tipo di proxy ha una sua impostazione predefinita differente, mente la tendenza generale è quella di utilizzare la porta 8080. È necessario fare attenzione a questo particolare quando si configura il proxy, per non creare confusione inutile agli utenti del servizio.

Se si vuole usare il proxy nel modo indicato nella sezione 137.1.3, si possono usare solo programmi che prevedono espressamente la presenza di questo, e solo per i protocolli effettivamente serviti dal proxy stesso.

137.3 Apache

Il server HTTP Apache incorpora delle funzionalità di proxy elementare. In queste sezioni viene valutato solo ciò che è necessario fare per configurare il servizio attraverso il file httpd.conf (collocato normalmente nella directory /etc/httpd/conf/). Per il resto che riguarda Apache conviene consultare i capitoli 78 e 127.

137.3.1 Attivazione e collocazione

La configurazione predefinita di Apache non prevede la gestione del proxy. Di solito sono presenti alcune direttive di esempio, debitamente commentate, in modo da facilitare l'amministratore.

ProxyRequests {on|off}

La direttiva ProxyRequests permette di attivare o meno la gestione della cache proxy.

ProxyRequests on

CacheRoot <directory-cache>

La direttiva CacheRoot permette di definire la directory da utilizzare per contenere la cache. La directory in questione deve risultare accessibile in scrittura all'utente e gruppo specificati con le direttive User e Group (nella maggior parte dei casi si intende nobody).

CacheRoot /var/cache/httpd/proxy

137.3.2 Caratteristiche della cache

CacheSize <n-Kbyte>

La direttiva CacheSize specifica la dimensione in KB dello spazio su disco da utilizzare per la cache. Questo valore può essere superato, ma periodicamente viene eseguito un controllo con l'eliminazione dei file più vecchi che eccedono tale limite. L'esempio mostra la dichiarazione di una cache di 16MB.

CacheSize 16384

CacheGcInterval <n-ore>

In questo modo può essere definito l'intervallo tra una ripulitura e l'altra della cache, alla ricerca di file troppo vecchi e di quelli che eccedono il limite di dimensione stabilita. L'esempio mostra la dichiarazione di un intervallo di controllo orario (una sola ora).

CacheGcInterval 1

CacheMaxExpire <n-ore>

I documenti HTTP vengono conservati per un massimo di ore stabilito con questa direttiva. Superato tale tempo, alla richiesta di un client, viene fatta una verifica dall'origine. Questo limite di tempo è imposto anche se il documento originale indica una data di scadenza superiore. L'esempio mostra una scadenza massima di 24 ore. Aumentare questo tempo oltre le 24 ore, è generalmente poco opportuno.

CacheMaxExpire 24

CacheDefaultExpire <n-ore>

Quando il tipo di protocollo non prevede l'indicazione di una scadenza, si utilizza il tempo indicato attraverso la direttiva CacheDefaultExpire.

CacheLastModifiedFactor <fattore>

Questa direttiva definisce un ``fattore'' utilizzato per calcolare un tempo di scadenza quando il documento originale non lo fornisce. In pratica si applica la formula x=t*f, dove f è il fattore, t è il tempo trascorso dall'ultima modifica e x è il tempo di scadenza (il periodo di validità).

La logica sta nel fatto che è più probabile che una pagina venga modificata ancora entro breve tempo se la sua data di modifica è recente. Infatti, minore è il tempo trascorso dall'ultima modifica, minore sarà la durata di validità risultante dalla formula. L'esempio mostra un fattore di 0.1, pari al 10% del tempo trascorso dall'ultima modifica.

CacheLastModifiedFactor 0.1

137.3.3 Esclusione dalla cache

Ci sono situazioni in cui non è opportuno che il proxy accumuli nella sua memoria cache informazioni riferite a determinati domini o sottoreti. Di sicuro non è conveniente farlo per la propria rete locale, a meno che non ci siano delle buone ragioni.

NoCache <dominio>...

Per escludere alcuni host o domini interi dalla cache basta elencare i nomi, separati da uno spazio, con la direttiva NoCache.

NoCache roggen.brot.dg mehl.dg

L'esempio esclude dalla cache l'host roggen.brot.dg e il dominio mehl.dg.

137.3.4 In pratica

Per attivare effettivamente il servizio, oltre alla configurazione del file httpd.conf, occorre predisporre la directory utilizzata per la cache. Questa deve essere accessibile in scrittura da httpd, nelle condizioni in cui si trova normalmente, quando cioè ha solo i privilegi dell'utente nobody.

L'esempio seguente mostra le direttive del file httpd.conf per una configurazione tipica. Ciò che può valere la pena di modificare è la dimensione della memoria cache.

ProxyRequests On

CacheRoot /var/cache/httpd/proxy
CacheSize 16384
CacheGcInterval 1
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
Listen 80
Listen 8080

L'esempio mostra in particolare la direttiva Listen, usata per fare in modo che httpd stia in ascolto sia della porta 80 che della porta 8080, perché quest'ultima è quella convenzionalmente utilizzata dai client per interpellare un server proxy, e per mantenere la possibilità di accedere al servizio normale si lascia aperto anche l'ascolto della porta 80.

137.3.5 Protezione contro l'utilizzo indesiderato

In generale, un servizio proxy dovrebbe essere accessibile solo dalla rete (o sottorete) per la quale è stato attivato. Qualunque altro utente non ne potrebbe trarre vantaggio, e un utilizzo improprio servirebbe solo a intasare inutilmente il collegamento che invece si vuole alleggerire.

Per la protezione del servizio di cache proxy, si può utilizzare una sezione Directory nel file access.conf, come nell'esempio seguente.

<Directory proxy:*>
	order deny,allow
	deny from all
	allow from .brot.dg
</Directory>

In questo caso, si concede solo al dominio brot.dg di accedere.

137.4 Squid

Squid è un programma specifico per la gestione di un proxy e per questo anche molto potente. Il difetto di Squid è la carenza di documentazione; in pratica, tutte le indicazioni disponibili si trovano all'interno del file di configurazione, /etc/squid.conf, in forma di commenti.

137.4.1 Avvio

squid [<opzioni>]

Squid viene avviato normalmente attraverso la procedura di inizializzazione del sistema, in uno script, attraverso un comando che lo mette esplicitamente in background, per esempio come nel modo seguente.

squid &

Le prime volte, l'avvio di Squid può riservare delle sorprese. È importante sapere che all'avvio Squid tenta di risolvere l'indirizzo di alcuni host, attraverso il DNS. Nella maggior parte dei casi, se Squid viene avviato in una rete chiusa, il servizio non parte perché questa richiesta fallisce. Pertanto, se si avvia Squid quando si è isolati dall'esterno, occorre evitare che venga eseguito questo controllo, e per questo si utilizza l'opzione -D della riga di comando.

Le distribuzioni Linux che prevedono Squid tra i pacchetti standard, dovrebbero avere organizzato uno script per il suo avvio automatico attraverso la procedura di inizializzazione del sistema; come già accennato. Se si intende avviare Squid quando non è presente uno sbocco verso Internet, è necessario modificare tale script in modo da inserire l'opzione -D. Nel caso della distribuzione RedHat, questo script si trova nella directory /etc/rc.d/init.d/.

squid -D &

Per verificare che Squid funzioni correttamente, può essere sufficiente osservare l'albero dei processi attivi attraverso pstree. Si dovrebbe ottenere qualcosa come il pezzo seguente.

squid-+-5*[dnsserver]
      |-ftpget
      `-unlinkd

Come si può osservare, il binario squid pilota altri programmi che fanno parte dello stesso pacchetto.

Alcune opzioni

Le opzioni, quando si riferiscono a elementi che possono essere definiti attraverso il file di configurazione, prendono il sopravvento su questa.

-a <n-porta>

Permette di specificare il numero della porta attraverso la quale i client devono connettersi per accedere al servizio. Il valore predefinito, salvo altra indicazione nel file di configurazione, è 3128.

-f <file-di-configurazione>

Permette di definire un file di configurazione alternativo a /etc/squid.conf.

-k {reconfigure|rotate|shutdown|interrupt|kill|debug|check}

Permette di inviare un segnale al server Squid attivo. La parola chiave utilizzata come argomento dell'opzione determina l'effetto che si ottiene. In particolare vanno considerate quelle seguenti.

-s

Abilita l'inserimento di informazioni nel log di sistema.

-u <porta-icp>

Specifica la porta ICP, cioè quella utilizzata per comunicare con gli altri proxy.

-z

Svuota la cache.

-D

Disabilita il controllo iniziale del DNS, attraverso il tentativo di risoluzione di alcuni indirizzi.

-F

Ricostruisce il sistema di directory in cui si articola quella che deve contenere la cache. Di solito, si utilizza assieme a -z, per essere sicuri che vengano cancellate eventuali tracce precedenti.

Esempi

# squid -z -F

Avvia squid in primo piano per azzerare e rigenerare le directory che compongono la cache.

# squid -D &

Avvia squid in background, in modo da attivare il servizio di proxy, senza però eseguire il controllo DNS.

# squid -k shutdown

Invia un segnale di spegnimento al server Squid già attivo.

137.4.2 Log

Squid utilizza file di log specifici, anche quando si utilizza l'opzione -s per inviare informazioni al log di sistema.

Questi file si trovano nella directory /var/log/squid/. Quando si invia al server il segnale rotate (attraverso l'opzione -k), si ottiene l'archiviazione dei file, aggiungendo loro una estensione numerica che ne indica il livello. Per esempio, cache.log.0 rappresenta l'archivio più recente di cache.log.

137.4.3 Configurazione

La configurazione di Squid avviene attraverso il file /etc/squid.conf, o un altro file se viene usata l'opzione -f.

Questo file è già configurato in modo da permettere a Squid di funzionare in quasi tutte le situazioni, tuttavia sarebbe bene ritoccare qualcosa; per esempio il numero di porta del servizio e il dominio o il gruppo di indirizzi a cui concedere di poterlo utilizzare.

La sintassi del file è molto semplice: ciò che è preceduto dal simbolo #, viene trattato come un commento fino alla fine della riga; le righe bianche e le righe vuote sono ignorate; il resto sono le direttive, composte nel modo seguente.

<direttiva> [<argomenti>]

Alcune direttive

http_port <n-porta>

Permette di modificare la porta predefinita per l'ascolto delle richieste dei client. La porta predefinita è 3128, e può essere modificata anche attraverso l'opzione -a, che prende il sopravvento anche su quanto dichiarato nel file di configurazione.

cache_host <host> <tipo> <porta-proxy> <porta-icp> [<opzioni>]

Permette di definire l'indirizzo e le caratteristiche di un altro proxy. Il tipo e le opzioni sono rappresentati da diverse parole chiave che permettono di regolare situazioni diverse, ma non ben descritte nella poca documentazione. In generale, dovrebbe andare bene una forma semplificata come quella seguente.

cache_host <host> parent <porta-proxy> <porta-icp>

Il numero di porta proxy è lo stesso usato dai client per connettersi a quel server. Trattandosi di Squid potrebbe essere il numero 3128, ma se questo valore è stato modificato nella configurazione di quel server, occorre ricordarsene anche qui. Il numero della porta ICP è solitamente 3130 (sempre se si tratta di Squid).

local_domain <dominio>...

Permette di indicare il nome di uno o più domini locali, per il quale non vengono accumulati gli oggetti nella cache, ma si ottengono sempre dall'origine.

hierarchy_stoplist <parola>...

Permette di indicare un elenco di parole (stringhe) che potrebbero essere contenute in un URL. In presenza di tali URL, non vengono interpellati i proxy vicini. Questa direttiva viene proposta nel file di configurazione predefinito nella forma hierarchy_stoplist cgi-bin ?, per escludere tutti gli URL che potrebbero essere riferiti a programmi cgi.

cache_stoplist <parola>...

Permette di indicare un elenco di parole (stringhe) che potrebbero essere contenute in un URL. In presenza di tali URL, l'oggetto non viene salvato nella cache. Questa direttiva si affianca a hierarchy_stoplist, e solitamente vengono usate entrambe con gli stessi argomenti.

cache_mem <memoria-ram>

Definisce quanta memoria RAM (espressa in Mbyte) utilizzare per la parte di cache utilizzata più frequentemente. Il valore predefinito è di 8 Mbyte.

cache_swap <memoria-su-disco>

Definisce quanto spazio (espresso in Mbyte) utilizzare per la cache su disco. Il valore predefinito è di 100 Mbyte.

maximum_object_size <dimensione>

Permette di definire la dimensione massima, espressa in Mbyte, di ogni oggetto che viene conservato nella cache. Gli oggetti di dimensione maggiore, non vengono accumulati.

cache_dir <directory-cache>

permette di dichiarare la directory da utilizzare per la conservazione della cache. Il valore predefinito dovrebbe essere /var/spool/cache/.

cache_access_log <file-di-log-degli-accessi>

Permette di definire il percorso completo del file utilizzato per accumulare il log degli accessi. Di solito si tratta di /var/log/spool/access.log.

cache_store_log <file-di-log-dell'accumulo>

Permette di definire il percorso completo del file utilizzato per accumulare il log delle operazioni di accumulo e di eliminazione di oggetti della cache. Di solito si tratta di /var/log/spool/store.log.

cache_log <file-di-log-della-cache>

Accumula informazioni diagnostiche in base al livello stabilito attraverso la direttiva debug_options.

acl <nome> <tipo> <stringa>

acl <nome> <tipo> "<file>"

Questa direttiva permette di definire un nome attraverso cui identificare un ``controllo di accesso''. La cosa si può articolare in modo molto complesso, e inizialmente è meglio concentrarsi su alcuni tipi di utilizzo.

acl <nome> src <indirizzo-IP>/<maschera-IP>

Il tipo src permette di identificare un gruppo di indirizzi IP, attraverso la coppia indirizzo/maschera. A questo gruppo viene attribuito un nome che può essere usato con la direttiva http_access, per controllare l'accesso da parte di quel gruppo di indirizzi.

http_access {deny|allow} [!]<nome>...

Permette o vieta l'accesso al servizio da parte dei client identificati attraverso i nomi indicati come argomento; nomi che si riferiscono a quanto dichiarato con la direttiva acl.

La parola chiave deny vieta l'accesso, mentre allow lo consente. Se un nome viene indicato preceduto immediatamente da un punto esclamativo, allora si intende esprimere il gruppo corrispondente a tutto ciò che non rientra nella classificazione di quel nome.

Nella configurazione standard di Squid, si concede a qualunque indirizzo di utilizzare il servizio di proxy, mentre sarebbe opportuno fare in modo che questo fosse accessibile solo al segmento di rete per il quale viene attivato.

cache_effective_users <utente> <gruppo>

Permette di definire per nome l'utente e il gruppo che vengono utilizzati dal processo che gestisce i file della cache. Di conseguenza, tali file saranno di proprietà di questo utente e gruppo. Di solito si tratta di nobody.

dns_testnames <nome>...

Permette di indicare i nomi di host da verificare attraverso una interrogazione DNS prima di attivare il servizio. Per disattivare questo comportamento, si utilizza l'opzione -D.

Esempi

http_port 8080

Definisce la porta 8080 per l'accesso al servizio.

local_domain brot.dg mehl.dg

Definisce tutti i domini terminanti per brot.dg e mehl.dg come locali.

cache_mem 4

Riduce a 4 Mbyte la memoria RAM utilizzata per la cache (altrimenti verrebbero usati 8 Mbyte in modo predefinito).

cache_mem 50

Riduce a 50 Mbyte la memoria su disco utilizzata per la cache (altrimenti verrebbero usati 100 Mbyte in modo predefinito).

maximum_object_size 2048

Riduce a 2 Kbyte la dimensione massima degli oggetti accumulati nella cache (altrimenti questa sarebbe di 4 Kbyte in modo predefinito).

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
#acl all src 0.0.0.0/0.0.0.0
acl all src 192.168.0.0/255.255.0.0

acl SSL_ports port 443 563
acl Dangerous_ports port 7 9 19
acl CONNECT method CONNECT

Quelle mostrate nell'esempio sono le direttive acl che appaiono nel file /etc/squid.conf standard, tranne quella che descrive il nome all, che è stata modificata per rappresentare soltanto gli indirizzi a cui si vuole concedere l'accesso al servizio (la sottorete 192.168.*).

Questo dovrebbe essere il modo più conveniente di intervenire per limitare l'accesso al servizio, perché il nome all viene usato in altre direttive successive, per fare riferimento agli utenti del servizio.

http_access deny manager !localhost
http_access deny CONNECT !SSL_ports
http_access deny Dangerous_ports

http_access allow  all
http_access allow  localhost

icp_access  allow  all
icp_access  allow  localhost

miss_access allow  all
miss_access allow  localhost

I nomi definiti con le direttive acl vengono usati particolarmente con le direttive http_access, ma anche in altri casi. L'esempio mostra quello che dovrebbe essere l'impostazione predefinita del file di configurazione, con l'aggiunta di direttive che permettono l'accesso in modo particolare anche a quanto definito come localhost. Si osservi il nome all, richiamato più volte per consentire l'accesso ai servizi normali; nell'esempio precedente si è mostrato come ridurne l'ambito ai soli host per i quali viene attivato il servizio proxy.

137.4.4 Binari accessori

Squid si compone del binario squid e di altri accessori, con funzioni specifiche, avviati da questo. Si tratta di dnsserver, ftpget e unlinkd.

dnsserver viene usato per le interrogazioni DNS, e solitamente ne vengono avviate diverse copie per accelerare le operazioni.

ftpget viene usato per l'accesso a URL di tipo FTP, trattandosi di un caso particolare. Infatti, squid è in grado di gestire da solo le richieste di oggetti riferiti ai protocolli HTTP e Gopher.

unlinkd è un programma molto semplice che serve a cancellare file: cancella di volta in volta i file i cui nomi gli vengono forniti attraverso lo standard input. L'utilità di un tale programma sta nel non dover avviare ogni volta un nuovo processo per la cancellazione di ogni singolo file.

137.4.5 Interrogazione CGI

Squid fornisce un programma CGI per l'interrogazione del servizio proxy da parte dell'amministratore. Si tratta di http://localhost/cgi-bin/cachemgr.cgi. La configurazione predefinita di Squid dovrebbe escluderne l'utilizzo da parte di utenti che accedono da host differenti da localhost.


Figura 137.5: La maschera di cachemgr.cgi.

Come si vede dalla figura 137.5, è necessario indicare almeno il nome del server e il numero di porta del proxy.

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

AppuntiLinux 1998.11.22 --- Copyright © 1997-1998 Daniele Giacomini - daniele@calion.com


[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]