lunedì 4 maggio 2009
Come promesso un paio di settimane fa , ho pronto l’howto secco e come al solito step by step per approntare un sistema di hotspot fai da te per un albergo , una struttura comunitaria , un centro uffici e chi più ne ha più ne metta.
Come al solito è un pippone tecnico , quindi consiglio la lettura solo a chi è veramente interessato
Per una migliore visualizzazione clicca sulla foto
Requisiti :
Per prima cosa procuriamoci il computer che trasformeremo in router , firewall , server radius/mysql e gestore dei vouchers prepagati.
Procuriamoci un disco di installazione di ubuntu server . Questo howto è stato compilato prendendo in esame la 8.10 , ma credo che non ci siano particolari differenze se usiamo l’ultima 9.04.
Installiamo ubuntu server , scegliendo la configurazione LAMP in modo da avere al termine , già funzionanti il server web Apache , mysql e PHP5. E’ buona pratica scegliere anche il demone ssh per poter amministrare l’installazione tramite un client di rete. Per installare ssh
sudo aptitude install ssh
Preparativi post installazione:
Appena terminata l’installazione occupiamoci delle interfacce di rete che andremo a configurare come segue :
eth0 => WAN
eth1 => rete locale
eth2 => hotspot
Ecco il file /etc/network/interfaces
[sourcecode language='cpp']
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
network 192.168.0.0
[/sourcecode]
Abbiamo bisogno di un server dhcp dal momento che scollegando il router internet dalla lan i client si ritrovano privi di indirizzo IP .
Installiamo l’helper dns e server dhcp dnsmasq con
sudo aptitude install dnsmasq
ed editiamo il file di configurazione /etc/dnsmasq.conf come segue :
[sourcecode language='cpp']
server=208.67.222.222 #aggiungere questa riga che indica il server dns esterno a cui appoggiarsi
dhcp-range=eth1,192.168.0.50,192.168.0.150,12h
[/sourcecode]
Editiamo il file /etc/resolv.conf
[sourcecode language='cpp']
nameserver 127.0.0.1
[/sourcecode]
Facciamo ripartire dnsmasq con
sudo /etc/init.d/dnsmasq restart
e proviamo a pingare un host esterno ( google?) e diamo temporaneamente accesso ad internet alla rete locale con
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
A questo punto facciamo partire il demone ssh con
sudo /etc/init.d/ssh restart
Colleghiamo lo switch1 alla nostra rete locale e all’interfaccia eth1 e dovremo essere in grado sia di uscire su internet che di collegarci in ssh all’host 192.168.0.1.
Se qualcosa andasse storto fate ripartire tutti i demoni sopra menzionati
sudo /etc/init.d/networking restart
sudo /etc/init.d/dnsmasq restart
sudo /etc/init.d/ssh restart
e poi da ultimo
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Configurazione Apache:
Spostiamoci ora su un host della rete locale con ip 192.168.0.0/24 e colleghiamoci via ssh all’indirizzo 192.168.0.1 per una migliore gestione del nostro router .
Per prima cosa verifichiamo che Apache ci risponda sulla porta 80 , facendo puntare il nostro browser di fiducia all’indirizzo http://192.168.0.1 .
Per il nostro setup però , avremo bisogno di attivare ssl in Apache.
Entriamo nella directory /etc/apache2/mods-available e verifichiamo l’esistenza di ssl con
sudo ls | grep ssl
Se tutto è a posto dovremmo avere ssl.conf e ssl.load come risposta al comando precedente.
Attiviamo i moduli ssl con
sudo a2enmod ssl
sudo /etc/init.d/apache2 force-reload
Generiamo certificati e chiavi per il server Apache.
[sourcecode language='cpp']
cd /etc/apache2
sudo openssl genrsa -des3 -out server.key 1024
sudo openssl req -new -key server.key -out server.csr[/sourcecode]
Ci verranno richieste la nostra località di lavoro , una challenge password etc etc. Completiamo e rispondiamo ai form nella maniera che riteniamo più opportuna.
Per finire generiamo ed installiamo il certificato vero e proprio
[sourcecode language='cpp']
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private[/sourcecode]
Ricordiamo la password che abbiamo inserito quando abbiamo generato la chiave , ci verrà richiesta per firmare il certificato e al primo riavvio di Apache.
A questo punto dobbiamo completare la configurazione in /etc/apache2/sites-available.
Con il nostro editor di testo preferito diamo un’occhiata al file default-ssl che dovrebbe essere già completamente configurato. Accertimoci che queste voci siano decommentate.
[sourcecode language='cpp']
sudo nano default-ssl
SSLEngine on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key[/sourcecode]
A questo punto ci basta solo attivare il default SSL site con
sudo a2ensite default-ssl
e far ripartire Apache con
sudo /etc/init.d/apace2 force-reload
Verifichiamo il corretto funzionamento , facendo puntare il nostro browser a https://192.168.0.1.
Il browser ci avviserà che il sito non è attendibile , ma forzando l’acquisizione del certificato aggireremo il problema e ai prossimi collegamenti non verremo più disturbati da questi avvisi.
Per fare in modo che lo script di init di Apache non ci richieda sempre la password del certificato dobbiamo rimuovere la crittatura della chiave RSA.
Posizioniamoci in /etc/ssl/private e diamo
[sourcecode language='cpp']
sudo mv server.key server.key.temp
openssl rsa -in server.key.temp -out server.key[/sourcecode]
Installazione Freeradius, i preliminari:
Sfortunatamente il nostro sistema di hotspot a voucher non funziona con freeradius 2.x , o meglio , il gestore degli accessi a tempo phpmyprepaid non ha ancora rilasciato la versione per le nuove tabelle di freeradius 2.x.
Le moderne Ubuntu dalla 8.10 in poi hanno adottato giustamente la nuova versione di freeradius quindi non potremo installare il demone semplicemente con
sudo aptitude install freeradius
Niente paura , preleviamo i sorgenti di freeradius e compiliamoli.
Per prima cosa scarichiamo la distribuzione sorgente all’indirizzo ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.7.tar.gz ( ho anche approntato un mirror nel caso remoto freeradius decidesse di non rendere più disponibile la versione 1.1.7 in quanto non più mantenuta)
Otteniamo i privilegi di superutente con sudo su , posizioniamoci nella nostra directory root con cd e poi diamo
wget ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.7.tar.gz
Esplodiamo l’archivio con
tar zxvf freeradius-1.1.7.tar.gz
A questo punto dobbiamo compilare i sorgenti a la debian way ecco i passi :
[sourcecode language='cpp']
aptitude install debhelper dpatch autotools-dev libtool libltdl3-dev libpam0g-dev libgdbm-dev libldap2-dev libsasl2-dev libiodbc2-dev libkrb5-dev libperl-dev snmp libsnmp9-dev libsnmp5-dev libsnmp4.2-dev libpq-dev postgresql-dev libssl-dev
aptitude install build-essential linux-headers
cd /root/freeradius-1.1.7
dpkg-buildpackage -rfakeroot[/sourcecode]
Questo processo creerà i pacchetti .deb di cui avremo bisogno per installare freeradius 1.1.7 nel nostro server.
Al termine di dpkg-buildpackage , troveremo in /root i seguenti pacchetti .deb : freeradius_1.1.7-0_i386.deb
freeradius-dialupadmin_1.1.7-0_all.deb
freeradius-iodbc_1.1.7-0_i386.deb
freeradius-krb5_1.1.7-0_i386.deb
freeradius-ldap_1.1.7-0_i386.deb
freeradius-mysql_1.1.7-0_i386.deb
freeradius-postgresql_1.1.7-0_i386.deb
Troppa grazia Sant’Antonio ! A noi servono solo i pacchetti freeradius_1.1.7-0_i386.deb e freeradius-mysql_1.1.7-0_i386.deb.
Installiamoli con
dpkg -i freeradius_1.1.7-0_i386.deb
dpkg -i freeradius-mysql_1.1.7-0_i386.deb
Avremmo finito con l’installazione preliminare di freeradius , lo riprenderemo in mano più tardi , una volta installato coova-chilli e phpmyprepaid e sistemato i parametri di mysql.
Per evitare che un aggiornamento di Ubuntu ci rimpiazzi la versione 1.1.7 di freeradius dobbiamo bloccare la versione del pacchetto in apt .
Andiamo in /etc/apt e creiamo un file di testo chiamato preferences e copiamo questo contenuto :
[sourcecode language='cpp']
Package: freeradius
Pin:version 1.1.7-0
Pin-Priority: 1001
Package: freeradius-mysql
Pin:version 1.1.7-0
Pin-Priority: 1001[/sourcecode]
In questo modo saremo sicuri che anche se aggiorneremo il nostro server non avremo problemi di rimpiazzamento di freeradius in versione 2.x
Coova-chilli:
Siamo giunti all’installazione di coova-chilli . Questo demone ci fornirà il captive portal , una pagina web che ci permetterà di inserire le nostre credenziali per il login e autenticarci presso freeradius e in buona sostanza fornirci l’accesso ad internet.
Sempre come superutenti posizioniamoci nella directory /root e scarichiamo il pacchetto precompilato per debian
wget http://ap.coova.org/chilli/coova-chilli_1.0.13-1_i386.deb
dpkg -i coova-chilli_1.0.13-1_i386.deb
In questo modo abbiamo immediatamente il demone chillispot per l’autentifica pronto per essere lanciato con il comando
/etc/init.d/chilli start
Facciamo il tuning del sistema . Posizioniamoci in /etc ed rinominiamo il file di configurazione chilli.conf in chilli.conf.orig. Sostituiamo completamente il contenuto del file di configurazione originale con il seguente contenuto:
[sourcecode language='cpp']
dns1 192.168.182.1
domain mydomain
dhcpif eth2
radiusserver1 127.0.0.1
radiusserver2 127.0.0.1
radiussecret myradiussecret #vedremo più tardi dove inserire la passwdord di radius
uamallowed www.google.com,gmail.com,mail.google.com,1.gravatar.com,s3.wordpress.com,demablog.wordpress.com,192.168.182.1
uamserver https://192.168.182.1/cgi-bin/hotspotlogin.cgi
uamsecret demahotspot[/sourcecode]
Per ultima cosa scarichiamo lo script cgi che ci permetterà il login tramite pagina web
[sourcecode language='cpp']
cd /usr/lib/cgi-bin
wget http://files.demaitalia.com/radius/hotspotlogin.cgi
chmod +x hotspotlogin.cgi[/sourcecode]
Chilli è a posto ora , lasciamolo da una parte per ora ed andiamo ad interessarci di phpmyprepaid
Phpmyprepaid:
Dobbiamo installare uno script php per la gestione delle login del nostro captive portal. Mica vorremo riempire le tabelle di mysql a mano !!!
Procuriamoci l’ultima versione di phpmyprepaid .
Ecco lo step by step
[sourcecode language='cpp']
sudo su
password:
cd
wget http://dfn.dl.sourceforge.net/sourceforge/phpmyprepaid/phpmyprepaidRC3.tgz
tar xvf phpmyprepaidRC3.tgz
cp phpmyprepaid /var/www/prepaid
chown -R www-data:www-data /var/www/prepaid
[/sourcecode]
A questo punto colleghiamoci con il browser all’indirizzo http://192.168.0.1
Seguiamo passo passo questi screenshots:
Ora giusto un paio di chiarimenti . Nelle schermate qui sopra non ci sono bisogno di spiegazioni . Gli unici campi che possono generare confusione sono :
una volta installato e settato il tutto facciamo pulizia con
sudo rm -R /var/www/prepaid/www/install
Possiamo già creare i nostri coupons e stamparli . Questo è il risultato

