Squid Proxy on Ubuntu 8.04 Server

Da TondoWiki.


L'utilizzo di un proxy all'interno di una rete permette di regolare in modo molto efficace gli accessi ad internet da parte degli utenti della rete. Attraverso un server proxy infatti si possono definire precise politiche di accesso al web basate sia sull'identità di chi accede (filtraggio degli indirizzi sorgenti delle richieste, meccanismi di autenticazione, ecc...) che sul tipo di richieste stesse (protocolli, domini, indirizzi, porte specificati dalla richiesta); l'accesso può anche essere legato a quote utente di banda utilizzabile piuttosto che a fasce orarie prestabilite. Un altro grande vantaggio nell'utilizzo di un proxy è la funzione di caching delle richieste (richieste dns, pagine web e altri contenuti scaricati, ecc...) migliorando le prestazioni della navigazione internet. Questo articolo cerca di esporre in maniera chiara alcuni aspetti legati all'installazione e configurazione di Squid Proxy Server per una piccola rete locale o domestica. Le prove svolte hanno riguardato l'utilizzo di SQUID 3.0.STABLE13 su sistema operativo Ubuntu 8.04 LTS Server.


WarningYellow icon.png
Quanto di seguito verrà esposto è ciò che si è appreso durante un'esperienza di configurazione di un server proxy per una rete locale domestica al fine di migliorare la navigazione agli utenti (il collegamento ad internet era limitato sia in banda che in quantità di traffico generabile giornalmente). Data la semplicità dell'utilizzo richiesto questo documento non avrà modo di affrontare tutti gli aspetti e le potenzialità offerte da Squid, ma va considerato solo come una linea guida di base.


Installazione

L'installazione di Squid può essere fatta sia compilando manualmente i sorgenti che installando direttamente i pacchetti precompilati. Per gli utenti meno esigenti è sufficiente il secondo tipo d'installazione digitando i semplici comandi:

~$ sudo apt-get install squid3 squid3-common

Per accedere ad alcune impostazioni utilizzate in questa guida tuttavia, Squid richiede di essere installato direttamente dai sorgenti. Le operazioni che seguono necessitano spesso dei privilegi di root (il comando sudo viene omesso per semplicità). Per cominciare si crea una directory in una posizione a piacere e si scarica l'ultima versione stabile dei sorgenti di Squid, in questo caso:

~$ mkdir /usr/src/squid
~$ cd /usr/src/squid/
~$ wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE13.tar.gz

~$ tar xzf squid-3.0.STABLE13.tar.gz
~$ cd squid-3.0.STABLE13/ 

La compilazione di Squid va configurata con l'apposito script ./configure (che va lanciato dalla directory in cui è stato estratto l'archivio). Questa procedura controlla se il sistema ha tutto l'occorrente per l'operazione di make successiva (la compilazione vera e propria). Allo script di configurazione si possono passare una serie di parametri che servono ad abilitare o disabilitare alcune funzionalità del proxy, che potranno poi essere configurate a piacere in seguito all'installazione. Per una panoramica completa dei parametri disponibili si può utilizzare l'opzione --help come mostrato di seguito:

~$ ./configure --help

Nel caso in esame si è scelta la seguente combinazione di opzioni:

~$ ./configure --prefix=/ --libexecdir=/lib/squid --sysconfdir=/etc/squid --localstatedir=/var/squid --datarootdir=/usr/share/squid
     --enable-xmalloc-statistics --enable-storeio="diskd" --enable-removal-policies="lru heap" --enable-useragent-log 
     --enable-referer-log --enable-snmp --enable-cachemgr-hostname=stewe --enable-arp-acl --enable-linux-netfilter

Per alcune delle opzioni scelte è bene spendere due parole:

  • --prefix=/ : specifica il percorso base per l'installazione di Squid.
  • --sysconfdir=/etc/squid : specifica il percorso per i files di configurazione.
  • --localstatedir=/var/squid : a questo indirizzo verranno depositati i file di log e relativi alla cache.
  • --enable-storeio="diskd" : abilita la modalità diskd per la memorizzazione su disco degli oggetti in cache.
  • --enable-removal-policies="lru heap" : abilita le heap policy utilizzate per sostituire gli oggetti nella cache.

