Raspberry: un access point WiFi con gestione degli utenti – parte 1

Premessa
Internet è una risorsa preziosa.
L’idea che sta dietro a questo progetto è quella di creare un access point che permetta di condividere in modo controllato un accesso ad internet.
L’utente si connette ma, prima di poter navigare, deve fornire uno username ed una password attraverso un’interfaccia web.
La web GUI, oltre a curare l’autenticazione, mette a disposizione una serie di funzioni (riservati agli amministratori) per la gestione degli utenti.
Il progetto può essere adatta per funzionare su qualsiasi distribuzione di Linux. La versione presentata in questo tutorial, presuppone l’uso di Raspberry.
La scelta di Raspberry è stata dettata dal fatto che:

  1. l’hardware è facilmente reperibile e a basso costo
  2. è facilmente standardizzabile
  3. il costo è contenuto

Il tutorial è suddiviso in due parti:

  1. Parte 1 – Installazione e configurazione del Raspberry
  2. Parte 2 – Installazione e configurazione del parte applicativa

Cosa serve

  • Raspberry Pi Type B
  • Scheda WiFi, attenzione non tutte supportano la modalità hotspot. Io ho usato la TP-Link TL-WN725N ver. 2
  • Una SD compatibile con Raspberry da 2Gb

Configurazione sistemistica
Ho usato la Raspian. E’ abbastanza generica per essere considerata una buona base di partenza: ci sono distribuzioni già pronte per essere utilizzate come hostspot, ma nessuna fa quello che cercavo di fare io: tutte prevedono di utilizzare Raspberry come access-point casalingo, io lo voglio usare per condividere internet in maniera controllata.
Terminata l’installazione base della distribuzione è il momento di iniziare a fare qualche configurazione.
Iniziamo dalla configurazione della scheda wireless, modificando /etc/network/interfaces aggiungendo:

1
2
3
iface wlan0 inet static
        address 192.168.42.1
        netmask 255.255.255.0

La TP-Link TL-WN725N non è direttamente supportata dal kernel della Raspian, prima di poterla utilizzare è necessario installare un modulo del kernel. Niente paura, la procedura è semplice, semplice ed è descritta per filo e per segno qui. In breve si tratta di scaricare il modulo del kernel, decomprimere il file, installarlo nell’alberatura dei moduli per la versione del kernel usata (3 riga dei comandi riportati qui sotto) e caricarlo:

1
2
3
4
5
wget https://dl.dropboxusercontent.com/u/80256631/8188eu-20130209.tar.gz
tar -zxvf 8188eu-20130209.tar.gz
sudo install -p -m 644 8188eu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless
sudo depmod -a
sudo modprobe 8188eu

Questa operazione è sufficiente farla una sola volta, ma bisogna ricordarsi di rifarla quando si aggiorna la versione del kernel.
Facendo un reboot, a questo punto, il comando ifconfig dovrebbe trovarvi 3 interfacce di rete: lo, eth0 e wlan0.
Adesso è necessario configurare la parte di hostspot.
Iniziamo con installare il software:

1
sudo apt-get install hostapd

La configurazione di hospapd si trova in /etc/hostapd/hostapd.conf. Se vogliamo creare un access-point protetto da WPA2 (quindi con password per la connessione dei device), il file dovrà essere simile al seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Basic configuration
interface=wlan0
ssid=piWiFi
channel=1

# WPA2 configuration
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=QUI_CI_VA_LA_PASSWORD_WPA2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

# Hardware configuration
driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

# Other configuration
country_code=IT

Nel mio progetto, l’autenticazione dell’utente è demandata alla GUI grafica scritta in PHP (descritta nella parte 2 di questo post), è pensabile di permettere la connessione all’AP senza nessuna password WPA2. In questo secondo caso il file dovrebbe essere simile a questo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Basic configuration
interface=wlan0
ssid=piWiFi
channel=1

# WPA2 configuration
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0

# Hardware configuration
driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

# Other configuration
country_code=IT

Alla fine, qualsiasi scelta si è fatta, editare il file /etc/default/hostapd in questo modo:

