Faire de votre Raspberry Pi un point d’accès WiFi, oui c’est faisable.
mercredi 4 décembre 2013 à 08:48Lorsque 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.
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 http://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 !