L'esecuzione del comando richiede alcuni istanti in quanto, oltre a configurare la compilazione con le opzioni scelte, esegue un'analisi del sistema alla ricerca degli applicativi di supporto necessari (la presenza nell'output di no e yes a fianco delle varie voci analizzate indica cosa è stato trovato e cosa invece manca). Se il comando termina senza errori significa che si può passare alla fase successiva (non è detto che la mancanza di alcuni elementi precluda la compilazione dell'applicazione). In caso di errore sarà necessario esaminare l'output prodotto e verificare cosa mancava installando i relativi pacchetti (solitamente la descrizione stessa dell'errore a fine procedura aiuta a capire il problema).

WarningYellow icon.png
I risultati ottenuti dalle prove ed esposti a titolo di esempio in questo articolo sono da ritenersi validi a condizione di eseguire le medesime operazioni e configurazioni descritte. Possibili cambiamenti al procedimento potrebbero variare il comportamento previsto per l'applicazione. Si rimanda pertanto ai link di approfondimento a fondo pagina per comprendere meglio il significato delle varie operazioni e apportare adattamenti sulla base delle proprie esigenze.

A questo punto è giunto il momento di compilare e installare l'applicazione. Per fare ciò, dalla directory dove si è eseguito lo script di configurazione, lanciare nella sequenza indicata i seguenti comandi:

~$ make
~$ make install
~$ cd src/
~$ make install-strip

Il comando make impiegherà diversi secondi (se non minuti) per completare e va controllato l'output per eventuali errori. Se non ci sono stati errori è possibile eseguire il make install che non fa altro che muovere i file generati al passo precedente nelle effettive cartelle di installazione. Il comando make install-strip infine ha il compito di alleggerire i files eseguibili installati dalle informazioni di debug (è un'ottimizzazione non necessaria al funzionamento corretto del proxy). E' utile a questo punto creare anche l'utente squid che rappresenterà l'applicazione vera e propria nelle varie operazioni svolte da squid, digitare il seguente comando e seguire le istruzioni:

~$ adduser squid

La fase di installazione è terminata ma il proxy non è ancora funzionante è prim necessaria una fase di configurazione dell'applicazione.

Configurazione

Di default il file di configurazione principale di Squid è /etc/squid/squid.conf. Tale file è molto lungo e ricco di informazioni, sostanzialmente costituisce sia la guida alla configurazione del proxy che la configurazione stessa. Ogni voce è infatti accompagnata da diverse linee di commento che ne spiegano la funzione,le modalità di utilizzo e il comportamento di default. Appena installato Squid dispone già di una configurazione di base molto semplice e funzionante. Di seguito verranno descritti sinteticamente i principali parametri da modificare per personalizzare il comportamento del proxy sulla base delle specifiche esigenze, si apra con un editor a piacere il file di configurazione:

~$ sudo vim /etc/squid/squid.conf

Impostazioni di Rete

http_port port [options]
          hostname:port [options]
          1.2.3.4:port [options]

Di default Squid è in ascolto sulla porta 3128 e su tutte le interfacce di rete della macchina su cui è installato; queste impostazioni possono essere cambiate con il parametro http_port. Con una o più righe di questo tipo si possono specificare anche più porte di ascolto e indirizzi IP o hostnames alternativi associati a relative porte. I campi options sono facoltativi e riguardano l'impostazione di particolari tipologie di comportamento del proxy (come trasparent proxy). Esempi:

http_port 3128 6678
http_port 192.168.1.253:8080

Con le precedenti due righe si specifica che il proxy resta in ascolto (su tutte le interfacce della macchina su cui è installato) sia alla porta 3128 che alla 6678; in particolare ascolterà anche sull'interfaccia di rete con indirizzo IP 192.168.1.253 alla porta 8080. Solitamente si specifica una sola porta di ascolto specificando l'indirizzo IP dell'unica interfaccia da cui si vogliono accettare le richieste (tipicamente quella collegata alla rete interna).


