Faire de votre Raspberry Pi un point d’accès WiFi, oui c’est faisable.

Lorsque j’ai acheté mon Raspberry Pi, j’avais plusieurs projets pour lui, le premier étant d’en faire un hotspot WiFi puisque ma box n’émet pas assez fort pour aller jusque dans ma chambre et que bien que je possède de l’Ethernet jusqu’à mon ordinateur (avec un magnifique fil qui passe sous le toit ^^), mon iPod, mon téléphone et ma tablette ne possèdent pas de port Ethernet (You don’t say ?!). J’ai donc cherché sur plusieurs sites des tutoriels pour faire un point d’accès, mais aucun n’a fonctionné entièrement, pas même celui d’Adafruit, qui m’avait vendu le dongle WiFi et qui me promettait que le tutoriel fonctionnait pour tous ses produits… Peut être un problème de configuration relatif à la version des logiciels utilisés, aucune idée, mais le fait est que j’ai finalement réussi à faire ce que je souhaits initialement. Le truc c’est que ça m’a pris une semaine avec en plus un certain nombre de réinstallations de Raspbian. Alors… on y va ?

Nettoyage du système et prérequis

Note importante : dans ce tutoriel, j’utilise un plug-in WordPress pour colorer le code, cependant celui-ci présente un bug avec les esperluettes (ou “et commerciaux”). A chaque fois que vous verrez écrit

&

transformez ça en &.

Cette étape n’est utile que pour les gens qui auraient déjà essayé de configurer un hotspot WiFi sur leur Raspberry Pi. Si possible (genre si vous n’avez pas des tas de données sur votre Pi), vous pouvez aussi le faire, ça fait toujours du bien de partir d’un système propre. Comme précisé dans la phrase en italique, si vous le pouvez, réinstaller Raspbian. Ca ne prend pas beaucoup de temps et ça vous permettra de commencer la configuration d’un système entièrement propre. Comme les logiciels utilisés ont tendance à être pointilleux sur la configuration, mieux vaut prévenir que guérir.

Vous aurez besoin de :

  • Un Raspberry Pi Model B
  • Un dongle WiFi (du type que vous souhaitez mais celui que j’ai utilisé est recommandé puisqu’il fonctionne à 100% avec ma méthode)
  • Une connexion Internet en Ethernet. Pour vérifier qu’elle fonctionne, entrez simplement en ligne de commande
    ping google.com

    Vous devez recevoir des réponses du type :

    PING google.com (173.194.67.139) 56(84) bytes of data.
    64 bytes from wi-in-f139.1e100.net (173.194.67.139): icmp_req=1 ttl=44 time=228 ms
    64 bytes from wi-in-f139.1e100.net (173.194.67.139): icmp_req=2 ttl=44 time=230 ms
    64 bytes from wi-in-f139.1e100.net (173.194.67.139): icmp_req=3 ttl=44 time=246 ms

    Si ce n’est pas le cas, vérifiez que votre câble Ethernet est bien relié à votre box ou a votre routeur et que celui-ci est lui aussi connecté. Si ça ne fonctionne toujours pas, vous devriez peut être aller vérifier votre fichier /etc/network/interfaces.
    Notez que vous devrez arrêter la commande vous même. Quand vous le voudrez, appuyez simplement sur Ctrl + C

Quelques conseils :

N’utilisez pas directement votre Raspberry Pi pour modifier les fichiers et entrer les commandes (cela permet d’éviter un certain nombre d’erreurs, de pertes de temps et de fautes de frappe). Si mon raisonnement est juste, votre Pi est relié à Internet et aussi à votre réseau local, téléchargez donc PuTTY si vous ne l’avez pas encore. Une fois téléchargé, lancez-le et configurez le de cette manière :
– Entrez pi@<ip> dans Host Name (or IP address), vous pouvez obtenir votre IP en utilisant ifconfig directement dans la console du Raspberry.
– Entrez un nom sous Saved Sessions, puis cliquez sur Save. Une fois que l’entrée a été ajoutée à la liste, vous pouvez directement double-cliquer dessus.
PuTTY Config

Sécurité Putty
A ce moment là, cliquez sur Oui (vous faites confiance à votre Raspberry Pi). Une fois votre mot de passe entré, vous avez votre console Linux depuis votre PC, mais surtout vous pouvez faire du copier-coller.

Installation des logiciels nécessaires

Pour faire fonctionner notre réseau WiFi, nous aurons besoin de plusieurs choses qui ne sont pas installées par défaut sur Raspbian (ni sur Linux d’ailleurs) :

  • hostapd : LE logiciel Linux utilisé pour faire des points d’accès WiFi
  • dnsmasq : serveur de cache DNS, mais surtout dans notre cas serveur DHCP, utilisé pour assigner des adresses IP aux clients (si il n’est pas installé, impossible de rejoindre les réseaux, même si on peut les voir et interagir)

Nous devrons ensuite télécharger une version alternative de hostapd (pour notre dongle) puis configurer la translation d’adresse IP pour pouvoir accéder à Internet depuis le réseau sans-fil (notez que si vous voulez juste faire un réseau WiFi, pour jouer avec des amis par exemple, vous pouvez ne pas mettre Internet, mais ça ne coûte pas grand chose de le mettre). Pour ce faire, entrez les commandes suivantes directement dans la console :

