======= 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 ([[https://www.balena.io/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: 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: 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: 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 !