Raspberry Pi : Créer un point d’accès WiFi

Avec son faible encombrement et sa faible consommation, le Raspberry Pi est la machine parfaite dans une utilisation serveur. Nous allons donc le configurer en point d’accès wifi sécurisé (ce tuto fonctionne également sur autre chose qu’un Raspi 😉 )

A l’aide de sa carte WiFi, il créera un point d’accès sécurisé permettant de nous y connecter avec un ordinateur, un smartphone ou n’importe quoi d’autre (comme un mac :p ).
Sa seconde carte réseau (WiFi ou cable) permettra à notre Raspberry de se connecter à un réseau existant pour profiter de sa connexion.

Nous aurons besoin de plusieurs composants :
– un Raspberry Pi
– une ou 2 cartes WiFi : une pour le point d’accès, la seconde optionnelle pour connecter le Pi à un réseau

Dans ce tutoriel, j’utilise 2 cartes wifi (identiques, par simplicité) :
– wlan0 : se connecte à un réseau wifi à proximité
– wlan1 : héberge le point d’accès wifi
Si vous n’utilisez qu’une seule carte wifi et la carte ethernet, alors remplacez simplement wlan0 par eth0, et wlan1 par wlan0, dans tous les scripts et les fichiers de configuration de ce tutoriel.

Au niveau logiciel :
– hostapd : c’est lui qui va nous servir à créer un réseau wifi avec toutes les sécurités nécessaires sur l’interface wifi wlan1
– dnsmasq : il permettra à notre raspberry de jouer le rôle de serveur DHCP, pour attribuer des adresses IP automatiquement aux périphériques autorisés à se connecter au point d’accès
– iptables : iptables sert à créer des rêgles de routage. C’est grâce à ces rêgles que nous pourrons rediriger la connexion d’une interface réseau vers une autre.

Une fois les cartes wifi branchées et le Pi démarré, nous pouvons commencer :

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

Si vous avez une carte wifi basée sur un chipset Realtek RTL8188CUS (il y a de grandes chances que ce soit le cas), vous aurez besoin d’une mise à jour du driver wifi et une version spéciale de hostapd.
Pour connaitre votre chipset de carte wifi :

lsusb

si comme dans mon cas vous voyez RTL8188CUS dans une des lignes, alors suivez la procédure suivante pour installer le driver et compiler/installer le patch d’hostapd. Dans le cas contraire, vous pouvaez passer directement à la configuration de hostapd

cd /tmp
sudo wget http://fichiers.touslesdrivers.com/39144/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

… pause café …

sudo make install
sudo mv hostapd /usr/sbin/hostapd
sudo chown root.root /usr/sbin/hostapd
sudo chmod 755 /usr/sbin/hostapd

Si la commande wget de départ ne fonctionne pas, vous pouvez télécharger le pilote manellement sur le site de Realtek et continuer la procédure avec le unzip.

Nous allons maintenant configurer hostapd :

sudo nano /etc/hostapd/hostapd.conf

Copiez la configuration suivante, en remplaçant les valeurs MON_SSID et MON_PASSWORD par le nom de réseau wifi et le mot de passe que vous désirez :

ctrl_interface=/var/run/hostapd
driver=rtl871xdrv
ieee80211n=1
ctrl_interface_group=0
beacon_int=100
interface=wlan1
ssid=MON_SSID
hw_mode=g
channel=6
auth_algs=1
wmm_enabled=1
eap_reauth_period=360000000
macaddr_acl=0
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MON_PASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
  • dnsmasq
sudo nano /etc/dnsmasq.conf
interface=wlan1
dhcp-range=192.168.200.100,192.168.200.200,255.255.255.0,12h

Nos clients wifi se connectant sur l’interface wlan1 se verront attribuer une IP entre 192.168.200.100 et 192.168.200.200, avec un masque de sous-réseau 255.255.255.0, et un bail de 12 heures

  • IPtables

Activons le port forwarding :

sudo nano /etc/sysctl.conf

ajouter :

net.ipv4.ip_forward=1

On redirige la connexion venant de wlan0 vers wlan1 :

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
  • Configuration réseau

Il nous reste à configurer nos interfaces réseau :

sudo nano /etc/network/interfaces
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
pre-up wpa_supplicant -B w -D wext -i wlan0 -c /etc/wpa.conf
post-down killall -q wpa_supplicant

allow-hotplug wlan1
iface wlan1 inet static
address 192.168.200.1
netmask 255.255.255.0
network 192.168.200.0
broadcast 192.168.200.255

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

Pensez à attribuer une adresse dans le même sous-réseau que vous avez configuré la plage d’attribution DHCP, dans le chapitre dnsmasq.