dns_nameservers dns1 dns2

Specifica gli indirizzi dns che si vogliono utilizzare per la risoluzione delle richieste, dns1 e dns2 vanno sostituiti con gli indirizzi dns primario e secondario rispettivamente.

Impostazioni della cache

cache_mem 16 MB

Per il proprio funzionamento il proxy assorbe una certa quantità di risorse della macchina che lo ospita. Con questo parametro si indica la quantità massima di memoria RAM aggiuntiva che Squid può utilizzare per memorizzare oggetti in transito, oggetti con elevata frequenza di richieste ed oggetti non salvabili in cache. Di default la dimensione impostata è 8 MB, con l'aggiunta della riga precedente il limite viene alzato a 16 (più che accettabile per reti di piccole dimensioni). Questo parametro influenza le prestazioni generali del servizio proxy e va valutato sia sulla base delle risorse a disposizione sulla macchina che sulle necessità degli utenti.


cache_replacement_policy heap LRU

Quando la memoria su disco dedicata alla cache viene riempita il sistema inizia a sovrascrivere gli oggetti presenti. Con questo parametro si specifica l'algoritmo utilizzato per decidere quali oggetti sostituire. La scelta proposta sopra non è l'unica (la politica di default è lru), esistono quattro modalità possibili:

  • lru : è la modalità di default, l'algoritmo si implementa attraverso liste LRU;
  • heap LRU : vengono mantenuti gli oggetti referenziati più di recente (anche LRU funziona in questo modo);
  • heap GDSF : venogno mantenuti gli oggetti di piccole dimensioni e più utilizzati;
  • heap LFUDA : vengono mantenuti gli oggetti di dimensioni più grandi e più utilizzati.

cache_dir diskd /var/squid/cache 500 12 128

Con questa linea si descrive a Squid dove, in che modo e con che limitazioni memorizzare i file di cache. Il primo parametro rappresenta la tecnica utilizzata per la scrittura dei files su disco (quello di default è ufs). La scelta fatta in questo caso è stata possibile soltanto perchè si è specificata la relativa opzione prima della compilazione dei sorgenti. Il secondo parametro rappresenta la directory vera e propria di memorizzazione, essa deve esistere e Squid deve possedere i permessi di scrittura necessari ad usarla. Infine i parametri numerici rappresentano nell'ordine: le dimensioni massime della cache in questa sottocartella, il numero massimo di sottodirectory rispettivamente di 1° e 2° livello. Con più linee di questo tipo è possibile dislocare la cache su più directory o devices (con le opzioni scelte la directory mostrata coincide con quella di default, in caso di modifica potrebbe essere necessario rilanciare il comando squid -z).


minimum_object_size 0 KB
maximum_object_size 4096 KB

Con questi due parametri si definiscono le dimensioni minime e massime degli oggetti salvati in cache. Se il proxy serve a memorizzare del semplice traffico internet tali valori (che sono stati lasciati uguali alla configurazione di default) sono più che accettabili.


cache_swap_low 85
cache_swap_high 95

Rappresentano rispettivamente il limite inferiore e superiore di riempimento della cache (espressi in percentuale). Entrambe si possono considerare come soglie di allarme per Squid. Al raggiungimento della prima soglia il proxy inizia la sostituzione dei files in cache per mantenersi sotto la soglia stessa e permettere contemporaneamente ad oggetti grandi di avere ancora spazio per essere salvati. La seconda è invece una soglia più stringente che porta Squid ad aumentare la velocità di sostituzione dei files in cache.

Opzioni di log

access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log

Queste opzioni specificano i percorsi desiderati per i file di log del sistema (in questo caso non sono stati modificati i parametri di default).


pid_filename /var/run/squid.pid

Questo parametro è molto importante per l'utilizzo di uno script di avvio automatico del proxy all'accensione del sistema (descritto in seguito). Il percorso specifica dove memorizzare il file squid.pid che contiene il pid del processo principale una volta avviato il proxy. Questo valore non va modificato se si utilizzerà lo script fornito in questa guida (in alternativa un utente esperto può cimentarsi nella modifica dello script di avvio se preferisce).

