Raspberry PI 3: Point d’acces Wifi en Bridge

Il y a quelques jours, j’ai voulu remplacer mon routeur Wifi (qui n’arrete pas de planter) par un raspberry sur lequel tourne déjà une Raspbian (avec un serveur Jeedom en mode Link, mais cela fera l’objet d’un autre article). Je me suis dit rien de plus simple, il y a tellement de tuto sur le web pour expliquer que cela va être Easy, Rando, “Finger in the noise”… bref facile …

Mais voila il y a quand même quelques subtilités si vous voulez que cela fonctionne en mode bridge. C’est quoi le mode bridge ? Quels avantages ? Quels inconvénients ?

Pour ceux, qui comme moi, ont rencontré l’erreur “smsc95xx eth0: kevent 0 may have been dropped“, qui provoque l’arrêt de la carte réseau filaire. Il semble que la parade serait de ne pas avoir la même adresse IP sur la carte eth0 et la carte br0 ainsi que de ne pas faire les  déclarations dans le fichier /etc/network/interfaces mais en le faisant pas exemple dans le /etc/rc.local avec un sleep de 30.

J’ai parcouru beaucoup de sites, certains annoncent que c’est parce que l’alimentation n’est pas assez puissante, d’autres qu’il faut modifier des valeurs de packet IP, de sysctl.conf…. bref j’en ai fait des manipulations, j’ai même cru que c’était un problème matériel, mais bizarrement tant qu’il n’y a pas le bridge BR0 cela fonctionne parfaitement, dès que j’active le  BR0 cela plante. Après beaucoup de test, j’ai constaté que si les adresses ip de eth0 et br0 sont differentes et que si l’on monte le bridge dans le rc.local cela ne plante plus. Dans ce tutoriel, avant que je le modifie, je mettais la même ip sur eth0 et br0 via le fichier /etc/network/interfaces.

Mais revenons au mode bridge ou pas, il y a donc 2 possibilités :

  • Le mode normal
    • Cela signifie que la carte réseau filaire est branché sur votre réseau existant qui sort sur internet, et que vous allez créer un nouveau réseau pour votre wifi. Les dispositifs connectés sur ce wifi ne feront pas vraiment partie de votre reseau filaire, ils seront dans un autre réseau. Le raspberry agira comme une passerelle, il faudra donc faire des regles de routage avec iptables (nat masquerade)
    • Avantage : Cela vous permet de cloisoner le reseau, et d’affiner les regles de filtrage
    • Inconvenient : Il faut se taper les regles iptables, le broadcast ne passe pas, on ne peut pas acceder aux dispositifs qui sont dans le wifi depuis le filaire sauf avec des regles iptables. il faut monter un serveur DHCP ou DHCP-RELAY pour donner des ip aux machines du reseau wifi.
  • Le mode Bridge
    • Cela signifie que la machine qui se connecte sur le Wifi est vu comme etant sur le réseau filaire. En effet dans ce mode on créé une carte réseau virtuelle (br0) qui relie la carte filaire et la carte sans fil (wifi)
    • Avantage : Pas de régle iptable a faire, pas de forwarding ipv4, pas de DHCP (c’est le DHCP du reseau filaire qui reponds)
    • Inconvénient : Pas de cloisonnement

Maintenant que c’est un peu plus clair, entrons dans le vif du sujet. Voici comment ce présente le réseau dans notre cas :

  • Réseau : 192.168.1.0/255.255.255.0
  • passerelle internet : 192.168.1.1
  • le serveur DHCP est sur la box en 192.168.1.1
  • Raspberry Pi 2 ou 3 avec une Raspbian 8.0 Jessie a jour
    • ETH0 : Configuré en DHCP pour la carte réseau filaire (son ip est affectée par le serveur DHCP de la box) ETH0 sera en 192.168.1.175
    • BR0 : Configuré en fixe via la commande ifconfig dans le fichier /etc/rc.local. BR0 sera en 192.168.1.176
    • Pour les Raspberry Pi 2, il faudra télécharger une version différente de hostapd car ce dernier ne gère pas certaines cartes wifiusb.

