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 :

# 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…

# 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 !

  • howto/raspberry-pi/wirelessaccespoint.txt
  • Dernière modification : 2021/07/07 15:10
  • de admin