Création d'un point d'accès Wifi sur un Raspberry Pi (Raspbian Buster)
Pour s'amuser avec des ESP et autres objets connectés on a besoin souvent de créer un réseau wifi local. Si vous n'avez pas de vieux routeur Wifi pour faire ça, vous pouvez utiliser un Raspberry Pi qui vous permettra de créer un tel point d'accès Wifi.
#1- Le principe
Sur la base d'une distribution Raspbian on va :
- Configurer l'interface Wifi pour lui donner une ip fixe
- Installer puis configurer un logiciel qui s'occupera d'attribuer des adresses ip aux clients qui se connecteront à notre point d'accès : dnsmasq
- Installer puis configurer un logiciel qui permet de créer un point d'accès Wifi : hostapd
#2- Install Raspbian
À l'aide d'Etcher (Disponible ici) on copie une image raspbian buster lite sur une carte microSD.
#3- Configuration du réseau Internet
On part du principe que notre Raspberry Pi est connecté à Internet par son interface filaire nommée *eth0*, l'interface Wifi nommée *wlan0* sera utilisée par le point d'accès.
On active l'interface filaire par la commande :
sudo ifconfig eth0 up
On vérifie qu'on a bien une adresse ip de notre réseau local avec la commande :
ip a
qui doit nous retourner un truc du style :
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:53:0b:b0 brd ff:ff:ff:ff:ff:ff inet 192.168.88.136/24 brd 192.168.88.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::e82e:71df:7349:3289/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether b8:27:eb:06:5e:e5 brd ff:ff:ff:ff:ff:ff
On voit dans cet exemple que l'interface filaire nommée *eth0* a l'adresse ip 192.168.88.136
Dans le cas contraire il peut être nécessaire de désactiver l'interface filaire eth0 :
sudo ifconfig eth0 down
avant de la réactiver :
sudo ifconfig eth0 up
#3- Mise à jour du système
On met à jour la liste des paquets disponibles dans le dépôt par la commande :
sudo apt-get update
puis on met à jour les paquets installés.
sudo apt-get upgrade
Il sera peut être nécessaire de redémarrer le système avec la commande:
sudo reboot
#4- Configuration de l'interface Wifi
On prépare notre interface Wifi en ajoutant à la fin du fichier /etc/dhcpcd.conf
interface wlan0 static ip_address=192.168.0.254/24 nohook wpa_supplicant
Bien entendu vous pouvez donner l'adresse ip que vous souhaitez à votre interface, dans cet exemple notre Raspberry créera un réseau local avec des adresses de type 192.168.0.xxx et lui même utilisera l'adresse 192.168.0.254.
On vérifie que wlan0 ne soit pas bloquée par RF-kill
Si la commande rfkill list
renvoie un résultat tel que :
0: phy0: Wireless LAN Soft blocked: yes Hard blocked: no
alors wlan0 est bloquée. Pour y remédier on débloque l'interface par la commande
sudo rfkill unblock 0
#5- Installation et configuration du DHCP Lorsqu'un client se connecte au point d'accès wifi on doit lui assigner une adresse ip. C'est le rôle de dnsmasq qui fera office à la fois de serveur dhcp ainsi que de cache DNS.
On l'installe avec la commande :
sudo apt-get install dnsmasq
On fait une copie du fichier de configuration par défaut (ça peut toujours servir un jour…) :
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
On crée et on édite un nouveau fichier /etc/dnsmasq.conf en y insérant simplement :
# On utilise l'interface wifi wlan0 interface=wlan0 #On définit une plage d'adresse ip ainsi que la durée du bail dhcp-range=192.168.0.1,192.168.0.100,255.255.255.0,24h
Bien entendu, à vous de dimensionner l'étendue de la plage d'adresses ainsi que la durée du bail en fonction du besoin. Dans cet exemple notre serveur dhcp pourra attribuer 100 adresses ip de 192.168.0.1 à 192.168.0.100, la bail est fixé à 24h avant renouvellement.
#6- Mise en place du point d'accès Wifi
On installe le logiciel hostapd par la commande :
sudo apt-get install hostapd
La configuration se fait en créant un fichier /etc/hostapd/hostapd.conf :
Exemple 1 : Un simple point d'accès ouvert
# interface wlan du Wi-Fi interface=wlan0 # nl80211 avec tous les drivers Linux mac80211 driver=nl80211 # Nom du réseau Wi-Fi ssid=Raspiwifi # mode Wi-Fi utilisé : a = IEEE 802.11a (5GHz) , b = IEEE 802.11b (2.4GHz), g = IEEE 802.11g) (2.4GHz) hw_mode=g # canal de fréquence Wi-Fi (1-14) channel=6
Si votre réseau local n'a pas besoin d'être connecté à Internet, c'est une solution simple et rapide à mettre en œuvre mais dans un le cas contraire il serait peut être plus sage d'utiliser une clef WPA2…
Exemple 2 : Un point d'accès avec clef WPA2
# interface wlan du Wi-Fi interface=wlan0 # nl80211 avec tous les drivers Linux mac80211 driver=nl80211 # Nom du réseau Wi-Fi ssid=Raspiwifi # Sécurité activée auth_algs=1 #Type de clef wpa=2 #La clef wpa_passphrase=CeciEstMaClefWPA2 # Modes de sécurité wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP # mode Wi-Fi utilisé : a = IEEE 802.11a (5GHz) , b = IEEE 802.11b (2.4GHz), g = IEEE 802.11g) (2.4GHz) hw_mode=g # canal de fréquence Wi-Fi (1-14) channel=6
On indique à hostapd qu'il doit utiliser ce fichier de configuration en éditant le fichier /etc/default/hostapd afin qu'il contienne :
DAEMON_CONF="/etc/hostapd/hostapd.conf"
#7- On relance les services
On (re)démarre le serveur dhcp :
sudo systemctl restart dnsmasq
On active le service hostapd :
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
#8 - On teste et on vérifie
Si les services ont démarré sans message d'erreur alors votre point d'accès Wifi est en place, tentez de connecter un périphérique quelconque type smartphone, ordi, ESP… Vous devriez voir les évènement consignés dans le fichier de log /var/log/syslog.
Par exemple :
cat /var/log/syslog
nous montre :
Apr 1 15:43:08 raspberrypi hostapd: wlan0: STA 28:48:ca:e9:da:ff IEEE 802.11: associated Apr 1 15:43:08 raspberrypi hostapd: wlan0: STA 28:48:ca:e9:da:ff RADIUS: starting accounting session E2B35E97F7D9D551 Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPDISCOVER(wlan0) 28:48:ca:e9:da:ff Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPOFFER(wlan0) 192.168.0.83 28:48:ca:e9:da:ff Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPDISCOVER(wlan0) 48:88:ca:f9:ea:dd Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPOFFER(wlan0) 192.168.0.83 28:48:ca:e9:da:ff Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPREQUEST(wlan0) 192.168.0.83 28:48:ca:e9:da:ff Apr 1 15:43:11 raspberrypi dnsmasq-dhcp[974]: DHCPACK(wlan0) 192.168.0.83 28:48:ca:e9:da:ff
Le service hostapd a bien associé le périphérique dont l'adresse MAC est : 28:48:ca:e9:da:ff
Le serveur dnsmasq a bien répondu à la demande d'adresse ip du client en lui offrant l'adresse 192.168.0.83
#9- Les baux d'adresse ip On peut consulter les baux en cours d'utilisation par notre serveur dhcp en ouvrant le fichier /var/lib/misc/dnsmasq.leases
Par exemple :
cat /var/lib/misc/dnsmasq.leases
Affiche
1554216191 28:48:ca:e9:da:ff 192.168.0.83 * 28:48:ca:e9:da:ff
avec :
- 1554216191 = expiration du bail en temps posix soit le nombre de secondes écoulées depuis le 1er janvier 1970
- 28:48:ca:e9:da:ff = adresse MAC du client
- 192.168.0.83 = adresse ip du client
- * = nom de du périphérique (s'il est disponible)
- Client-ID s'il est disponible, sinon une nouvelle fois l'adresse MAC du client
Si toutefois vous souhaitez résilier manuellement un bail il suffit de supprimer la ligne correspondante dans ce fichier.
#10- Et si on leur donnait accès à Internet ?
Jusqu'à présent les clients connectés au point d'accès du Raspberry Pi n'ont pas accès à Internet, si on veut leur ouvrir l'accès il reste un 'bridge' à configurer :
- Activer l'IP Forwarding en modifiant le fichier /etc/sysctl.conf pour dé-commenter la ligne (= supprimer le # devant)
net.ipv4.ip_forward=1
- Ajouter une règle de parefeu :
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Pour rendre cette règle persistante après redémarrage :
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
Puis on édite le fichier /etc/rc.local pour ajouter juste au dessus de la ligne *exit 0* :
iptables-restore < /etc/iptables.ipv4.nat
- Construire un pont de connexion à l'aide de bridge-utils :
On installe bridge-utils :
sudo apt-get install bridge-utils
On crée un nouveau pont nommé br0 :
sudo brctl addbr br0
On connecte notre interface eth0 au pont br0 :
sudo brctl addif br0 eth0
On ajoute notre pont en tant qu'interface réseau en ajoutant au fichier /etc/network/interfaces :
auto br0 iface br0 inet manual bridge_ports eth0 wlan0
Enfin on on modifie le fichier /etc/hostapd/hostapd.conf pour ajouter sous la ligne interface=wlan0 :
bridge=br0
Après redémarrage du système les clients ont accès à Internet !