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 :
Commençons par installer les paquets nécessaire et configurer le réseau :
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 eth0allow-hotplug eth0
iface eth0 inet dhcp
auto wlan0allow-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
- si vous avez un message du genre
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.local
printf "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.conf
dé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