Impostazioni di amministrazione

cache_effective_user squid
cache_effective_group squid

Le presenti linee definiscono l'utente e il gruppo utilizzati da Squid per le proprie operazioni di funzionamento (devono coincidere con quanto espresso in fase di installazione durante l'aggiunta del nuovo utente, che è proprio squid in questo caso).


visible_hostname hostname

Rappresenta il nome dell'host su cui è eseguito Squid, hostname va sostituito con il nome corretto.

Configurazione delle politiche di accesso al proxy

Per definire le politiche di accesso alle informazioni del proxy è possibile configuare SQUID mediante un insieme di Access List (acl) e di operatori. In poche parole, con una regola acl è possibile definire una classe (come una rete di destinazione, una porta o un indirizzo sorgente) e con un operatore si può definire il tipo di comportamento del proxy nei confronti di quella determinata classe. Ad esempio per permettere l'accesso ad una determinata porta (ad esempio la 1099) da parte dei client si potrebbe utilizzare questa coppia di regole:

acl nomedellaporta port 1099
http_access allow nomedellaporta

La prima regola dichiara la porta, mentre la seconda rappresenta l'operatore che abilita l'utilizzo della porta con protocollo HTTP. La sintassi di una Access List è la seguente:

acl aclname acltype string1 [string2] [string3] ...

oppure, nel caso in cui i parametri vengano elencati in un file, si esprime nel modo seguente:

acl aclname acltype "filename" ["filename2"] ["filename3"] ...

Il campo aclname è un'etichetta (un nome scelto a piacere) usato in seguito per far riferimento alla regola nella definizione degli operatori; è sempre buona norma specificare un nome sensato per l'elemento o la classe che si vanno a dichiarare. Il tipo, acltype, appartiene ad un insieme di tipi descritti nel file di configurazione di SQUID, nella sezione relativa alle Access List. A seconda del tipo scelto si specificano poi i parametri 'string' della regola. Ad esempio per definire una o più porte è possibile utilizzare una sintassi di questo tipo:

acl aclname port numPort [numPort2] [numPort3]

Qui port identifica il tipo di regola come una dichiarazione di una o più porte. I restanti campi esprimono numericamente i numeri delle porte. Per altri tipi di regole si esprimono i relativi tipi di parametri (indirizzi IP, domini, ecc...). I parametri di una singola regola sono valutati con un OR logico, pertanto la regola viene identificata come soddisfacente se almeno uno dei parametri conincide con quello della richiesta in esame.

Per quanto riguarda gli operatori che discriminano gli accessi sulla base delle Access List definite, l'operatore principale a cui si ricorrre è http_access. La sintassi per questo operatore è la seguente:

http_access allow|deny aclname [aclname1] [aclname2] ...

Con allow o deny si decide se abilitare o meno l'Access List specificata come parametro. Se si definisce l'operatore con più di una Access List la valutazione viene effettuata considerando un AND logico delle regole acl. L'operatore permette o nega l'accesso solo se la richiesta soddisfa contemporaneamente tutte le Access List specificate. Queste regole vengono valutate nell'ordine in cui sono scritte ed è quindi molto importante la loro disposizione per la definizione corretta delle politiche di accesso al proxy. Se una richiesta non soddisfa nessuna delle regole espresse, SQUID procede con l'operazione opposta a quella prevista nell'ultima regola esaminata. Se pertanto l'ultima regola contenesse allow la richiesta verrebbe negata, viceversa verrebbe accettata.

Per il funzionamento della configurazione di default di Squid è necessario aggiungere la seguente linea:

acl localnet src sottorete

Dove al posto di sottorete va specificata la rete da cui sono accettate le richieste (ad esempio 192.168.1.0/24) tipicamente la LAN per cui Squid è in ascolto. Il file contiene di default alcuni esempi di sottorete, è bene commentarli tutti tranne quello della propria rete.