sudo apt-get update
sudo apt-get install hostapd
sudo apt-get install dnsmasq

 Mais c’est trop vite oublier que notre dongle n’est pas supporté par défaut… Heureusement j’ai la solution pour vous. Adafruit nous propose (et ce n’est pas le seul) une version modifiée de hostapd qui utilise un autre pilote qui fonctionne. Depuis une récente version de RaspBian (début 2014), ce fichier n’est plus valide. J’ai mis à jour les commandes qui utilisent maintenant un nouveau pilote, elles ont fonctionné pour moi. Pour l’installer, rentrez simplement ces commandes :

cd ~/ && mkdir tmp && cd tmp
sudo wget https://thomaskowalski.net/fichiers/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
sudo unzip RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911
cd wpa_supplicant_hostapd
sudo tar -xvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812
cd hostapd
sudo make
sudo make install
sudo mv hostapd /usr/sbin/hostapd
sudo chown root.root /usr/sbin/hostapd
sudo chmod 755 /usr/sbin/hostapd
cd ~/ && rmdir tmp

 Nous allons maintenant configurer hostapd. Pour ce faire, entrez la commande suivante :

sudo nano /etc/hostapd/hostapd.conf

Un éditeur de fichier texte, baptisé nano va s’ouvrir afin de vous permettre d’éditer la configuration. Voici un bon fichier de configuration :

interface=wlan0
driver=rtl871xdrv
ssid=<Votre_Nom_De_Reseau>
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=<Votre_Mot_De_Passe>
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

Remplacez bien sûr <Votre_Nom_De_Reseau> et <Votre_Mot_De_Passe> par les valeurs correspondantes (mettez toutefois un mot de passe plus long que six caractères). Nous allons maintenant modifier vos interfaces réseau pour que vous puissiez avoir une IP fixe en WiFi… Entrez

sudo nano /etc/network/interfaces

Et voilà l’éditeur de texte qui revient.

#Boucle locale :
auto lo

#Ethernet (en DHCP)
iface lo inet loopback
iface eth0 inet dhcp

#Paramètres par défaut du WiFi que l'on désactive en ajoutant des #
#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

#Notre configuration WiFi
auto wlan0
iface wlan0 inet static
adress 10.0.0.1
netmask 255.255.255.0

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

Une fois le réseau créé, votre adresse IP dessus sera donc 10.0.0.1. Passons à la configuration de dnsmasq, celui qui s’occupe du DHCP (des adresses IP des clients). Entrez

sudo nano /etc/dnsmasq.conf

Vous aurez cette fois un énorme fichier. Laissez Ctrl+V appuyé pendant quelques temps et beaucoup de lignes défileront. Ces options sont avancées et nous ne nous y attarderons pas, nous nous contenterons d’ajouter quelques lignes à la fin du fichier :

# Interface réseau à utiliser (wlan0 par défaut)
interface=wlan0
# Adresses minimum et maximum du réseau et temps du bail
dhcp-range=10.0.0.3,10.0.0.20,12h
# DNS à envoyer aux clients. Ne changez pas ceci.
server=8.8.8.8
server=8.8.4.4
# Instruction qui empêchera le réseau de fonctionner si elle est absente (en tout cas pour moi)
dhcp-authoritative

Passons à la suite. Vous allez devoir configurer la translation d’adresse IP. C’est un peu barbare comme appellation, mais vous aurez juste quelques commandes à rentrer, rien de bien compliqué ne vous inquiétez pas.

sudo sysctl net.ipv4.ip_forward=1
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
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
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

Nous allons maintenant avoir besoin d’un fichier de lancement, sans lequel le réseau WiFi ne fonctionnera pas… Je vous propose celui-ci qui fonctionne à merveille avec moi (note : appelez-le “s”) :

#!/bin/bash
sudo cp /etc/hostapd/hostapd.conf /etc/hostapd.conf
sudo ifconfig wlan0 10.0.0.1
sudo service dnsmasq restart
sudo sysctl net.ipv4.ip_forward=1
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
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo hostapd /etc/hostapd.conf
sudo iptables -D POSTROUTING -t nat -o ppp0 -j MASQUERADE
sudo sysctl net.ipv4.ip_forward=0
sudo service dnsmasq stop
sudo service hostapd stop
sudo service dnsmasq start
sudo service hostapd start

Je sais, il y a un certain nombre d’incohérences et de choses qui peuvent paraître inutiles mais sans ça ça ne fonctionne pas… Donc je vous laisse l’utiliser (mais ne modifiez rien, je vous promets que ça marche comme ça).

Pour lancer votre point d’accès, il vous suffit maintenant d’écrire dans la console sh s ou si vous ne l’avez pas appelé “s” (petit rebelle…), sh <votrenom>.

Lancer le hotspot au démarrage

Oui, ça peut paraître pas indispensable et pourtant croyez-moi, devoir aller ouvrir le SSH à chaque fois que l’on veut démarrer le hotspot, c’est pas pratique ! Comment est-ce qu’on fait alors ? C’est facile. Il vous suffit d’entrer la commande suivante pour éditer les crontabs :

sudo crontab -e

Ensuite, descendez tout en bas et ajoutez la ligne suivante :

@reboot sh /home/pi/s &

Sachant que le /home/pi/s doit correspondre au chemin de votre script de lancement. (pour récupérer l’adresse du dossier où vous vous trouvez, utilisez pwd). Le & sert quant à lui à ne pas afficher les événements dans la console. Merci à Mysterystem pour l’astuce, puisque je moi je n’étais pas parvenu à le lancer au démarrage (j’avais essayé avec init.d)

Voilà, normalement tout fonctionne, et si tel n’est pas le cas, n’hésitez pas à me contacter de toutes les manières que vous voulez !