1
DAEMON_CONF="/etc/hostapd/hostapd.conf"

HostAPd, nella versione pacchettizzata, non supporta la TP-Link in modalità access-point. Nessun problema basta scaricare i sorgenti e ricompilarli.
Da questo link di Github è possibile scaricare i sorgenti modificati per la TP-Link.
Rimuovere il pacchetto che contiene la versione originale di hostpAPd:

1
sudo apt-get autoremove hostapd

Non preoccupatevi, i file di configurazione non vengono toccati. A questo punto è possibile ricompilare.

1
2
3
4
5
wget https://github.com/jenssegers/RTL8188-hostapd/archive/v1.1.tar.gz
tar xvfz v1.1.tar.gz
cd RTL8188-hostapd-1.1/hostapd
sudo make
make install

Se tutto funziona a dovere, provando a lanciare il demone, dovreste avere una risposta tipo questa:

1
2
3
$ sudo service hostapd restart
[ ok ] Stopping advanced IEEE 802.11 management: hostapd.
[ ok ] Starting advanced IEEE 802.11 management: hostapd.

Adesso è necessario abilitare il forward fra le due interfacce di rete (wlan0 e eth0). Con iptables, poi, faremo il masquerade dei pacchetti che provengono da wlan0 verso eth0 per instradarli verso internet.
Abilitare il forward modificando il file /etc/sysctl.conf in questo modo:

1
net.ipv4.ip_forward=1

E queste righe di iptables applicano il NAT (masquerade):

1
2
3
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

Per fare in modo che, dopo il reboot, queste configurazioni vengono ricaricate create un file /etc/network/if-up.d/firewall con le 3 righe di iptables. Modificate i permessi in modo da renderlo eseguibile (chmod 755) e modificate /etc/network/interfaces aggiungendo:

1
2
3
4
iface wlan0 inet static
        address 192.168.42.1
        netmask 255.255.255.0
        post-up /etc/network/if-up.d/firewall

In questo modo, all’avvio, quando viene ripristinata l’interfaccia wlan0 viene eseguito lo script di attivazione del firewall.
Ultimo pezzettino di software da installare: un demone DHCP.
Visto che usiamo un Raspeberry Pi mettiamo un muDHCP 🙂

1
sudo apt-get install udhcpd

Il file di configurazione è /etc/udhcpd.conf:

1
2
3
4
5
6
7
8
start 192.168.42.2 # Range di IP che il DHCP assegna.
end 192.168.42.20
interface wlan0 # L'interfaccia sul quale il demone è in ascolto.
remaining yes
opt dns 8.8.8.8 4.2.2.2
opt subnet 255.255.255.0
opt router 192.168.42.1 # L'IP del Raspeberry che farà da gw
opt lease 864000

Per vedere se tutto funziona:

1
2
sudo service hostapd start
sudo service udhcpd start

A questo punto è possibile connettersi al nostro nuovo AP e provare a navigare.
Per fare in modo che i servizi partano all’avvio:

1
sudo update-rc.d hostapd enable

Mentre per il DHCP è necessario fare in modo che parta solo dopo che la scheda wlan0 è stata abilita. Per farlo usiamo la stessa tecnica usata per abilitare il firewall.
Creiamo un file /etc/network/if-up.d/udhcpd, chmod 755 /etc/network/if-up.d/udhcpd e al suo intero, mettiamo l’istruzione per far partire il serivizio:

1
service udhcpd start

Aggiungiamo la riga

1
post-up /etc/network/if-up.d/udhcpd

al file /etc/network/interfaces, in modo che appaia così:

1
2
3
4
5
iface wlan0 inet static
        address 192.168.42.1
        netmask 255.255.255.0
        post-up /etc/network/if-up.d/firewall
        post-up /etc/network/if-up.d/udhcpd

Se siamo stati bravi (io a scrivere questo tutorial e voi a seguirlo!) facendo un reboot del Raspberry dovreste ritornare ad avere un access-point che vi permette di navigare in WiFi.