Il ne reste plus qu’à rebooter, et lancer le tout :

sudo service dnsmasq start
sudo service hostapd start

Si vous pouvez vous connecter au point d’accès du Raspberry Pi depuis un autre ordinateur, alors c’est gagné !

Si vous le désirez, vous pouvez lancer le pont d’accès comme daemon au démarrage du système :

sudo nano /etc/default/hostapd

Remplacez la ligne #DAEMON_CONF= » » par DAEMON_CONF= »/etc/hostapd/hostapd.conf »

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

17 thoughts on “Raspberry Pi : Créer un point d’accès WiFi

  1. Cerberus
    19/03/2014 at 0 h 44 min

    super tuto. Mais j’ai un problème le réseau wifi est bien visible mais je n’ai pas d’attribution d’adresse ip pour le périphérique qui veut se connecter au point d’accès

    1. Captain Stouf
      19/03/2014 at 2 h 25 min

      Bonsoir,
      que disent les commandes ifconfig et iwconfig (sur le pi) ?
      la carte point d’accès a bien la bonne IP ?
      Je soupçonne une erreur dans le /etc/network/interfaces

    2. Captain Stouf
      22/03/2014 at 17 h 19 min

      J’avais laissé une coquille dans le tuto, lors de l’installation de dnsmasq : la commande pour installer le paquet est « sudo apt-get install dnsmasq », et pas « dnsmasqd ».
      Votre problème vient peut-être de là ? C’est corrigé en tous cas.

  2. Sébastien Lagoutte
    24/03/2014 at 0 h 22 min

    Bonjour,
    merci pour ce tuto simple et fonctionnel. tout marche parfaitement.
    En revanche, mes connaissances de la syntaxe d' »iptables » ne sont pas suffisantes pour « améliorer » le filtre en entrée (interface connectée à internet) afin d’interdire toute connexion entrante avant d’autoriser les protocoles désirés (notamment vpn pass-trought).
    pouvez vous m’aider ?
    avec tous mes remerciements,
    slagoutte.

    1. Captain Stouf
      25/03/2014 at 15 h 35 min

      Bonjour slagoutte,
      Pour ma part, en ce qui concerne la partie client OpenVpn, j’utilise ce script iptables (c’est le minimum nécessaire pour faire le forwarding) :

      sudo iptables -F
      sudo iptables -t nat -F
      echo 1 > /proc/sys/net/ipv4/ip_forward
      sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
      sudo iptables -A FORWARD -i tun0 -o ‘+WLAN_CLIENT+’ -m state –state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i ‘+WLAN_CLIENT+’ -o tun0 -j ACCEPT

      remplacer ‘+WLAN_CLIENT+’ par votre propre interface réseau client (coté internet).
      L’ennui vient de ifupdown qui arrête wpa_supplicant quand on lance la connexion VPN (si je me souviens bien), et donc la connexion ne se fait pas. Il y a une solution, j’ai prévu un article complet sur le sujet, mais il est un peu long à rédiger 😉

      Pour les rêgles de filtrage d’iptables avancées, je suis actuellemtn en train de faire des tests de mon coté afin d’ajuster ça aux petits oignons (je ne suis pas un pro d’iptables non plus ^^). Ce sera donc le sujet d’un futur article (sous peu).

      1. seblag@free.fr
        30/03/2014 at 19 h 01 min

        bonjour,

        merci de votre réponse, je patienterai pour le vpn.
        toutes mes excuses pour ces remerciements tardifs.
        Sébastien.

  3. 24/06/2014 at 21 h 32 min

    Pour ceux qui veulent un petit iptables de base filtrant un port et ouvrant un autre pour avoir un exemple, en voici un 🙂

    #!/bin/bash
    #
    ##############################################
    # Script Firewall / Iptables / Bridage for Lan TiG 5.2 #
    ################# by toine7m #################

    IPTABLES= »/sbin/iptables »
    WAN=eth0 #port gigabit 1
    LAN=eth1 #port gigabit 2
    LO=lo

    #routage ipv4

    echo « 1 » > /proc/sys/net/ipv4/ip_forward

    #supprime toutes les regles pre-existantes

    $IPTABLES -F
    $IPTABLES -F -t filter
    $IPTABLES -F -t nat
    $IPTABLES -X
    echo – Tables videes

    #Tout ce qui n’est pas explicitement autorise est implicitement interdit !

    $IPTABLES -P INPUT DROP
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -P FORWARD DROP
    echo – Interdire toute connexion entrante : [OK]
    echo – Autoriser toute connexion sortante : [OK]
    echo – Interdire tout forwarding : [OK]

    ##### Ne pas casser les connexions deja etablies #####
    $IPTABLES -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
    echo – Acceptation des connexions deja etablies : [OK]

    #On autorise tous les protocoles a passer par la loopback
    $IPTABLES -A INPUT -p ALL -i $LO -j ACCEPT

    #Pings venant du LAN et a destination du WAN autorises
    $IPTABLES -A FORWARD -p icmp -i $LAN -o $WAN -j ACCEPT
    $IPTABLES -A FORWARD -p icmp -i $WAN -o $LAN -j ACCEPT

    #Pings venant du LAN et a destination du firewall autoris�s
    $IPTABLES -A INPUT -p icmp -i $LAN -j ACCEPT

    #MASQUERADE permet de modifier l’ip source d’un paquet
    #par l’ip de l’interface de sortie du firewall.
    #Les paquets sortant du firewall ont leur ip source
    #remplacee par l’ip de l’interface WAN du firewall :
    $IPTABLES -A POSTROUTING -t nat -o $WAN -j MASQUERADE

    #PROXY transparent
    #$IPTABLES -A PREROUTING -t nat -s 172.16.1.0/24 -p tcp –dport 80 -j REDIRECT –to-port 3128
    #echo – Acces net avec squid [OK]

    #il faut ensuite autoriser le trafic entrant sur le port 3128 du firewall :
    #$IPTABLES -A INPUT -t filter -p tcp –dport 3128 -j ACCEPT

    #dhcp
    $IPTABLES -A INPUT -p udp –dport 67:68 -m state –state NEW -i $LAN -j ACCEPT

    #dns
    $IPTABLES -A INPUT -p udp –dport 53 -m state –state NEW -i $LAN -j ACCEPT
    $IPTABLES -A FORWARD -p udp –dport 53 -m state –state NEW -i $LAN -j ACCEPT

    $IPTABLES -A INPUT -p tcp –dport 53 -m state –state NEW -i $LAN -j ACCEPT
    $IPTABLES -A FORWARD -p tcp –dport 53 -m state –state NEW -i $LAN -j ACCEPT

    #ssh
    $IPTABLES -A INPUT -p tcp –dport 22 -m state –state NEW -i $LAN -j DROP
    $IPTABLES -A FORWARD -p tcp –dport 22 -m state –state NEW -i $LAN -j DROP

    #net
    $IPTABLES -A FORWARD -p tcp –dport 443 -m state –state NEW -i $LAN -o $WAN -j ACCEPT
    $IPTABLES -A FORWARD -p tcp –dport 80 -m state –state NEW -i $LAN -s 172.16.1.1/24 -j ACCEPT

    # PORTS GENERAUX #
    $IPTABLES -t filter -A INPUT -p udp –dport 123 -i $LAN -j ACCEPT
    $IPTABLES -t filter -A INPUT -p tcp –dport 8080 -i $LAN -j ACCEPT
    $IPTABLES -t filter -A INPUT -p udp –dport 8080 -i $LAN -j ACCEPT
    echo – Services de bases : [OK]

    A savoir qu’il faut modifier les interfaces pour qu’elles correspondent pour vous 🙂 En fait, ce script bloque toutes les connexions, pour ensuite ouvrir certains ports désirés 🙂 Une fois la première syntaxe comprise, les autre lignes sont sensiblement pareilles, mais pour d’autres ports 🙂

    HF !

    1. Captain Stouf
      24/06/2014 at 21 h 59 min

      Merci pour ce joli script ! C’est très utile, et je vais surement le réutiliser !

      1. 24/06/2014 at 22 h 32 min

        Je peux t’envoyer le script complet par mail si tu veux 🙂

        1. Captain Stouf
          25/06/2014 at 1 h 59 min

          Ah ben c’est pas de refus, merci ! 🙂

  4. Kris
    05/08/2014 at 16 h 09 min

    Salut, pour le wget de : ftp://208.70.202.219/cn/wlan/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip une authentification semble être requise

  5. metakgool
    24/09/2014 at 2 h 17 min

    Pareil pour moi aussi Kris.
    Logging in as WebUser …
    Login incorrect.

    1. Captain Stouf
      24/09/2014 at 14 h 32 min

      Bonjour,
      J’ai modifié le script, l’archive est maintenant téléchargée depuis une source différente :
      http://fichiers.touslesdrivers.com/39144/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
      Merci et bonne journée !

  6. ToF
    12/02/2015 at 14 h 39 min

    Excellent Tuto que je viens d’appliquer avec succès.

    Merci!

    1. Captain Stouf
      12/02/2015 at 15 h 17 min

      De rien !

    1. 13/04/2016 at 19 h 37 min

      Yes !! Super projet, bravo !!

Laisser un commentaire