Tranformer son Raspberry Pi en routeur Wifi avec Hostapd

raspberry hotspotBonjour à tous ! Aujourd’hui, un rapide article sur une petite combine qui pourra en dépanner plus d’un. On va voir comment utiliser la carte WiFi de son Raspberry non pas pour se connecter à un réseau, mais pour en créer un ! En d’autres termes, comment transformer son Raspberry en routeur WiFi ou comment créer un hotspot wifi avec un Raspberry Pi. Intéressant, n’est-ce pas ?

Pourquoi créer un réseau WiFi ou Access Point avec son Raspberry Pi ?

Question légitime à laquelle je vais essayer de répondre rapidement. Il peut être parfois utile de retransmettre son réseau filaire en WiFi et à moins d’avoir un routeur sous la main, l’opération n’est normalement pas possible.

Je vous donne un exemple simple. Lorsque j’étais étudiant, j’étais dans une chambre du CROUS. J’avais la chance d’avoir internet gratuitement via une prise réseau directement dans ma chambre. Seulement, voilà, j’avais un ordinateur fixe, deux pc portables dont un ultraportable sans prise réseau et un téléphone Android. Vous commencez à voir le problème ? Pas moyen d’avoir internet sur un de mes PC et sur mon téléphone quand j’étais chez moi…

Au bout d’un moment j’ai décidé de prendre un routeur et de me créer mon point d’accès WiFi pour connecter toutes mes machines à cette fichue prise. Seulement, voilà, à l’époque le Raspberry Pi 3 n’existait pas et j’ai donc dû investir dans un véritable routeur (50-70€).
Aujourd’hui, j’utilise un raspberry pi comme point d’accès wifi pour 2 à 3 fois moins chère.

Un second exemple simple : un téléphone Android ne peut pas se connecter en Ad-hoc à un autre PC, dans le cas où on a besoin de connecter un Raspberry à un téléphone, la solution est de créer un access point (j’ai eu le souci au travail donc je sais de quoi je parle). Il y a toujours la solution de créer un hotspot wifi avec le téléphone mais dans notre cas on veut faire un hotspot wifi avec le Raspberry.

Créer son point d’accès WiFi sur son Raspberry avec hostapd

Très de bavardage, passons aux choses sérieuses.

Commençons par installer hostapd, le soft qui va transformer notre Raspberry Pi en routeur WiFi :

sudo apt-get update

sudo apt-get install hostapd

Maintenant, on va créer un fichier de configuration pour hostapd dans /etc/hostapd.

Vim /etc/hostapd/hostapd.conf

On va y coller la configuration suivante :

interface=wlan0

driver=nl80211

ssid= DADAREVUE-WIFI

channel=1

hw_mode=g

auth_algs=1

wpa=3

wpa_passphrase=DADAREVUE-PASSWORD

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP CCMP

rsn_pairwise=CCMP

N’oubliez pas de modifier les valeurs du ssid et de wpa_passphrase pour personnaliser votre réseau WiFi.

Voilà, maintenant on sauvegarde et on lance le service :

sudo services hostapd start

Si le service ne démarre pas, vérifiez dans le fichier /etc/default/hostapd que la variable suivante pointe bien vers votre fichier de conf comme ci-dessous :

DAEMON_CONF="/etc/hostapd/hostapd.conf"

Et voilà ! Le tour est joué, vous utilisez maintenant votre Raspberry comme point d’accès WiFi.

IPTables, NAT et IP forwarding

Voilà, vous avez un Raspberry Pi routeur qui émet maintenant son propre réseau Wifi. C’est super, mais lorsque vous connectez dessus, vous n’avez pas internet, et ce même si votre Raspberry y est connecté via Ethernet.
C’est là que l’IP forwarding, le NAT et iptables entrent en jeu.
En gros, on va faire un pont entre le WiFi et l’Ethernet afin de donner l’accès à internet aux machines connectées en Wifi.
Pour cela, on va avoir besoin d’un service Linux qui se nomme IPtables. IPtables c’est un outil magique; on peut faire beaucoup de choses avec : du NAT (comme on va faire ici), du filtrage de port ou encore faire un firewall complet (j’en ai déjà parlé dans l’article pour sécuriser son Raspberry Pi).

IP forwarding

