Hotspot Debian Sarge HOWTO

Da Faber Libertatis.

Questo breve HowTo discute una possibile configurazione di un server AAA/Radius, appoggiato ad un database MySQL e la predisposizione della stessa macchina a svolgere il ruolo di NAS, quindi di controllare il traffico degli utenti Wireless e non solo.

Indice della pagina

Obiettivi

Il software che verrà utilizzato nell'installazione è tutto rilasciato con licenza Free Software/OpenSource e facilmente reperibile in Internet. Si è inoltre scelto Debian GNU/Linux Sarge per l'ampia disponibilità di software, l'estrema stabilità e le ridotte richieste in tema di prestazione dell'hardware in quanto distribuita ancora con un Kernel della serie 2.4.x pienamente sufficiente a realizzare un simile progetto. Segue la lista dei software utilizzati con indicazione del sito web del progetto e della licenza:

Vediamo in brevi termini cosa ci prefiggiamo faccia il sistema che andremo ad implementare. Un utente dotato di una credenziale di accesso fornita dagli operatori che gestiscono l'hotspot si reca nell'area coperta dalla rete wireless. Effettua uno scanning della rete con il suo portatile dotato di interfaccia wireless e trova la rete non criptata HOTSPOT, si connette a questa ed il PC configura l'interfaccia di rete wireless con i parametri forniti dal DHCP, apre quindi il suo browser, appena tenterà di collegarsi ad un sito in internet (tranne i pochi di accesso libero) gli verrà chiesto di autentificarsi. Una volta autentificato il sistema registrerà la sua connessione e si potrà monitorare la sua connessione attraverso l'indirizzo IP assegnato. Per una maggiore grado di controllo si può implementare un transparent proxy che registi l'associazione tra l'IP address ed il traffico effettuato dall'utente.

Prerequisiti

Tutto ciò che viene riportato in questo HowTo ha funzionato nell'installazione di test e non è detto che debba necessariamente confomarsi a quelle che sono le esigenze di chi legge. Al fine di non incorrere in spiacevoli inconvenienti è necessario avere un'idea precisa di quanto si fa ed è necessario avere ben chiaro cosa comporta ogni singolo comando e configurazione. Conoscenze necessarie e sufficienti possono essere date da una media dimestichezza con i comandi da shell di un sistema GNU/Linux, il firewall NetFilter/IpTables e la configurazione dei servizi di una rete di piccole proporzioni.

I prerequisiti per l'installazione sono modesti e possono essere così esemplificati:

  • Un computer con due interfacce di rete (il SERVER), nel nostro caso la configurazione adottata è PC PIII 1GHz + RAM 128 MByte + HD 10 GByte + 2 NIC Realtek 8139;
  • un access-point wireless, non strettamente necessario se si vuole collegare computer cablati;
  • un computer (il CLIENT) ulteriore necessario per i test, dotato di un interfaccia di rete ethernet o wireless e di un browser che supporti i Pop-Up.

In questo scheda vediamo "graficamente" come si prevede interagiscano i computer

 ________ 