Verifichiamo che le tabelle del database vengano create correttamente
[sourcecode language='cpp']
mysql -uroot -p phpmyprepaid
Enter password:
mysql>select * from radcheck;
+—-+———-+——————-+—-+———————————————+
| id | UserName | Attribute | op | Value |
+—-+———-+——————-+—-+———————————————+
| 1 | lztudl | User-Password | := | wmf |
| 2 | lztudl | Max-All-Session | := | 86400 |
| 3 | lztudl | WISPr-Location-ID | := | isocc=IT,cc=39,ac=,network=chiavari/myhotel |
| 4 | lztudl | Expiration | := | 5 May 2009 18:11:45 |
+—-+———-+——————-+—-+———————————————+
4 rows in set (0.00 sec)[/sourcecode]
Evviva , ci siamo quasi
Configurazione Freeradius:
I file di configurazione della distribuzione di freeradius sfortunatamente non sono così semplici da configurare . Potrei dirvi di cambiare questo e quel parametro in authorize , instantiate e così via.
Ho preferito rendere disponibili i file di configurazione già pronti , in modo che li possiate scaricare e mettere direttamente nella vostra /etc/freeradius.
[sourcecode language='cpp']
cd /etc/freeradius
wget http://files.demaitalia.com/radius/sql.conf
wget http://files.demaitalia.com/radius/radiusd.conf
[/sourcecode]
Editiamo il file /etc/freeradius/clients.conf e cambiamo la default secrect testing123 in una password che andremo ad inserire anche nel valore radiussecret del file chilli.conf
Editiamo il file sql.conf appena scaricato e cambiamo le credenziali di accesso al database
[sourcecode language='cpp']
sql {
# Database type
# Current supported are: rlm_sql_mysql, rlm_sql_postgresql,
# rlm_sql_iodbc, rlm_sql_oracle, rlm_sql_unixodbc, rlm_sql_freetds
driver = “rlm_sql_mysql”
# Connect info
server = “localhost”
login = root
password = MYPASS
# Database table configuration
radius_db = phpmyprepaid[/sourcecode]
Ultimo tocco editare il file /etc/freeradius/dictionary e inserire la seguente linea
ATTRIBUTE Max-All-Session 3000 integer
Firewalling:
Il fido shorewall si prenderà cura del firewalling .
[sourcecode language='cpp']
sudo aptitude install shorewall
sudo cp /usr/share/doc/shorewall-common/examples/three-interfaces/* /etc/shorewall
sudo cd /etc/shorewall[/sourcecode]
Editiamo i seguenti files :
Restart di tutti i demoni coinvolti :
/etc/init.d/networking restart
/etc/init.d/dnsmasq restart
/etc/init.d/freeradius restart
/etc/init.d/apache2 force-reload
/etc/init.d/mysql restart
/etc/init.d/chilli stop
/etc/init.d/chilli start
/etc/init.d/shorewall restart
Collegamento Access Point:
A questo punto possiamo collegare tanti access point quante porte abbiamo disponibili nello switch2 .
Controlliamo con un notebook ed un netstumbler le aree di copertura radio e piazziamo gli access point nelle aree più consone per una copertura ottimale.
Possiamo usare qualsiasi access point , io per le prove ho usato dei d-link dwl-g700ap
Conclusioni:
Credo di essere stato sufficientemente chiaro e lineare in questo howto. Questa guida è stata compilata in quanto non ho trovato in rete nulla che trattasse il tema di hot spot in maniera passo a passo.
Vi invito a provare sul campo questo setup e di segnalarmi problemi , inesatezze e magari suggerire migliorie e aggiornamenti.