Commençons par activer l’IP forwarding en ipv4 :

Dans le fichier /etc/sysctl.conf, on va décommenter la ligne suivante :

net.ipv4.ip_forward=1

Voilà, c’est tout pour l’ip forwarding. Il ne vous reste plus qu’à redémarrer votre Raspberry Pi pour que l’option soit prise en compte.

NAT et IPtables

Maintenant, il ne nous reste plus qu’à faire notre pont entre l’Ethernet et le Wifi pour avoir accès à internet depuis le Wifi.
Pour cela, comme je l’ai déjà dit, nous allons utiliser IPtables.
Commençons par créer un fichier qui contiendra nos règles d’IPtables :

vim /etc/iptables.conf

Dans le fichier, on ajoute les lignes suivantes :

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

On va ajouter automatiquement ces IPtables au démarrage de l’interface Eth0 sur votre Rpi.
Pour cela, on va créer le fichier iptables dans /etc/network/if-up.d/ et y ajouter les lignes suivantes :

#!/bin/bash

/sbin/iptables-restore < /etc/iptables.conf

Voilà, vos règles devraient être exécutées au démarrage de votre Rpi.

Maintenant on redémarre le tout, on se connecte au hotspot WiFi du Raspberry et on test qu’internet fonctionne bien.

~~~~

Voilà, en espérant que ce petit article vous aura plu. C’est une opération sympa, qui ne prend que quelques minutes et qui peut s’avérer très utile.

Comme toujours, si vous avez aimé l’article ou qu’il vous a été utile, n’hésitez pas à le partager sur les réseaux sociaux.
À bientôt sur www.DaDaRevue.com !

 

