C’è un software libero che consente di verificare quali richieste di connessione provengano dai sistemi connessi alla rete locale non autorizzando, ad esempio, la visualizzazione di siti web “sconvenienti” oppure non indicati in ambiente lavorativo. Il suo nome è Squid. Rilasciato sotto licenza GNU GPL, Squid soddisfa molteplici esigenze. Oltre alla già citata funzionalità che consente di impostare dei filtri sul traffico permesso, Squid mette a disposizione un servizio di cache utile per sveltire numerosi compiti.
Squid è un prodotto che viene sviluppato da diversi anni ed è quindi considerato come una piattaforma molto robusta. L’applicazione è capace di supportare diversi protocolli anche se l’impiego più comune riguarda i classici HTTP e FTP. Si tratta sostanzialmente di un evoluto server proxy che si interpone tra la rete Internet ed i sistemi client connessi alla rete locale.
Nel nostro esperimento, proveremo a configurare Squid come proxy trasparente: ciò significa che non sarà necessario riconfigurare manualmente tutte le macchine connesse alla rete locale indicando, come destinazione per tutte le richieste in uscita, la porta 3128 del server.
Tutto il traffico sarà automaticamente indirizzato alla porta sul quale Squid sarà posto in ascolto e la macchina server che allestiremo si comporterà come un router.
Abbiamo voluto installare Squid su una macchina Ubuntu Server dotata di due schede di rete: la prima (eth0
) è connessa via cavo ethernet ad un router ADSL mentre la seconda (eth1
) ad un router sul quale sono attestati tutti i sistemi che compongono la rete locale.
La prima interfaccia di rete (collegamento al router ADSL, attraverso il quale ci si affaccia alla Rete Internet) utilizzerà l’IP 192.168.1.50 (192.168.1.1 è l’IP del router ADSL) mentre la seconda (eth1
), l’IP 192.168.2.50.
Il router che gestisce il traffico della rete locale, infatti, ha l’IP 192.168.2.1.
Sulla macchina dotata di duplice scheda di rete, abbiamo provveduto ad installare l’ultima versione di Ubuntu Server (11.04 “Natty Narwhal“), prelevabile facendo riferimento a questa pagina, in formato ISO.
La procedura d’installazione di Ubuntu Server è esattamente quella illustrata in questo nostro articolo. Dopo aver lasciato inserito il CD d’installazione di Ubuntu Server nel lettore e riavviato il personal computer, si dovrà avviare il setup indicando, dapprima, la lingua prescelta (l’italiano) quindi la tastiera che si possiede. Se si utilizza una tastiera dal layout italiano, suggeriamo di rispondere No alla domanda “Detect keyboard layout” e selezionare sempre la voce Italia dalle due schermate seguenti:
Il passo successivo consiste nell’indicare la scheda di rete da usare come interfaccia principale (nel nostro caso abbiamo selezionato la prima):
Come evidenziato nell’introduzione, infatti, la macchina server sul quale si installerà Squid utilizza due schede di rete: la prima è connessa ad un router ADSL e quindi, direttamente, alla rete Internet mentre la seconda è collegata ad un semplice router sul quale sono attestati i vari personal computer client della LAN.
Successivamente, si dovrà definire un nome per la macchina virtuale (noi abbiamo scelto ubuntuserver
).
Alla comparsa della schermata per il partizionamento dei dischi fissi, suggeriamo di selezionare l’opzione Guidato – usa l’intero disco e premere il tasto Invio. In questo modo, previa conferma, sarà utilizzato l’intero quantatitivo di spazio a disposizione sul disco fisso della macchina server.
Più avanti, dopo alcuni minuti d’attesa, si dovrà indicare un account da usare al posto di “root” per le operazioni comuni sul sistemi operativo ed impostare la relativa password.
La procedura d’installazione di Ubuntu Server, quindi, richiederà se si fosse interessati a crittografare il contenuto delle directory personali: è possibile operare la scelta che si ritiene più opportuna.
Alla comparsa della schermata Informazioni del proxy HTTP è possibile premere Invio per conmunicare all’installer che non si desidera usare alcun proxy server per il collegamento ad Internet.
Per quanto riguarda gli aggiornamenti di sicurezza è possibile scegliere di gestirli in maniera autonoma da Ubuntu Server (opzione Nessun aggiornamento automatico) oppure si può richiederne l’installazione automatica (Installare automaticamente gli aggiornamenti di sicurezza).
Non appena apparirà la schermata seguente, sarà possibile selezionare quali componenti si desidera vengano automaticamente installati. Per la configurazione di Squid non è necessario alcun software tra quelli indicati. Nel nostro caso, quindi, abbiamo preferito non selezionare alcuna voce e continuare l’installazione di Ubuntu Server.
Qualora si volesse cogliere l’occasione per configurare anche un file server, è possibile seguire le indicazioni riportate in quest’articolo.
Non appena verrà esposto il messaggio “Installare il boot loader GRUB nel master boot record” si dovrà rispondere affermativamente.
Ad installazione conclusa, la macchina Ubuntu Server sarà riavviata (basterà premere Invio sulla voce Continua).
Per accedere alla riga di comando di Ubuntu Server si dovranno digitare le credenziali d’accesso specificate durante l’installazione:
Per aggiornare tutti i pacchetti software di Ubuntu Server si potranno usare, in sequenza, i due comandi seguenti:
sudo apt-get update
sudo apt-get upgrade
Digitando il comando ifconfig
si potrà verificare l’attuale configurazione delle interfacce di rete.
Per fare in modo che il server Ubuntu utilizzi sempre i medesimi indirizzi IP, è necessario editare il file interfaces
digitando quanto segue al prompt:
Il contenuto del file dovrà essere modificato così come nell’immagine (sostituendo le informazioni già presenti nel caso dell’interfaccia di rete primaria):
auto eth0
iface eth0 inet static
address 192.168.1.50
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
post-up iptables-restore < /etc/iptables.up.rules
auto eth1
iface eth1 inet static
address 192.168.2.50
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
Per salvare la modifica appena applicata, come indica la legenda in calce alla schermata, è necessario premere la combinazione di tasti CTRL+O
, il tasto Invio quindi CTRL+X
per uscire dall’editor di testo e tornare alla riga di comando.
Così facendo, si è provveduto ad assegnare, definitivamente, l’IP 192.168.1.50 all’interfaccia di rete che si affaccia sulla rete Internet mentre l’IP 192.168.2.50 a quella connessa alla rete locale. Il comando post-up iptables-restore
si farà carico di reimpostare la tabella di routing impostata a livello locale utilizzando le informazioni conservate nel file iptables.up.rules
, che configureremo tra poco.
Installazione e configurazione del proxy server Squid
E’ possibile procedere con l’installazione dell’ultima versione disponibile di Squid, invocando semplicemente il comando sudo apt-get install squid3
e digitando il tasto S quando richiesto:
A questo punto, prima di editare il file di configurazione che sovrintende il funzionamento di Squid, è bene effettuarne una copia di backup:
Com’è possibile verificare aprendo il file squid.conf
con l’editor Nano, esso è denso di commenti che distolgono dalle direttive impostate di default.
Qualora si volessero eliminare in un colpo solo tutti i commenti e generare un file di configurazione più compatto, si possono digitare i due comandi che seguono:
sudo grep -v "^#" /etc/squid3/squid.conf , sed -e '/^$/d' > squid.conf.new
sudo mv squid.conf.new /etc/squid3/squid.conf
Per modificare il file di configurazione di Squid, è necessario utilizzare il comando sudo nano /etc/squid3/squid.conf
. Ecco come si presenta, di default, tale file:
Nel nostro caso, abbiamo modificato il file così com’è possibile evincere dall’immagine:
Si è aggiunto acl lan src 192.168.1.50/32 192.168.2.0/24
immediatamente sotto la riga acl localhost
. Si è quindi trasformato la riga http_port 3128
in http_port 3128 transparent
.
Sopra la riga http_access allow localhost
, inoltre, si è aggiunto http_access allow lan
.
In calce al file di configurazione si può aggiungere poi la riga cache_dir ufs /var/spool/squid3 20000 16 256
in modo da indicare a Squid la cartella dove memorizzare la sua cache oltre alla sua dimensione (il primo numero – 20000 – indica una cache di dimensioni pari a 20 GB).
Per indicare gli indirizzi IP, è bene utilizzare sempre la notazione CIDR (“Classless Inter-Domain Routing“). Nel nostro file di configurazione, 192.168.1.50/32
definisce solo l’IP 192.168.1.50 mentre 192.168.2.0/24
indica i successivi 255 host (ved. questo comodo specchietto per maggiori informazioni).
Operate le modifiche sopra illustrate al file squid.conf
, è necessario riavviare Squid:
Se tutto andrà per il verso giusto, Squid non restituirà alcun errore e sarà automaticamente preparata la struttura della directory per la gestione della cache:
Passiamo agli ultimi tre passi.
In primis, è necessario editare il file sysctl.conf
digitando sudo nano /etc/sysctl.conf
.
Qui, si dovranno individuare le seguenti direttive e togliere il segno di commento (#) che le precede:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
Al solito, il file dovrà essere salvato con CTRL+O
quindi si potrà uscire dall’editor (CTRL+X
).
Finalmente, è quindi possibile definire le regole per l’instradamento dei pacchetti digitando il comando sudo nano /etc/iptables.up.rules
.
All’interno del file di testo si dovrà inserire quanto segue:
*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.50:3128
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
COMMIT
Una volta salvato il file, si dovrà inserire il comando sudo nano /etc/rc.local
aggiungendo, al suo interno, la riga iptables -t nat -A POSTROUTING -s 192.168.2.0/24 –o eth0 -j MASQUERADE
.
Dopo aver salvato il file, è possibile impartire il comando sudo reboot
in modo tale da richiedere il riavvio del macchina.
Al successivo riavvio, dopo aver effettuato il login in Ubuntu Server, si potrà innanzi tutto verificare l’avvenuto cambiamento degli IP assegnati alle due schede di rete ricorrendo al comando ifconfig
.
Configurazione dei sistemi client e restrizioni di accesso
Avendo impostato Squid come proxy trasparente, normalmente non sono necessarie modifiche sui sistemi che compongono la rete LAN.
Nel nostro esempio è necessario soltanto che le workstation collegate in rete locale utilizzino gli IP da 192.168.2.1 in poi (fatta eccezione per 192.168.2.50 che è l’indirizzo assegnato al server Ubuntu/Squid).
Ecco, ad esempio, come abbiamo configurato le proprietàd dell’interfaccia di rete utilizzata da un sistema Windows XP collegato in rete locale:
Come si vede, il gateway predefinito è stato impostato a 192.168.2.50, IP assegnato all’interfaccia eth1
sul server Ubuntu.
Con le nostre indicazioni, le varie macchine della LAN dovrebbero essere in grado di “navigare” sul web senza la necessità di operare alcun intervento di riconfigurazione.
Il percorso seguito dai pacchetti dati provenienti dai client è verificabile, ad esempio, lanciando un semplice TRACERT
da un sistema client Windows:
Proviamo adesso ad impostare una restrizione in modo tale da impedire agli utenti della LAN la consultazione di siti web come Facebook, Twitter, Meebo o MySpace. Torniamo quindi sulla macchina Ubuntu Server ove si è precedentemente installato e configurato Squid.
Impostazione di restrizioni con Squid
Per imporre delle limitazioni ed impedire, ad esempio, la visita di determinati siti web, è sufficiente effettuare il login sulla macchina Ubuntu Server quindi aprire il file di configurazione di Squid:
Immediatamente sopra la prima direttiva http_access
, si potrà inserire quanto segue:
Sopra http_access allow lan
, invece, si dovrà specificare la nuova riga http_access deny bad_url
.
In questo modo, Squid impedirà la consultazione, da parte dei sistemi collegati in rete locale, di tutti i siti web riportati nel file bad-sites.squid
.
Salviamo il file con la solita procedura quindi invochiamo il comando sudo nano /etc/squid3/bad-sites.squid
.
Al suo interno scriviamo, per esempio:
.facebook.com
.twitter.com
.meebo.com
.myspace.com
Per rendere operative le modifiche, si dovrà riavviare Squid:
A riavvio di Squid avvenuto, se si tenterà di visitare – ad esempio – Facebook da uno qualunque dei sistemi collegati alla rete locale, con qualunque browser web, si otterrà il messaggio seguente:
Per bloccare il download di certe tipologie di file, è possibile inserire nel file di configurazione di Squid, la riga acl blockfiles urlpath_regex "/etc/squid3/blockfiles.squid"
.
Immediatamente sopra la riga http_access allow lan
si dovrà invece inserire http_access deny blockfiles
.
Con il comando sudo nano /etc/squid3/blockfiles.squid
si potrà editare il file contenente l’elenco dei file il cui download deve essere sempre bloccato.
All’interno del file blockfiles.squid
è ad esempio possibile inserire quanto segue per fare in modo di bloccare qualsiasi tentativo di prelievo di file con estensione .EXE, .AVI, .MPG, .MPEG e .MP3:
\.[Ee][Xx][Ee]$
\.[Aa][Vv][Ii]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Mm][Pp]3$
Riavviando Squid (sudo /etc/init.d/squid3 restart
), la nuova limitazione diverrà immediatamente operativa.
Coloro che avessero la necessità di consultare i file di log costantemente aggiornati da Squid, possono fare riferimento al contenuto della cartella /var/log/squid3
.