Configurare la Raspberry pi 3 come access point

TUTORIAL

In questo tutorial spiegherò una via molto semplice per utilizzare  la Raspberry Pi 3 come un access point. Il motivo di questo tutorial è squisitamente didattico e comunque interessante per chiunque voglia avere il pieno controllo della rete e del traffico, avendo la possibilità di utilizzare un sistema aperto quale linux per modificare a proprio piacimento il comportamto del proprio custom AP.  Di cosa dobbiamo dotarci per raggiungere questo obiettivo?

  • 1 Raspberry pi 3
  • 1 microsd di almeno di 8 GB preferibilmente 32Gb.

 

Installazione dei tools necessari

Il progetto è molto semplice, pertanto per raggiungere l’obiettivo, sarà sufficiente installare due pacchetti :

  1. HostAPD  (Host access point daemon) è un software per la gestione dell’interfaccia  wireless e anche un server di autenticazione
  2. DNSMasq è un  server DHCP che eroga anche servizi di cache DNS.

Iniziamo la procedura collegandoci  alla raspberry via terminale ad esempio via ssh  o direttamente in console procedendo subito all’installazione dei paccheti eseguendo  il comando:

sudo apt install dnsmasq hostapd

dovreste ottenere qualcosa del genere:

pi@raspberrypi:~ $ sudo apt install dnsmasq hostapd
Lettura elenco dei pacchetti... Fatto
Generazione albero delle dipendenze       
Lettura informazioni sullo stato... Fatto
I seguenti pacchetti aggiuntivi saranno inoltre installati:
  dns-root-data dnsmasq-base
I seguenti pacchetti NUOVI saranno installati:
  dns-root-data dnsmasq dnsmasq-base hostapd
0 aggiornati, 4 installati, 0 da rimuovere e 1 non aggiornati.
È necessario scaricare 400 kB/1.052 kB di archivi.
Dopo quest'operazione, verranno occupati 2.666 kB di spazio su disco.
Continuare? [S/n] S
Scaricamento di:1 http://archive.raspberrypi.org/debian buster/main armhf dnsmasq-base armhf 2.80-1+rpt1 [400 kB]
Recuperati 400 kB in 1s (712 kB/s)
Selezionato il pacchetto hostapd non precedentemente selezionato.
(Lettura del database... 158415 file e directory attualmente installati.)
Preparativi per estrarre .../hostapd_2%3a2.7+git20190128+0c1e29f-6+deb10u1_armhf.deb...
Estrazione di hostapd (2:2.7+git20190128+0c1e29f-6+deb10u1)...
Selezionato il pacchetto dns-root-data non precedentemente selezionato.
Preparativi per estrarre .../dns-root-data_2019031302_all.deb...
Estrazione di dns-root-data (2019031302)...
Selezionato il pacchetto dnsmasq-base non precedentemente selezionato.
Preparativi per estrarre .../dnsmasq-base_2.80-1+rpt1_armhf.deb...
Estrazione di dnsmasq-base (2.80-1+rpt1)...
Selezionato il pacchetto dnsmasq non precedentemente selezionato.
Preparativi per estrarre .../dnsmasq_2.80-1+rpt1_all.deb...
Estrazione di dnsmasq (2.80-1+rpt1)...
Configurazione di dnsmasq-base (2.80-1+rpt1)...
Configurazione di dns-root-data (2019031302)...
Configurazione di dnsmasq (2.80-1+rpt1)...
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /lib/systemd/system/dnsmasq.service.
Configurazione di hostapd (2:2.7+git20190128+0c1e29f-6+deb10u1)...
Created symlink /etc/systemd/system/multi-user.target.wants/hostapd.service → /lib/systemd/system/hostapd.service.
Job for hostapd.service failed because the control process exited with error code.
See "systemctl status hostapd.service" and "journalctl -xe" for details.
Created symlink /etc/systemd/system/hostapd.service → /dev/null.
Elaborazione dei trigger per systemd (241-7~deb10u1+rpi1)...
Elaborazione dei trigger per man-db (2.8.5-2)...
Elaborazione dei trigger per dbus (1.12.16-1)...
pi@raspberrypi:~ $

Installati i software, procediamo alla disattivazione  dei servizi installati, almeno fin quando non saranno  opportunamente modificati i files di configurazione.  Lanciamo i seguenti comandi:

sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

Scenario di utilizzo

Per procedere alla fase di configurazione ipotizziamo che lo  scenario di utilizzo sarà quello più semplice, costituito da un access point che eroga servizio di connettività ad una rete di client il cui indirizzamento sarà 192.168.3.0/24. Alla raspberry assegneremo l’indirizzo statico 192.168.3.1 che per convenzione identifica spesso l’ip del  gateway. Come SSID (nome della rete wireless)  utilizzeremo : TestReteWifi.

 

 

Configurazione di un IP statico

Per configurare  l’indirizzo ip statico,da assegnare all’interfaccia  wireless, sarà necessario, innanzitutto,  identificarne il nome tra quelle disponibili. La raspberry pi 3  ha come caratteristiche di  fabbrica una sola interfaccia wireless, che su linux viene indentificata generalemente come wlan0, ma per sicurezza , nel caso in cui desciste di utilizzare, anche, dei dongle wifi, basterà lanciare  il comando seguente per assicurarsi di utilizzare l’identificativo di interfaccia corretta.

sudo ifconfig -a

dovreste ottenere qualcosa del genere:

pi@raspberrypi:~ $ sudo ifconfig -a

eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:5c:a7:01  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.50  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::f16f:5c00:be2b:c88f  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:09:f2:54  txqueuelen 1000  (Ethernet)
        RX packets 13238  bytes 4959004 (4.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 888  bytes 114046 (111.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Come previsto nel mio caso l’interfaccia di  interesse è la wlan0.

Per configurare l’indirizzo IP statico, da assegnare alla interfaccia della raspberry, andremo a  modificare  il file di configurazione dhcpcd.

Attenzione!  qualora in si stia lavorando già via wifi, nel momento in cui verrà modificato l’ip della wlan0  si perderà  la connessione di rete, per cui, vi suggerisco  di connettere la raspberry ad un cavo di rete, in modo da evitare in questa fase problemi di raggiungibilità dal vostro pc.

A questo punto sarà sufficiente editare il file dhcpcd.conf, lanciando  il comando

sudo vi /etc/dhcpcd.conf

oppure

sudo nano /etc/dhcpcd.conf

dipende dalle vostre preferenze, per aggiungere in coda  la seguente configurazione:

interface wlan0
    static ip_address=192.168.3.1/24
    nohook wpa_supplicant

Configurazione del DHCP server (dnsmasq)

Il servizio  DHCP come abbiamo già anticiapato sarà erogato da dnsmasq. Per default, la configurazione contiene  numerose informazioni, per cui, per semplificazione proveremo a riscrivere da zero un nuovo  file, facendo prima un opportuno backup del file originale. Eseguiamo duqnue i seguenti comandi per fare il backup e per editare il nuovo file di configurazione:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf

Inseririamo le seguenti informazioni nel file dnsmasq.conf e salviamo:

interface=wlan0      # Use the require wireless interface - usually wlan0
dhcp-range=192.168.3.2,192.168.3.20,255.255.255.0,24h

riavviamo il servizio  dnsmasq.

sudo systemctl start dnsmasq

Il server dhcp a questo punto è già pronto ad erogare ai client gli indirizzi ip, inclusi nel range compreso tra 192.168.3.2 e 192.168.3.20

Configurazione  di hostapd

Per completare la configurazione editiamo il file /etc/hostapd/hostapd.conf ed aggiungiamo i parametri necessari partendo da un file vuoto.

sudo nano /etc/hostapd/hostapd.conf

La configurazione che faremo ipotizza di  utilizzare :

  • il canale 7 come banda di frequenza;
  • SSID : TestReteWifi
  • password PasswordDiReteWifi

Ricordatevi che la passphrase dovrà avere una lunghezza compresa tra 8 e 64 caratteri, compatibilimente con le specifiche imposte dal protocollo  di sicurezza scelto wpa2.

Di seguito, trovrete  una piccola leggenda che vi consentirà eventualmente di scegliere opportunamente la banda di frequenza dell’AP a voi più utile. Nel nostro esempio useremo la configurazione hw_mode=g, ma potete decidere di cambiarla in funzione delle vostre esigenze.

  • a = IEEE 802.11a (5 GHz)
  • b = IEEE 802.11b (2.4 GHz)
  • g = IEEE 802.11g (2.4 GHz)
  • ad = IEEE 802.11ad (60 GHz)

Riporto di seguito la configurazione da copiare nel file /etc/hostapd/hostapd.conf

interface=wlan0
driver=nl80211
ssid=TestReteWifi
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=PasswordDiReteWifi
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

A questo punto possiamo attivare la configurazione creata, editando il seguente  file:

sudo nano /etc/default/hostapd

cercate all’interno la linea  contenente questa stringa : #DAEMON_CONF  e sostituitela con questa:

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

Riavviamo il servizio di rete dhcpcd per riconfigurare l’indirizzo della  wlan0:

sudo service dhcpcd restart

Abilitiamo e riavviamo hostapd:

sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

oppure riavviamo la raspberry.

A questo punto dovremmo già trovare, tra le reti wifi disponibili, quella configurata. Per una verifica sullo stato dei servizi potrete usare i seguenti comandi:

sudo systemctl status hostapd
sudo systemctl status dnsmasq

Sarà già possibile a questo punto far connetttere dei client alla rete wifi creata, ma non sarà ancora possibile ad esempio connettersi al di fuori  della rete stessa. Cerchiamo di capire come abilitare, dunque,  i client alla navigazione internet  via raspberry.

Configurazione del routing e del masquerade (NAT)

Editare /etc/sysctl.conf  lanciando il comando:

 sudo nano /etc/sysctl.conf 

andare alla riga che contiene la stringa seguente  e decommentare togliendo il #.

#net.ipv4.ip_forward=1

A questo punto il sistema sarà abilitato a ruotare i pacchetti da un’iterfaccia ad un altra, ma ancora non sarà possibile navigare in quanto gli ip dei client appartengono ad una rete privata, quindi sarà necessario mascherarli/nattarli per consentire il traffico in uscita sull’interfaccia  eth0, che supponiamo  sia connessa ad esempio ad un router abilitato alla navigazione internet. Per nattare la rete verso il traffico su eth0 sarà sufficiente  eseguire questo comando.

sudo iptables -t nat -A  POSTROUTING -o eth0 -j MASQUERADE

e per rendere le modifiche definitive basterà creare un  file di configurazione eseguendo il seguente comando

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

Aggiungiamo al file  /etc/rc.local la seguente riga in modo che al reboot della raspberry la configurazione di iptables venga caricata opportunamente.

iptables-restore < /etc/iptables.ipv4.nat

dovreste ottenere qualcosa di simile:

#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

iptables-restore < /etc/iptables.ipv4.nat

exit 0

La nostra raspberry è finalmente diventata un access point.

Comments