Commençons par installer les paquets nécessaire et configurer le réseau :

  • installer les paquets suivants :
    • root@raspberrypi:/home/francis # apt-get update
      root@raspberrypi:/home/francis # apt-get upgrade
      root@raspberrypi:/home/francis # apt-get install hostapd hostap-utils iw bridge-utils rfkill

 

  • On vérifie qu’il y a bien du réseau avec la commande “ip a” :
    • root@raspberrypi:/home/francis # ip a
      eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
      link/ether b8:27:eb:39:a8:b9 brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.175/24 brd 192.168.1.255 scope global eth0
      valid_lft forever preferred_lft forever
      wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
      link/ether b8:27:eb:6c:fd:ec brd ff:ff:ff:ff:ff:ff
      inet 169.254.231.156/16 brd 169.254.255.255 scope global wlan0
      valid_lft forever preferred_lft forever

 

  • A ce stade nous n’avons fait aucune modification, donc si votre Raspbian est bien configuré vous devez pouvoir faire un ping avec succès de votre passerelle :
    • root@raspberrypi:/home/francis # ping 192.168.1.1
      PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
      64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.830 ms
      64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.827 ms

 

  • Avant toute chose, nous allons desactiver IPV6 (et changer des parametres réseau), qui a mon sens ne sert a rien pour le moment, il faut donc éditer le fichier /etc/sysctl.conf et ajouter 3 lignes à la fin :
    • root@raspberrypi:/home/francis # vi /etc/sysctl.conf

      net.ipv6.conf.all.disable_ipv6 = 1
      vm.vfs_cache_pressure = 300
      vm.min_free_kbytes=32768

 

  • Nous allons configurer le réseau pour créer un bridge entre les 2 cartes, RESPECTEZ bien l’ordre ainsi que toutes les options, sous peine d’avoir des effets de bord.
    • root@raspberrypi:/home/francis # vi /etc/network/interfaces
      auto lo
      iface lo inet loopback

      auto eth0

      allow-hotplug eth0
      iface eth0 inet dhcp

      auto wlan0

      allow-hotplug wlan0
      iface wlan0 inet manual
      wireless-power off

  • Creation du bridge :
    • root@raspberrypi:/home/francis # brctl addbr br0

 

  • Affectation des cartes reseaux au bridge d’abord eth0 puis wlan0:
    • root@raspberrypi:/home/francis # brctl addif br0 wlan0
      • si vous avez un message du genre
        • root@raspberrypi:/home/francis # can't add wlan0 to bridge br0: Operation not supported
        • Essayez de taper cette commande qui suis, puis reesayez à nouveau la commande en echec :
        • root@raspberrypi:/home/francis # iw dev wlan0 set 4addr on
    • root@raspberrypi:/home/francis # brctl addif br0 eth0

 

  • Verifiez la configuration du bridge
    • root@raspberrypi:/home/francis # brctl show
       
      bridge name bridge id STP enabled interfaces
      br0 8000.b827ebb94f5b no eth0 wlan0

 

  • Nous allons modifiez le fichier /etc/rc.local pour paramétrer la carte br0, et pour désactiver et ré-activer la carte eth0. Il faut faire attention pour ne pas qu’il se lance trop vite et trop tôt, donc j’ai mis une pause de 30 secondes avant les commandes. C’est a cet endroit que je redonne la route pour l’extérieur.
    • root@raspberrypi:/home/francis #  vi /etc/rc.localprintf "Modification du BR0"
      printf "Pause de 30 s"
      sleep 30
      /sbin/brctl addif br0 eth0
      sleep 3
      /sbin/ifconfig br0 192.168.1.176
      sleep 5
      /sbin/ifdown eth0
      sleep 5
      /sbin/ifup eth0
      sleep 5
      route add -net 0.0.0.0/0 gw 192.168.1.1
      printf "Fin des modifications"

 

  • Puis faites un reboot, ne faites pas un restart de networking, il faut rebooter, et vous devrez vous retrouver avec une configuration de ce type :
    • root@raspberrypi:/home/francis # ip a
      eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
      link/ether b8:27:eb:39:a8:b9 brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.175/24 brd 169.254.255.255 scope global eth0
      valid_lft forever preferred_lft forever
       
      wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
      link/ether b8:27:eb:6c:fd:ec brd ff:ff:ff:ff:ff:ff

      br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
      link/ether b8:27:eb:39:a8:b9 brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.176/24 brd 192.168.1.255 scope global br0
      valid_lft forever preferred_lft forever

 

  • Si vous ne pouvez pas faire un ping de votre passerelle, il faut juste faire un ifdown/ifup de  eth0, c’est pour cela que je l’ai mis dans le fichier /etc/rc.local :
    • root@raspberrypi:/home/francis # ifdown eth0 ; ifup eth0
      Killed old client process
      Internet Systems Consortium DHCP Client 4.3.1
      Copyright 2004-2014 Internet Systems Consortium.
      All rights reserved.
      For info, please visit https://www.isc.org/software/dhcp/Listening on LPF/eth0/b8:27:eb:39:a8:b9
      Sending on LPF/eth0/b8:27:eb:39:a8:b9
      Sending on Socket/fallback
      DHCPRELEASE on eth0 to 192.168.1.1 port 67
      Internet Systems Consortium DHCP Client 4.3.1
      Copyright 2004-2014 Internet Systems Consortium.
      All rights reserved.
      For info, please visit https://www.isc.org/software/dhcp/Listening on LPF/eth0/b8:27:eb:39:a8:b9
      Sending on LPF/eth0/b8:27:eb:39:a8:b9
      Sending on Socket/fallback
      DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
      DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 20
      DHCPREQUEST on eth0 to 255.255.255.255 port 67
      DHCPOFFER from 192.168.1.1
      DHCPACK from 192.168.1.1
      bound to 192.168.1.175 -- renewal in 39403 seconds.

 

  • Et maintenant si vous faite un ping de votre passerelle, cela va fonctionner. Pour le ping vers l’extérieur, il faudra remettre la route pour sortir par la passerelle, c’est pour cela que je l’ai mis aussi dans le fichier /etc/rc.local :
    • root@raspberrypi:/home/francis # ping 192.168.1.1
      PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
      64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.825 ms
      64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.708 ms
      64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.732 ms

 

  • Je conseille également de désactiver Fail2Ban qui m’a posé quelques problèmes de connexion.
    • update-rc.d fail2ban disable
      service fail2ban stop
  • Nous allons configurer le point d’accés avec le fichier /etc/hostapd/hostapd.conf:
    • root@raspberrypi:/home/francis # vi /etc/hostapd/hostapd.conf

      # Nom de l'interface wifi (celle par défaut)
      bridge=br0
      interface=wlan0
      # Utilisation du driver nl80211 (RP3) ou rtl871xdrv (RP2)
      driver=nl80211
      # Nom du réseau wifi (SSID)
      ssid=le_geek_info
      # Mode du wifi (bande 2.4GHz)
      hw_mode=g
      # Canal 6
      channel=6
      # Activer le 802.11n
      ieee80211n=1
      # Activer le WMM
      wmm_enabled=1
      # Activer les canaux 40MHz avec 20ns d'intervalle
      #rpi3
      ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
      #rpi2
      #ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]
      # Accepter toutes les adresses MAC (pas de restriction d'appareil)
      macaddr_acl=0
      # Utiliser l'authentification WPA
      auth_algs=1
      # Ne pas diffuser le SSID
      ignore_broadcast_ssid=0
      # Utiliser WPA2
      wpa=2
      # Utiliser une clé partagée
      wpa_key_mgmt=WPA-PSK
      # Mot de passe du réseau
      wpa_passphrase=legeekinfo
      # Utilisation d'AES plutôt que de TKIP
      rsn_pairwise=CCMP

 

  • Modification du fichier /etc/default/hostapd pour avoir la ligne suivante :
    • root@raspberrypi:/home/francis # vi etc/default/hostapd
      DAEMON_CONF="/etc/hostapd/hostapd.conf"

 

  • Activation du service :
    • root@raspberrypi:/home/francis # update-rc.d hostapd enable

 

  • On demarre le service :
    • root@raspberrypi:/home/francis # service hostapd start

 

  • On teste si le service est bien lancé
    • root@raspberrypi:/home/francis # service hostapd status
      hostapd.service - LSB: Advanced IEEE 802.11 management daemon
      Loaded: loaded (/etc/init.d/hostapd)
      Active: active (running) since ven. 2016-12-23 17:52:21 CET; 48min ago
      Process: 982 ExecStart=/etc/init.d/hostapd start (code=exited, status=0/SUCCESS)
      CGroup: /system.slice/hostapd.service
      └─1135 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.confdéc. 23 18:02:30 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b WPA: group key handshake completed (RSN)
      déc. 23 18:04:15 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b IEEE 802.11: disassociated
      déc. 23 18:04:15 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b IEEE 802.11: associated
      déc. 23 18:04:15 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b IEEE 802.11: disassociated
      déc. 23 18:04:26 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b IEEE 802.11: associated
      déc. 23 18:04:26 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b RADIUS: starting accounting session 585D5644-00000002
      déc. 23 18:04:26 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b WPA: pairwise key handshake completed (RSN)
      déc. 23 18:12:30 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b WPA: group key handshake completed (RSN)
      déc. 23 18:22:30 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b WPA: group key handshake completed (RSN)
      déc. 23 18:32:30 raspberrypi hostapd[1135]: wlan0: STA 04:46:65:5c:4f:8b WPA: group key handshake completed (RSN)

 

Et Voila !

Et voila si cela a pu vous aider d’une manière ou d’une autre

2 reflexions sur “Raspberry PI 3: Point d’acces Wifi en Bridge

  1. Michel gillet

    bonsoir

    je suis en train de m’appuyer sur ton article pour paramétrer un bridge sue ma Raspberry équipée de Jeedom.

    par rapport à ton mode mode opératoire peut-on mettre des adresse “static” pour eth0 et wlan0

     

Laisser un commentaire