28 commentaires

  1. Bonjour,

    Merci pour cet article. Y aurait-il un moyen de configurer un proxy d’entreprise ?
    Cela aurait pour effet d’eviter de configurer tous mes devices un à un avec ce proxy. Dans mon idée, je le fais une seul fois sur l’interface eth0 du pi et c’est tout.

    ?
    merci

    1. Bonjour !

      Merci pour ton commentaire.

      Voyons si je comprends bien ta question.

      D’un côté tu as un proxy d’entreprise pour filtrer. De l’autre tu utilise ton raspberry comme routeur wifi pour partager la connexion qu’il reçoit en ethernet.
      Ta question est de savoir si en configurant le proxy sur l’eth de ton raspberry, la connexion qu’il va emmètre en wifi sera filtrée elle aussi. C’est bien ça ?
      Si c’est bien la question, la réponse est oui. Si ton proxy est configuré sur l’eth de ton raspberry, et qu’il partage l’eth en Wifi, celui-ci sera filtré par la même occasion.

      Par contre il est possible que les postes nécessitent quand même la configuration du proxy au niveau de l’OS ou du navigateur afin que la navigation ou les mises à jours se passent bien. À vérifier en testant sur un poste connecté en Wifi. Certains proxy sont transparent au niveau des OS et ne nécessitent pas de configuration supplementaires et d’autres non. Comme je ne connais pas exactement la configuration de ton proxy je ne peux pas te confirmer que ce sera transparent au niveaux des postes. Ce que je peux te confirmer c’est que le filtrage sur le Wifi sera bien fait.

      En espérant que ma réponse aura pu t’aider. Si tu as d’autres questions n’hésite pas à poster un autre commentaire.

      David

      1. Oui c’est bien ça.
        Tu as bien compris 🙂

        En fait, il existe deux moyens de configurer le proxy :
        1/ Proxy PAC : http://proxypac.priv.xxxxxx.xx/proxy.pac
        ou
        2/ Avec une adresse IP sur le port 80, chopée dans le fichier proxy PAC.

        La vrai raison de ce besoin, n’est pas de pirater ou de créer du tord mais un réel besoin technique.
        Je suis développeur et j’utilise un multitude d’outil (java, eclipse, navigateur, maven , nodejs, git, mise à jour linux, n machine virtuelle de dev, …). C’est devenu l’enfer pour travailler. J’ai pourtant exposé mon problème mais y a pas vraiment de réponse positive… Dans je travaille en 4g 🙁

        Avant, j’ai essayé de configurer un fileHub (petit boitier wifi) mais je ne m’en sors pas. Alors peut-être qu’avec mon RPI, ça pourrait le faire. Le problème étant de trouver la bonne configuration.

        1. Du coup l’idée est d’utiliser le Raspberry pour contourner le proxy afin que tu puisse utiliser tes outils sans soucis ? J’ai déjà eut le problème à l’université où le proxy bloquait beaucoup de choses dont des outils de dev qui étaient nécessaires pour les études (logique).

          Malheureusement, via hostapd le filtrage se fera quand même au niveau du proxy par la connexion du Raspberry car les paquets sont transparents pour le proxy. Le Raspberry ne fait qu’un simple pont entre Wlan0 et Eth0 et Eth0 est filtré.

          Une solution serait de configurer un VPN à l’extérieur de l’entreprise dont l’IP n’est pas filtrée par le proxy. Ensuite tu utilise ton Raspberry pour se connecter à ce VPN et rediriger toutes les données vers ce VPN. Ainsi, plus de problème de proxy puisque d’après le proxy tu ne navigue que sur une IP qui est autorisée. C’est la méthode que j’utilisais pour contourner le proxy de l’université.

          Cependant, je tiens à préciser que cette solution est très certainement contraire à la politique de sécurité informatique de ton entreprise puisque s’il y a un proxy c’est justement pour empêcher ce genre de choses. Les données étant chiffrés, on ne peut pas vraiment savoir si cette connexion VPN est utilisée dans le but de faire ton travail ou par exemple pour faire sortir des données. De plus, cette méthode peut être repérée facilement si l’admin réseau est compétent car tous les paquets d’un poste vont vers une IP unique et en plus les paquets sont chiffrés.

          1. Il y a quelques choses que je ne comprends pas.
            Lorsqu’on utilise un téléphone Android pour se connecter à un routeur wifi, on peux configurer un proxy. Ensuite toutes les applications internet non pas besoin de faire cette conf. Il doit bien y avoir moyen de faire ça avec RPI et de partager ?
            Faut vraiment que je progresse en conf réseau 🙂
            Merci.

          2. D’accord. Petite confusion de ma part, je croyais que tu voulais contourner le filtrage mais avec ton exemple d’Android j’ai compris exactement ton problème.

            Dans Linux (et donc Raspbian), il y a une variable d’environnement pour définir le proxy au niveau du système. Je penses que c’est ce que tu recherches mais je ne sais pas si ça va fonctionner pour le trafic depuis hostapd (à vérifier).

            Dans un terminal tu peux taper export http_proxy=http:// »proxy_ip »: »port_number »

            Normalement tu devrais trouver dans ton fichier .pac les infos nécessaires pour compléter la ligne précédente. Sinon, j’ai vu certaines personnes donner directement l’adresse du fichier .pac mais ça semble poser problème dans pas mal de cas pour certaines applications.

            Si la solution fonctionne, tu peux ajouter la même ligne dans le fichier /etc/profile pour que ce soit définitif ou encore dans /etc/environment

    1. Je viens de me rappeler d’une dernière chose en rapport avec les proxy et debian : il est possible que apt ne fonctionne plus à cause du proxy.
      Si c’est le cas, il faut rajouter une ligne dans le fichier /etc/apt/apt.conf.d/proxy

      La ligne est la suivante : Acquire::http::Proxy « http://proxy-ip:port »;

      J’attends ton retour 😉

  2. Bonjour,

    Tout d’abord, merci pour le tuto 🙂
    Je suis en train de tester mais ça ne fonctionne pas, je tombe sur un

    sudo services hostapd start
    sudo: unable to resolve host raspberrypi

    j’ai décommenté DAEMON_CONF= »/etc/hostapd/hostapd.conf » et modifié la ligne qui était sur DAEMON_CONF= » » je sèche sur la suite…

    1. Bonjour

      Ton problème est en réalité assez simple à résoudre et est indépendant de hostapd.
      Pour commencer je te conseille donc de remettre les paramètres de hostapd comme sur le tutoriel.

      Ensuite pour ton problème à proprement parler. C’est un soucis au niveau du DNS interne de ton raspberry. Autrement dit il y a des fichiers de configurations de ton raspberry qui sont faux.
      Imaginons que ton raspberry s’appelle « monRasp ».
      Le fichier /etc/hostname ne doit comporter que le nom de ta machine à savoir « monRasp ».
      Maintenant le fichier /etc/hosts doit ressembler à :
      127.0.0.1 localhost.localdomain localhost
      127.0.1.1 monRasp

      Est-ce que tu peux vérifier que les fichiers correspondent bien à ce que j’ai écrit ?

      Normalement ton problème devrait se trouver à ce niveau-là​.

      Donne moi un retour 😉

      À bientôt sur DaDaRevue
      David

  3. Re,

    le fichier /etc/hostname est bon, par contre pour /etc/hosts j’ai ça

    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

    127.0.1.1 raspberrypi cuisine

    merci pour la réponse en tout cas 🙂

    1. Salut !

      Ton fichier hosts me semble bon. D’après moi le problème vient du fait que le nom contient un espace. Du coup il ne prend en compte que le premier mot à savoir raspberry et ensuite répond que l’host raspberry est inconnu.
      Essaye plutôt de l’appeler raspberey_cuisine en changeant dans le fichier hostname et dans le fichier hosts.
      Je penses que ça devrait résoudre ton problème.

      David

  4. Re,

    C’était bien la source du problème, en fait c’est raspi-config qui ne gère pas l’espace entre les deux mots, je l’ai relancé une fois et après validation il me l’avait une nouvelle fois supprimé… du coup j’ai tout collé et modifié /etc/hostname et /etc/hosts en conséquence.
    Pour le reste la commande c’est sudo service hostapd start (sans le s à service ) 😉 je n’ai pas fini mais je viendrai faire un retour pour la suite.

    Merci en tout cas de m’avoir aiguillé 🙂

  5. Bonjour… Petit soucis,
    Quand je fait « Sudo services hostapd start »
    La console me répond.. « Sudo: services : command not found »

    Un peut d’aide serais pas de refus svp…

    1. Il semble qu’il y a une erreur de frappe.
      La commande est
      sudo service hostapd start
      (Sans le s à la fin de service)

      Je vais mettre à jour l’article

      A bientôt sur DaDaRevue !

  6. Salut, tout d’abord merci beaucoup pour ton tuto mais je me suis complétement perdu car je veux faire un truc différent. Je souhaite me connecter au réseau local du Raspberry (lamp) avec mon téléphone en wifi, après sur le port Ethernet j’ai branché un arduino qui dois recevoir des trames qu’a envoyé le raspberry, comment je peux faire pour juste creer un réseaux wifi juste pour acceder au réseau local du raspberry ?

    1. Salut !

      Je ne suis pas certain de bien comprendre ce que tu veux faire.

      Je vais essayer de résumer pour voir si je comprend bien. En gros tu veux communiquer entre ton téléphone et ton arduino en utilisant par ton raspberry comme un pont de communication, c’est bien ça ? Est-ce que le schéma suivant correspond à ta problématique ?
      Téléphone —– WiFi —-> Raspberry —- Ethernet —-> Arduino

      Si ton problème est bien le précédent alors voilà deux solutions qui devraient fonctionner.

      Solution 1 :
      Si tu as un routeur WiFi/ethernet tu peux tout connecter à celui-ci (Raspberry et Arduino en ethernet et Téléphone et Raspberry en WiFi). Le routeur s’occupera de faire le pont entre Ethernet et WiFi et c’est tout. Une box fera très bien l’affaire par exemple.

      Solution 2 :
      Tu n’a pas de routeur. Dans ce cas tu peux mettre en place hostapd pour le WiFi entre ton téléphone et ton Raspberry comme dans le tutoriel. Si je ne me trompe pas les configurations de l’ipforwarding, du nat et des iptables dans le tutoriel devrait te permettre de faire ce que tu veux et devrait te permettre de communiquer entre ton WiFi et ton ethernet.

      Confirme-moi que j’ai bien compris ta question car si ce n’est pas le cas ma réponse ne risque pas d’y répondre non plus.

      A bientôt
      David

  7. Salut, merci pour le tuto 🙂 J’ai cependant un problème que je n’arrive pas à résoudre malgré de nombreuses recherches/tutos différents:

    Mon point d’accès est visible depuis Android donc hostapd semble fonctionner. Mais quand j’essaye de me connecter, les logs montre qu’il y a une « tentative » de connexion mais impossible d’y arriver, il n’y a aucune erreur clairement visible dans le fichier syslog. Selon moi il s’agirait d’un problème provenant du serveur DHCP qui n’arrive pas à assigner d’IP à mon smartphone (j’utilise dnsmasq).

    En espérant avoir une réponse de votre part ! Bonne journée

  8. Bon les gars 🙂 c’est sympa vos tutos !!! mais comme 95% de ceux qui trainent sur le web, ca ne fonctionne pas x))
    ca part d’un bon sentiment j’en conviens mais il manque les conditions de depart…
    bon j’ai essayé….. en vain…. mais merci quand même 🙂
    bonne journée a tous ! gardez la flamme mais…. rigueur, rigueur…. ;))

  9. J’ai eu un instant un espoir ^^
    sur une reinstall fraiche de raspbian stretch j’ai appliqué les conseils de ce tuto mais…..
    ca ne fonctionne pas.
    le SSID du reseau est bien broadcasté mais les clients ne recoivent aucune ip; donc impossible de se connecter…. manquerait pas un p’tit serveur dhcp kek part ? ;-))

  10. Bonjour et merci pour ce tuto !
    je viens de l’essayer mais je rencontre un petit problème, j’arrive a me connecter au réseau avec mon smartphone ou mon ordi, mais c’est marqué « pas d’internet, sécurisé »…
    Sur ma raspberry, quand je vais sur l’onglet wifi j’ai ça :
    eth0 : Configured 10.1.62.6/24
    wlan0: Associated with Raspi (le nom du réseau)
    wlan0: Configured 169.254.129.212/16

    Une idée du problème ?
    Merci

    Théo

  11. Bonjour et merci pour ce tuto !
    Je viens d’essayer, j’arrive bien à me connecter au reseau, mais il n’y a pas internet, c’est marqué « Pas d’internet, sécurisé ». Auriez vous une idée du problème ?
    Sur ma raspberry, sur l’onglet wifi, c’est marqué :
    eth0 configured 10.1.62.6/24
    wlan0: associated with raspi
    wlan0: Configured 169.254.129.212/16

  12. Bonjour,
    ayant déjà configuré le Rasberry Pi en point d’accès avec RaspAP, il me restait à configurer Iptables, ce tuto était donc le bienvenu. Mais le fichier /etc/iptables.conf m’a semblé vraiment bizarre : on ne peut pas avoir une série de commandes bash complètes dedans, et de fait, ayant essayé tel que proposé, j’ai un message d’erreur :
    iptables-restore: line1 failed

    Les lignes mises dans le fichier peuvent être tapées en ligne de commande, ça marchera, mais pour un fichier utilisable par iptables-restore, voici le format à utiliser :

    *mangle
    -A FORWARD -i eth0 -o wlan0 -m state –state RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i wlan0 -o eth0 -j ACCEPT
    COMMIT
    *nat
    -A POSTROUTING -o eth0 -j MASQUERADE
    COMMIT

    Ceci étant fait, iptables-restore fonctionne.
    Il y a encore quelque chose qui ne va pas chez moi, parce que je n’ai toujours pas d’accès Internet, et je ne sais pas trop où chercher pour comprendre l’erreur.

  13. update :
    ça marche, c’était simplement que la carte WiFi de l’ordinateur qui voulait se connecter sur le R-PI n’était pas en DHCP. Une fois cela corrigé, c’est tout bon. Un grand merci.
    Mais pensez tout de même à corriger le contenu du fichier iptables. Celui que je vous ai donné est bon et vérifié.

  14. Bonjour & merci pour ce tuto sympa !

    J’ai un problème à la dernière étape : quand je lance sudo service hostapd start il me répond :
    « Failed to start hostapd/service: unit hostapd. service is masked. »

    Avez-vous une idée de pourquoi ?

    Merci d’avance,
    Cordialement,

  15. Salut j’ai un souci, quand je lance « sudo services hostapd start » y a mon terminal qui m’affiche le /etc/hosapd/hostapd.conf » j’ai décommenté et rempli le DAEMON_CONF= »/etc/hostapd/hostapd.conf » du coup je sais pas trop où peut-être le problèmes ^^’

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *