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