Terminazione dell'installazione e avvio di Squid

Eseguita la configurazione di Squid è necessario concedere a Squid i permessi necessari alla modifica dei files di log e di cache, per ottenere ciò, se non si è modificato il percorso di tali files, si può eseguire direttamente il seguente comando:

~$ chown -R squid:squid /var/squid/

Per verificare la correttezza sintattica del file di configurazione è possibile utilizzare il comando:

~$ squid -k parse

Se non vengono ritornati messaggi d'errore significa che il file è utilizzabile correttamente. Per generare le directory e i files di cache necessari eseguire:

~$ squid -z

Se tutto si è svolto correttamente eseguendo il seguente comando è possibile avviare Squid e provarne il funzionamento (eventuali messaggi di errore verranno presentati direttamente in output senza necessità di andare a visionare i files di log).

~$ squid -N -d1

Effettuati i primi test utilizzare ctrl+c per terminare. A questo punto il proxy è a tutti gli effetti utilizzabile. Per avviarlo tuttavia è sempre necessario utilizzare il comando squid con eventuali opzioni. La soluzione migliore consiste invece nell'avviare e terminare automaticamente il proxy all'avvio e allo spegnimento della macchina. Per fare ciò è possibile creare, editare e rendere eseguibile uno script apposito con la seguente sequenza di comandi:

~$ touch /etc/init.d/squid
~$ vim /etc/init.d/squid
~$ chmod +x /etc/init.d/squid

Per velocizzare le cose questa guida fornisce un esempio di script (personalizzato per le scelte fatte in fase di configurazione) utilizzabile a questo scopo. Una volta scaricato copiarlo nella directory /etc/init.d/ e renderlo eseguibile come visto sopra. Per testarne l'avvio e l'arresto del proxy con tale script è possibile digitare:

~$ /etc/init.d/squid start
~$ /etc/init.d/squid stop

Se tutto va bene non resta che fare in modo che lo script venga lanciato correttamente all'avvio e allo spegnimento del sistema, per realizzare ciò utilizzare il seguente comando:

~$ update-rc.d squid start 30 2 3 4 5 . stop 30 0 1 6 .

Se il proxy non è già in funzione avviarlo utilizzando lo script stesso come visto sopra. Il sistema è ora configurato e pronto all'uso per tutti gli utenti della rete.

Esempio di script per l'avvio e la chiusura di Squid

#Startup script for SQUID HTTP proxy

NAME=squid
DAEMON=/sbin/squid
LIB=/lib/squid
PIDFILE=/var/run/$NAME.pid
SQUID_ARGS="-D -sYC"

. /lib/lsb/init-functions

start () {

        if [ "$CHUID" = "" ]; then
               CHUID=root
        fi 

        start-stop-daemon --quiet --start --pidfile $PIDFILE --chuid $CHUID --exec $DAEMON -- $SQUID_ARGS
        return $?
}

stop () {
        PID=`cat $PIDFILE`
        start-stop-daemon --stop --quiet --pidfile $PIDFILE --name squid
        sleep 2
        if test -n "$PID" && kill -0 $PID
        then
                log_action_begin_msg " Waiting"
                cnt=0
                while kill -0 $PID 2>/dev/null
                do
                        cnt=`expr $cnt + 1`
                        if [ $cnt -gt 24 ]
                        then
                                log_action_end_msg 1
                                return 1
                        fi
                        sleep 5
                        log_action_cont_msg ""
                done
                return 0
        else
                return 0
        fi
}

case "$1" in
    start)
        log_daemon_msg "Starting Squid HTTP proxy"
        if start ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
    stop)
        log_daemon_msg "Stopping Squid HTTP proxy"
        if stop ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
    reload|force-reload)
        log_action_msg "Reloading Squid configuration files"
        $DAEMON -k reconfigure
        ;;
    restart)
        log_daemon_msg "Restarting Squid HTTP proxy"
        stop
        if start ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
    *)
        echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}"
        exit 3
        ;;
esac

exit 0

Approfondimenti

Strumenti personali