|        |           access-point
| CLIENT | ))))      ((( \|/      ________    Internet
|________|                |      |        |      |
                          +------| SERVER |------+
   rete 192.168.2.0/24      eth1 |________| eth0

Si procede dunque all'installazione base di GNU/Linux Debian Sarge 3.1r2 con kernel 2.4.27, di seguito un esempio di partizionamento del disco:

  • 200 MByte di partizione primaria, file system ext3, montata su /boot (/dev/hda1);
  • il resto del disco ospita una partizione estesa contenente un unica partizione logica configurata come LVM (/dev/hda2) tale da occupare tutto lo spazio sul disco;
  • volume group vg00 a cui sia assegnato il volume fisico /dev/hda2
  • volume logico lv00swap in vg00 di 256 MByte, file system swap (/dev/vg00/lv00swap)
  • volume logico lv00root in vg00 di 9 GByte (il restante spazio), file system ext3 / (/dev/vg00/lv00root)

Dopo l'installazione di base occupiamoci di avere una console usabile

Installare eventuali pacchetti aggiuntivi, in particolare less e vim

# apt-get install less vim

Configurare i caratteri della console nel file /etc/console-tools/config con un valore appropriato

SCREEN_FONTS=lat0-16

La rete

Modificare il file di configurazione delle interfacce di rete /etc/network/interfaces, il quale deve arrivare ad avere il seguente aspetto:

auto lo
iface lo inet loopback

auto eth0
iface inet eth0 dhcp

auto eth1
iface eth1 inet static
	address 0.0.0.0

Attivare in /etc/network/options l'IP Forward del router integrato nel Kernel impostando a "yes" la variabile ip_forward

ip_forward=yes

Riavviare la configurazione di rete del SERVER

# /etc/init.d/networking restart

Aggiungere all'avvio il caricamento del modulo tun e creare il dispositivo in /dev

# echo "tun" >> /etc/modules
# mkdir /dev/net
# mknod /dev/net/tun c 10 200
# modprobe tun

E' poi necessario creare uno script per la configurazione del firewall di Linux, a meno di non volere creare uno ad hoc e adattarne uno pre-esistente si può ricorrere all'utilizzo dello script esemplificativo fornito assieme al pacchetto di ChilliSpot.

In ogni caso si proceda a scaricare e installare il pacchetto chillispot:

$ wget http://www.chillispot.org/download/chillispot_1.0_i386.deb
# dpkg -i chillispot_1.0_i386.deb

Se si scegle di usare lo script di ChilliSpot eseguire i seguenti comandi:

# cp /usr/share/doc/chillispot/firewall.iptables /etc/init.d/chilli.iptables
# chmod a+x /etc/init.d/chilli.iptables
# ln -s ../init.d/chilli.iptables /etc/rcS.d/S40chilli.iptables

Editare, controllare ed eventualmente modificare lo script nelle prime righe dove impostano le variabili INTIF e EXTIF in modo che coincidano rispettivamente con l'interfaccia interna o LAN e quella esterna o WAN:

EXTIF=eth0
INTIF=eth1

Eseguire lo script:

# /etc/init.d/chilli.iptables

Eliminare un eventuale server DHCP dato che sarà chillispot a svolgere la funzione di fornire la configurazione di rete agli host connessi alla rete LAN.

Server Radius e Database

Installare i pacchetti mysql-server freeradius freeradius-mysql freeradius-dialupadmin:

# apt-get install mysql-server freeradius freeradius-mysql freeradius-dialupadmin

Impostare la password dell'utente amministratore del database:

$ mysqladmin -u root password 'mysqlsecret'
$ mysql -u root -p
mysql> CREATE DATABASE radius;
mysql> quit

Creare la struttura del database ed un utente con i privilegi di accesso e modifica del database radius:

zcat /usr/share/doc/freeradius/examples/db_mysql.sql.gz | mysql -u root -p radius
mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'mysqlsecret';
mysql> FLUSH PRIVILEGES;
mysql> quit 

Aggiustare il file /etc/freeradius/sql.conf con i dati di connessione al database appena settati:

server = "localhost"
login  = "radius"
password = "mysqlsecret" 

La configurazione del server Radius è un affare delicato e attualmente non sono riuscito a far operare contemporaneamente una configurazione basata sul file degli utenti Radius /etc/freeradius/users e una dove l'archivio degli utenti si trovi in un database. Consiglio comunque di andare per piccoli passi e di tentare prima di configurare il server Radius con una configurazione basata su file.

Modificare il file /etc/freeradius/radiusd con i seguenti valori, mantenendo le altre impostazioni ai valori dati e facendo attenzione di rispettare l'ordine dei tag:

bind_address = 127.0.0.1
proxy_requests  = no

authorize {
	preprocess
#	auth_log
#	attr_filter
	chap
	mschap
#	digest
#	IPASS
	suffix
#	ntdomain
	eap
	files
#	sql
#	etc_smbpasswd
#	ldap
#	daily
#	checkval
}

authenticate {
	Auth-Type PAP {
		pap
	}

	Auth-Type CHAP {
		chap
	}

	Auth-Type MS-CHAP {
		mschap
	}

#	digest
#	pam
#	unix

#	Auth-Type LDAP {
#		ldap
#	}

	eap
}

preacct {
	preprocess
	acct_unique
#	IPASS
	suffix
#	ntdomain
	files
}

accounting {
	detail
#	daily
	unix
#	sql
	radutmp
#	sradutmp
#	main_pool
#	pgsql-voip
}

session {
	radutmp
#	sql
}

Configurare l'utente di test aggiungendo la seguente riga nel file /etc/freeradius/users rispettando l'ordine delle sezioni nel file di configurazione:

test Auth-Type := Local, User-Password == "testsecret"

Configurare il client 127.0.0.1 nel file /etc/freeradius/clients.conf con il valore della password per le connessioni al server Radius:

client 127.0.0.1 {
    secret = "radiussecret"
}

Far eseguire il daemon radius in foreground con il comando, premunendosi che il daemon freeradius non sia in esecuzione (per interromperne l'esecuzione digitare Ctrl+C)

# /etc/init.d/freeradius stop
# freeradius -XXX -A

Testare la configurazione con il seguente comando di test:

# radtest test testsecret 127.0.0.1 0 radiussecret

Se il test è andato a buon fine possiamo cambiare la configurazione, attivando il nostro server MySQL per andare poi a caricare i dati degli utenti utilizzando l'interfaccia Web di Dialup Admin. Modifichiamo il file /etc/freeradius/radiusd.conf commentando con un cancelletto tutte le due righe contententi la keyword files e decommentando quelle con sql.

E' una buona idea testare questa nuova configurazione prima di andare avanti, stoppiamo dunque il servizio freeradius con un Ctrl-C e riavviamolo nuovamente in modalità di debug. Quindi inseriamo un utente nel database:

$ echo "INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('mysqltest', 'Password', 'testsecret');" | mysql -u radius -p radius

E ritentiamo il test di prima con i nuovi valori:

# radtest mysqltest testsecret 127.0.0.1 0 radiussecret

Server Apache

Questa parte del tutoriale si occupa di installare e rendere operativo in server httpd Apache 2 con tanto di PHP4, SSl e CGI attivi, il che è sicuramente affare di tutti i giorni per chi è arrivato fino a questo punto nella lettura. Installare dunque apache2 libapache-mod-ssl libapache2-mod-php4 libdate-manip-perl e php4-mysql (libdate-manip-perl sembra sia una dipendenza non molto dichiarata di freeradius-dialupadmin):

# sudo apt-get install apache2 libapache-mod-ssl libapache2-mod-php4 libdate-manip-perl php4-mysql

Togliere in /etc/php4/apache2/php.ini il commento alla riga seguente far caricare a PHP l'estensione a MySQL:

extension=mysql.so

Troviamo un posto adatto per script di login che intercetterà le connessioni tentate dagli utenti non autentificati, il quale necessità di esseguito come uno script CGI e di essere visitato all'interno di una connessione HTTPS:

# mkdir -p /var/www/hotspot{,/cgi-bin}
# zcat -c /usr/share/doc/chillispot/hotspotlogin.cgi.gz > /var/www/hotspot/cgi-bin/hotspotlogin.cgi
# chmod a+x /var/www/hotspot/cgi-bin/hotspotlogin.cgi

Modificare il file /var/www/hotspot/cgi-bin/hotspotlogin.cgi inserendoci una nuova password specifica per secretare la connessione tra ChilliSpot e lo script di login:

$uamsecret = "uamsecret";
$userpassword=1;

Creare il file /etc/apache2/sites-available/hotspot, che nel nostro caso fornisce la configurazione per il sito contenente sia lo script di login che l'interfaccia Web per amministrare gli utenti. A seconda delle necessità dell'installazione specifica si può preferire distinguere questi due servizi in due virtual host disting magari prevendo una pagina di Benvenuto. Questa comunque è una configurazione di massima nel caso abbiate bisogno di ispirarvi:

NameVirtualHost 192.168.2.1:443
<VirtualHost 192.168.2.1:443>
	ServerAdmin webmaster@dominio.org
	DocumentRoot "/var/www/hotspot"
	ServerName "hotspot.dominio.org"
	<Directory "/var/www/hotspot/">
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory> 

	Alias "/dialupadmin/" "/usr/share/freeradius-dialupadmin/htdocs/" 
	<Directory "/usr/share/freeradius-dialupadmin/htdocs/"> 
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /var/www/hotspot/cgi-bin/
	<Directory "/var/www/hotspot/cgi-bin/">
		AllowOverride None
		Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog /var/log/apache2/hotspot-error.log

	LogLevel warn

	CustomLog /var/log/apache2/hotspot-access.log combined

	ServerSignature On 
	SSLEngine on 
	SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>

Eseguire i seguenti comandi per abilitare il nuovo sito e il modulo SSL

# a2ensite hotspot
# a2enmod ssl

Eseguire il seguente comando e inserire dei valori opportuni, ponendo particolare attenzione all'hostname che deve essere risolvibile in un DNS:

# apache2-ssl-certificate

Questi sono i valori esemplificativi a cui faremo riferimento in seguito e che adeguerete alle vostre esigenze: IT, Provincia, Città, Gestore, HotspotServer, hotspot.dominio.org, info@dominio.org

Fatto questo potremmo testare la configurazione riavviando il server Apache:

# /etc/init.d/apache2 restart

e visitando con un web browser l'indirizzo del sito appeno creato https://hotspot.dominio.org/cgi-bin/hotspotlogin.cgi oppure http://hotspot.dominio.org:3990/ che effettuerà il redirect all'opportuna pagina di login, ma non inserite ancora i dati, questi vanno infatti passati al deamon chilli di ChilliSpot, il quale non è ancora attivo.

ChilliSpot

Diamo le informazioni che necessita a ChilliSpot configurando il file /etc/chilli.conf in modo opportuno:

net 192.168.2.0/24
dns1 ns1.dominio.org
dns2 ns2.dominio.org
domain dominio.org
radiusserver1 127.0.0.1
radiusserver2 127.0.0.1
radiussecret radiussecret
radiuslocationid isocc=it,cc=39,ac=41,network=HOTSPOT
radiuslocationname GESTORE,IoSonoQui
dhcpif1 eth1
uamserver https://hotspot.dominio.org/cgi-bin/hotspotlogin.cgi
uamsecret uamsecret
uamlisten 192.168.2.1
uamallowed www.dominio.org,192.168.2.0/24

Alcune note a margine di questa ultima operazione: ChilliSpot monitorizza la rete sull'interfaccia eth1 segnalata dalla riga dhcpf1 eth1, quando un nuovo dispositivo si affaccia in rete chiede che un server DHCP gli fornisca i dati per connettersi e chilli gli risponde dandogli il primo indirizzo IP libero della rete 192.168.2.0, mentre esso rimane in ascolta con l'indirizzo 192.168.2.1 impostato con la direttiva uamlisten 192.168.2.1 che diventa anche il default gateway fornito al nuovo dispositivo di rete. Quando questo cerca di connettersi ad internet il suo traffico viene redirezionato verso l'UAM Server cioè il nostro script di login, il quale gli restituisce le informazioni su utente e password, a questo punto si collega con il server Radius all'indirizzo 127.0.01. Questo valore viene applicato sia al primo che al secondo server dato che se ne devono indicare sempre due anche se uguali. Infine radiuslocationid e radiuslocationname contengono informazioni utili alla localizzazione del punto di accesso, che poi sarebbe l'hotspot generato dal nostro access point wireless, il file di configurazione è autoesplicativo, comunque il significato è il seguente:

  • isocc=it, codice ISO della nazione, in questo caso l'Italia
  • cc=39, il prefisso internazionale della nazione, quello per chiamare coin il telefono, per l'italia +39
  • ac=41, il prefisso locale, per esempio 041 per chiamare Venezia e provincia
  • network=HOTSPOT, ESSID o la zona wireless coperta dall'access point
  • radiuslocationname GESTORE,IoSonoQui, sono rispettivamente il fornitore del servizio e la localizzalizzazione precisa dell'access point

Lo uamsecret deve corrispondere a quello contenuto nello script hotpostlogin.cgi così come radiussecret deve corrispondere a quello impostato in /etc/freeradius/clients.conf nella sezione del client 127.0.0.1. Infine uamallowed permettere di indicare una lista di siti web e di reti a cui è permesse l'accesso anche senza una autenticazione. E' buona norma indicare sempre anche la rete locale dell'hotspot per evitare che il sistema blocchi l'accesso proprio alla pagina di autenticazione.

Ora possiamo testare l'utente mysqltest creato precedentemente, collegando un computer alla rete LAN, cercando di visitare un sito internet dopo essersi assicurati che l'interfaccia di rete si sia configurata in modo automatico attraverso il DHCP, e inserendo i dati di autenticazione. Se veniamo autentificati dovremmo agevolmente navigare in Internet fino a non effettuare il logout nella finestra di pop-up che si dovrebbe essere aperta o tornando a https://hotspot.dominio.org/cgi-bin/hotspotlogin.cgi possibile anche visitando il link http://hotspot.dominio.org:3990/.

Dialup Admin

E' giunto dunque il momento di configurare l'interfaccia Web di FreeRadius per facilitare l'inserimento degli utenti agli operatori che gestiranno l'hotspot. Prima bisogna aggiungere delle ulteriori tabelle nel nostro database, eseguiamo dunque i seguenti comandi:

$ mysql -u radius -p radius < /usr/share/freeradius-dialupadmin/sql/badusers.sql
$ mysql -u radius -p radius < /usr/share/freeradius-dialupadmin/sql/mtotacct.sql
$ mysql -u radius -p radius < /usr/share/freeradius-dialupadmin/sql/totacct.sql
$ mysql -u radius -p radius < /usr/share/freeradius-dialupadmin/sql/userinfo.sql

Cambiare in /etc/freeradius-dialupadmin/admin.conf le impostazioni opportune:

general_domain: dominio.org
general_radius_server_secret: radiussecret
general_encryption_method: clear
sql_username: radius
sql_password: mysqlsecret

Testare dunque il servizio all'indirizzo http://hotspot.dominio.org/dialupadmin/index.html cominciando a creare degli utenti da sottoporre poi al login ed al logout.

Dato che la pagina non chiede all'operatore di autentificarsi è una buona idea inserire una forma di autentificazione basata sul server web su cui ci appoggiamo, andando a modificare le impostazioni della directory in /etc/apache2/sites-available/hotspot:

<Directory "/usr/share/freeradius-dialupadmin/htdocs">
    ...
    AuthName "Restricted Area"
    AuthType Basic
    AuthUserFile /etc/apache2/.htpasswd
    require valid-user
</Directory>

Infine non ci resta che creare l'utente che possa accedere all'interfaccia di ammministrazione e riavviare Apache:

# htpasswd -bcm /etc/apache2/.htpasswd admin adminsecret
# /etc/init.d/apache2 restart

Ora dovrebbe funzionare una buona parte dell'interfaccia tranne alcune schermate con informazioni statistiche. La più importante è sicuramente quella che ci informa sugli utenti in linea (Online Users), per renderla operativa è necessario modificare il file /etc/freeradius-dialupadmin/naslist.conf in modo che abbia i seguenti campi almeno, e gli altri commentati:

nas1_name: nas1.%{general_domain}
nas1_type: other
nas1_model: ChilliSpot
nas1_ip: 0.0.0.0
nas1_finger: database

Per ottenere invece l'operatività della finestra User Statistics è necessario che uno script fornito assieme al pacchetto freeradius-dialupadmin venga eseguito una volta al giorno, si tratta di /usr/share/freeradius-dialupadmin/tot_stats, ma ha due difetti...

  1. non ha il permesso di esecuzione
  2. ha un errore, almeno nella versione installata con Debian

Il primo difetto si rivolve dando il solito comando:

# chmod a+x /usr/share/freeradius-dialupadmin/tot_stats

Il secondo andando a controllare la correttezza della seguente riga di codice Perl:

SBAGLIATO: $sql_password = ($sql_pasword == '') ? '' : "-p$sql_password";
CORRETTO: $sql_password = ($sql_pasword eq '') ? '' : "-p$sql_password";

Stesso problema con un altro script che gestisce le statistiche mensili, si tratta di /usr/share/freeradius-dialupadmin/monthly_tot_stats. Ora per rendere operativi questi script, eseguire il comando:

# cp /usr/share/doc/freeradius-dialupadmin/examples/freeradius-dialupadmin.cron /etc/cron.d/freeradius-dialupadmin

Infine se vogliamo che funzioni anche il la finestra che ci informa dei Failed Logins dobbiamo abilitare i seguenti parametri nel file di configurazione /etc/freeradius/radiusd.conf:

log_auth = yes 
log_auth_badpass = yes
log_auth_goodpass = yes

Riavviare con la nuova configurazione il daemon Radius:

# /etc/init.d/freeradius restart

E fare eseguire il comando /usr/share/freeradius-dialupadmin/bin/log_badlogins /var/log/freeradius/radius.log ad ogni riavvio ad esempio creando un file di inizializzazione e impostandone l'avvio nel modo consueto. Creare il file /etc/init.d/freeradius.badlogins con il seguente contenuto:

#!/bin/sh

/usr/share/freeradius-dialupadmin/bin/log_badlogins /var/log/freeradius/radius.log &

E metterlo in esecuzione all'avvio con i comandi:

# chmod a+x /etc/init.d/freeradius.badlogins
# ln -s ../init.d/freeradius.badlogins /etc/rc2.d/S99freeradius.badlogins

E magari eseguirlo subito con i comandi:

# /usr/share/freeradius-dialupadmin/bin/log_badlogins /var/log/freeradius/radius.log /etc/freeradius-dialupadmin/admin.conf once
# /etc/init.d/freeradius.badlogins

Transparent Proxy

In questo momento gli utenti del servizio di hotspot possono accedere alla rete Internet una volta autenticati. Attraverso le informazioni archiviate nel database radius possiamo identificare l'utente in base all'indirizzo IP assegnato, conoscerne il momento di accesso e quello di disconnessione, sapere quante informazioni ha inviato e quante ne ha ricevuto... non sappiamo però quali siti web ha visitato nel corso delle sue sessioni.

Per risolvere questa carenza informativa, richiesta dalla normativa vigente in materie di punti di accesso pubblico a reti telematiche, possiamo adottare la tecnologia del transparent proxy. Si tratta di attivare un proxy web che offra una cache per l'accesso al web dei client collegati, il quale sia predisposto per salvare un log sufficientemente particolareggiato contente almeno la data e l'ora dell'accesso, l'indirizzo IP del client e la pagina visitata.

Questa possibilità ci è offerta tra l'altro dal proxy Squid (http://www.squid-cache.org/), pieno di funzionalità, estremamente stabile e non di particolare difficoltà nella configurazione. Per evitare di costringere i singoli client a configurare nel proprio browser la connessione tramite proxy (con le problematiche che questo comporta in quanto a riconoscimento automatico) si è preferito addottare un sistema di transparent proxy, che effettui un caching automatico di tutto le connessioni a siti web non crittati (protocollo HTTP). Come potete immaginare questo impedisce di effettuare un controllo sulle connessioni a siti web crittati (protocollo HTTPS); comunque anche in presenza di un proxy caching tradizionale non otterremmo le informazioni sull'intero percorso del sito web (d'altro parte, la connessione è crittata apposta...) ma solo sull'indirizzo IP del server Internet a cui è diretta la richiesta. Possiamo comunque ottenere le informazioni sufficienti (la normativa richiede il solo indirizzo IP del server visitato) effettuando un log dal firewall NetFilter di Linux con una opportuna policy di iptables.

Invitando ad una attenta lettura della documentazione on-line sull'argomento riportiamo qui un breve esempio di configurazione.

Installate Squid e, consigliamo attentamente, anche l'analizzatore dei log SARG che fornirà una rappresentazione web-friendly di queste informazioni.

# apt-get install squid sarg

Modificate il file di configurazione /etc/squid/squid.conf introducendo almeno queste impostazioni:

httpd_port 127.0.0.1:3128 
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Dare i seguenti comandi per redirigere le connessioni ai siti web verso la porta del proxy (di default per Squid la 3128) e modificare opportunamente il file /etc/init.d/chilli.iptables per renderli effettivi ad ogni riavvio.

# iptables -t nat -A PREROUTING -i tun0 -p tcp -s 192.168.2.0/24 --dport 80 -j REDIRECT --to-destination 127.0.0.1:3128

A differenza di una precedente versione dell'howto, piu' complessa e meno sicura, abbiamo qui una redirezione del traffico web verso la porta aperta dal proxy solo all'interfaccia di loopback che non è raggiungibile da dispositivi esterni al server se non attraverso la redirezione, quindi non si possono verificare accessi diretti al proxy senza che vi venga interposto un sistema di autenticazione (ringrazio Stone che ha suggerito la modifica e Roberto che mi ha ricordato di apportarla).

Se si vuole restringere le informazioni raccolte dalle connessioni al solo indirizzo IP del server visitato possiamo usare un sistema simile a quello qui di seguito suggerito per tenere traccia delle connessioni in protocollo HTTPS (quelle crittate).

# iptables -I FORWARD 1 -i tun0 -o eth0 -s 192.168.2.0/24 -p tcp --dport 443 -m state --state NEW -j LOG --log-prefix HOTSPOT:

In seguito sarà possibile ottenere informazione della connessione di un utente controllando il Log di sistema /etc/log/syslog magari filtrando attraverso il prefisso HOTSPOT: per facilitarne la determinazione, oppure agendo sul file di configurazione del demone di logggind di sistema.

In questa fase si può anche prendere in considerazione la possibilità di adottare un sistema di content-filtering per eliminare grossi download, o impedire l'accesso a siti dai contenuti sconvenienti (violenza, pornografia, pratiche illegali). Per rispondere a queste esigenze può tornare utile adottare il programma DansGuardian facilmente disponibile pacchettizzato per Debian Sarge.

Script di backup e archiviazione dei log del traffico di rete

Come prevedibile la nostra installazione di Sarge sarà dotata di un sistema di rotazione dei log di sistema che ne limiterà l'ampliarsi effettuando una regolare, spesso giornaliera, operazione di compressione e cancellazione dei più vecchi. Alcuni log però sono vitali al fine del tracciamento delle connessioni. Stiamo parlando infatti del file /var/log/squid/access.log con tutte le connessioni rilevate dal proxy Squid oppure dei log di sistema in /var/log/syslog. Al fine di impedire la perdita di dati essenziali andremo ad agire sul sistema di rotazione dei log che è diverso per Squid e per il log di sistema.

I log di Squid sono rotati da logrotate e la configurazione per quanto concerne Squid si trova in /etc/logrotate.d/squid, andremo dunque a salvare aggiungendo nella sezione prerotate il seguente comando:

cp /var/log/squid/access.log /data/access.log-`date +%Y%m%d`

Ed il nostro log sarà conservato nella directory /data opportunamente identificato da una data aggiunta in coda all'estensione, pronto per un backup su CD con cdrecord oppure con Bacula e Amanda.

I log di sistema sono rotati dallo script in /etc/cron.daily/sysklogd, vale la pena quindi di aggiungere nello script una riga prima del comando savelog del tipo:

grep "HOTSPOT:" /var/log/syslog > /data/httpd_syslog.log-`date +%Y%m%d`