Pour éditer le wiki, il faut demander un compte à un Lapin !

Difference between revisions of "EtherBridge"

From Le L∞p's Wiki
Jump to: navigation, search
(Déploiement final)
m (wikify)
 
(One intermediate revision by one other user not shown)
Line 5: Line 5:
 
La difficulté vient du fait que, en WiFi, une interface en mode managed ne peut pas se comporter comme un switch (présenter plusieurs adresses MAC). On doit donc passer au niveau 3 OSI et mettre en place des tables de routage, et/ou du NAT.
 
La difficulté vient du fait que, en WiFi, une interface en mode managed ne peut pas se comporter comme un switch (présenter plusieurs adresses MAC). On doit donc passer au niveau 3 OSI et mettre en place des tables de routage, et/ou du NAT.
  
Mais il y a une autre solution: créer un tunnel entre les deux routeurs, qui passera par le réseau WiFi, et qui exposera de chaque coté une interface TAP, qui sera bridgée avec l'interface ethernet locale.
+
Mais il y a une autre solution : créer un tunnel entre les deux routeurs, qui passera par le réseau WiFi, et qui exposera de chaque côté une interface TAP, qui sera bridgée avec l'interface ethernet locale.
  
 
Cette page décrit comment mettre en place ce genre de configuration en partant de deux Fonera fraîchement flashées avec OpenWRT. Une servira d'Access Point et aura l'IP 192.168.123.1 sur l'interface WiFi, l'autre fera client et aura l'IP 192.168.123.10 sur l'interface WiFi.
 
Cette page décrit comment mettre en place ce genre de configuration en partant de deux Fonera fraîchement flashées avec OpenWRT. Une servira d'Access Point et aura l'IP 192.168.123.1 sur l'interface WiFi, l'autre fera client et aura l'IP 192.168.123.10 sur l'interface WiFi.
 +
 +
Ce montage a été inspiré notamment par cette [http://www.openbsd.org/papers/asiabsdcon2010_vether/index.html présentation de <code>vether(4)</code>]
  
 
== Préparation des interfaces WiFi ==
 
== Préparation des interfaces WiFi ==
Line 13: Line 15:
 
Par défaut, OpenWRT est accessible par l'interface ethernet, a pour adresse IP 192.168.1.1/24, et est accessible par telnet.
 
Par défaut, OpenWRT est accessible par l'interface ethernet, a pour adresse IP 192.168.1.1/24, et est accessible par telnet.
  
  telnet 192.168.1.1
+
telnet 192.168.1.1
  
 
On rajoute un "network" qui va contenir l'interface WiFi et sa configuration IP, puis l'interface WiFi proprement dite.
 
On rajoute un "network" qui va contenir l'interface WiFi et sa configuration IP, puis l'interface WiFi proprement dite.
  
  uci set network.etherbridge=interface
+
uci set network.etherbridge=interface
  uci set network.etherbridge.proto=none
+
uci set network.etherbridge.proto=none
  uci set network.etherbridge.proto=static
+
uci set network.etherbridge.proto=static
  uci set network.etherbridge.ipaddr=192.168.123.1
+
uci set network.etherbridge.ipaddr=192.168.123.1
  uci set network.etherbridge.netmask=255.255.255.0
+
uci set network.etherbridge.netmask=255.255.255.0
  uci commit network
+
uci commit network
 
+
  uci set wireless.radio0.disabled=0
+
uci set wireless.radio0.disabled=0
  uci set wireless.@wifi-iface[0].network=etherbridge
+
uci set wireless.@wifi-iface[0].network=etherbridge
  uci set wireless.@wifi-iface[0].ssid=etherbridge
+
uci set wireless.@wifi-iface[0].ssid=etherbridge
  uci set wireless.@wifi-iface[0].encryption=psk2
+
uci set wireless.@wifi-iface[0].encryption=psk2
  uci set wireless.@wifi-iface[0].key='la cle wpa du pont'
+
uci set wireless.@wifi-iface[0].key='la cle wpa du pont'
  uci set wireless.@wifi-iface[0].mode=ap
+
uci set wireless.@wifi-iface[0].mode=ap
  uci commit wireless
+
uci commit wireless
  
 
On désactive le serveur DHCP sur l'interface WiFi.
 
On désactive le serveur DHCP sur l'interface WiFi.
  
  uci set dhcp.etherbridge=dhcp
+
uci set dhcp.etherbridge=dhcp
  uci set dhcp.etherbridge.interface=etherbridge
+
uci set dhcp.etherbridge.interface=etherbridge
  uci set dhcp.etherbridge.ignore=1
+
uci set dhcp.etherbridge.ignore=1
  uci commit dhcp
+
uci commit dhcp
  
 
On rajoute l'interface WiFi dans la zone "LAN" du firewall.
 
On rajoute l'interface WiFi dans la zone "LAN" du firewall.
  
  uci add_list firewall.@zone[0].network=etherbridge
+
uci add_list firewall.@zone[0].network=etherbridge
  uci commit firewall
+
uci commit firewall
 +
 +
/etc/init.d/network restart
  
  /et/init.d/network restart
+
Pour la Fonera qui va faire client, il suffit de changer <code>wireless.@wifi-iface[0].mode=ap</code> par <code>wireless.@wifi-iface[0].mode=sta</code> et de renseigner une adresse IP différente dans le même range.
 
+
Pour la fonera qui va faire client il suffit de changer wireless.@wifi-iface[0].mode=ap par wireless.@wifi-iface[0].mode=sta et de renseigner une adresse IP différente dans le même range.
+
  
 
Avant de passer a l'étape suivante, rebootez la Fonera et vérifiez que vous pouvez vous y connecter en telnet en passant par le réseau WiFi "etherbridge".
 
Avant de passer a l'étape suivante, rebootez la Fonera et vérifiez que vous pouvez vous y connecter en telnet en passant par le réseau WiFi "etherbridge".
Line 52: Line 54:
 
== Bascule des interfaces filaires ==
 
== Bascule des interfaces filaires ==
  
On va avoir besoin de télécharger des paquets qui ne sont pas inclus dans l'image de base, il faut donc préparer l'interface filaire à se connecter en DHCP (en supposant que le réseau branché a l'internet utilise DHCP. Sinon il faut utiliser une configuration en ip fixe).
+
On va avoir besoin de télécharger des paquets qui ne sont pas inclus dans l'image de base, il faut donc préparer l'interface filaire à se connecter en DHCP (en supposant que le réseau branché a l'internet utilise DHCP. Sinon il faut utiliser une configuration en IP fixe).
  
  uci set network.lan.proto=dhcp
+
uci set network.lan.proto=dhcp
  uci delete network.lan.ipaddr
+
uci delete network.lan.ipaddr
  uci delete network.lan.netmask
+
uci delete network.lan.netmask
  uci delete network.lan.ip6assign
+
uci delete network.lan.ip6assign
  uci commit network
+
uci commit network
 +
 +
/etc/init.d/network reload
  
  /etc/init.d/network reload
+
Un <code>ping 8.8.8.8</code> suivi d'un <code>ping leloop.org</code> permet de s'assurer que la connexion est bien établie et configurée.
 
+
Un <code>ping 8.8.8.8</code> suivi d'un <code>ping www.leloop.org</code> permet de s'assurer que lq connexion est bien établie et configurée.
+
  
 
== Installation d'OpenVPN ==
 
== Installation d'OpenVPN ==
Line 68: Line 70:
 
Après avoir, d'une facon ou d'une autre, connecté l'interface filaire de la Fonera à l'internet, on installe OpenVPN, sans la crypto.
 
Après avoir, d'une facon ou d'une autre, connecté l'interface filaire de la Fonera à l'internet, on installe OpenVPN, sans la crypto.
  
  opkg update
+
opkg update
  opkg install openvpn-nossl
+
opkg install openvpn-nossl
  
Une fois openvpn installé, il est judicieux de débrancher le cable ethernet.
+
Une fois OpenVPN installé, il est judicieux de débrancher le câble ethernet.
  
 
== Configuration d'OpenVPN ==
 
== Configuration d'OpenVPN ==
  
On configure OpenVPN en mode P2P, car il n'y aura qu'un seul pair. Pas de chiffrement, on se repose sur WPA. Attention: on va bridger tap0 et eth0, donc tap0 va potentiellement recevoir des trames ethernet de 1500 octets. OpenVPN, UDP et IP vont chacun rajouter leur encapsulation, et au final on sera toujours contraint par le MTU 802.11 de 1500 octets. La solution ici est de rajouter un header de fragmentation au niveau UDP, pour que les paquets de eth0 qui sont trop gros soit envoyés dans le tunnel en deux parties, chacune étant, une fois les encapsulations appliquées, de taille inférieure à 1500 octets.
+
On configure OpenVPN en mode P2P, car il n'y aura qu'un seul pair. Pas de chiffrement, on se repose sur WPA. Attention : on va bridger tap0 et eth0, donc tap0 va potentiellement recevoir des trames ethernet de 1500 octets. OpenVPN, UDP et IP vont chacun rajouter leur encapsulation, et au final on sera toujours contraint par le MTU 802.11 de 1500 octets. La solution ici est de rajouter un header de fragmentation au niveau UDP, pour que les paquets de eth0 qui sont trop gros soient envoyés dans le tunnel en deux parties, chacune étant, une fois les encapsulations appliquées, de taille inférieure à 1500 octets.
 
+
  uci set openvpn.etherbridge=openvpn
+
  uci set openvpn.etherbridge.dev=tap0
+
  uci set openvpn.etherbridge.proto=udp
+
  uci set openvpn.etherbridge.remote=192.168.123.10
+
  uci set openvpn.etherbridge.fragment=1200
+
  uci set openvpn.etherbridge.enabled=1
+
  uci commit openvpn
+
  
  /etc/init.d/openvpn enable
+
uci set openvpn.etherbridge=openvpn
  /etc/init.d/openvpn start
+
uci set openvpn.etherbridge.dev=tap0
 +
uci set openvpn.etherbridge.proto=udp
 +
uci set openvpn.etherbridge.remote=192.168.123.10
 +
uci set openvpn.etherbridge.fragment=1200
 +
uci set openvpn.etherbridge.enabled=1
 +
uci commit openvpn
 +
 +
/etc/init.d/openvpn enable
 +
/etc/init.d/openvpn start
  
Si l'opération a réussi, <code>ifconfig tap0</code> devrait renvoyer les informations sur l'interface. Il est possible qu'elle apparaisse inactive, ce n'est pas gênant a ce stade, l'important c'est qu'elle existe.
+
Si l'opération a réussi, <code>ifconfig tap0</code> devrait renvoyer les informations sur l'interface. Il est possible qu'elle apparaisse inactive, ce n'est pas gênant à ce stade, l'important c'est qu'elle existe.
  
 
== Ajout du tunnel au bridge ==
 
== Ajout du tunnel au bridge ==
  
Dernière étape: on met l'interface ethernet et l'interface tunnel dans le même bridge.
+
Dernière étape : on met l'interface ethernet et l'interface tunnel dans le même bridge.
  
  uci set network.lan.ifname='eth0 tap0'
+
uci set network.lan.ifname='eth0 tap0'
  uci commit network
+
uci commit network
  /etc/init.d/network reload
+
 +
/etc/init.d/network reload
  
Après le reload <code>brctl show</code> devrait montrer les deux interfaces eth0 et tap0 dans le bridge br-lan.
+
Après le reload, <code>brctl show</code> devrait montrer les deux interfaces eth0 et tap0 dans le bridge br-lan.
  
 
== Déploiement final ==
 
== Déploiement final ==
Line 104: Line 107:
 
Vue physique du réseau:
 
Vue physique du réseau:
  
  { Réseau Principal }---------[ Fonera 1 ]--+)))      (((+--[ Fonera 2 ]-------{ Extension du réseau }
+
{ Réseau Principal }---------[ Fonera 1 ]--+)))      (((+--[ Fonera 2 ]-------{ Extension du réseau }
  
 
Vue logique du réseau:
 
Vue logique du réseau:
  
  { Réseau Principal }------[ switch (Fonera 1) ]-------[ switch (Fonera 2) ]----{ Extension du réseau }
+
{ Réseau Principal }------[ switch (Fonera 1) ]-------[ switch (Fonera 2) ]----{ Extension du réseau }
  
A partir de là, la partie "extension du réseau" aura une liaison niveau 2 avec le réseau principal, on pourra lancer un dhclient depuis l'extension et acquérir un bail depuis un serveur situé dans le réseau principal. Attention à configurer correctement le protocole de configuration de l'interface "LAN" pour les adapter au réseau principal.
+
À partir de là, la partie "extension du réseau" aura une liaison niveau 2 avec le réseau principal, on pourra lancer un dhclient depuis l'extension et acquérir un bail depuis un serveur situé dans le réseau principal. Attention à configurer correctement le protocole de configuration de l'interface "LAN" pour les adapter au réseau principal.
  
  
 
[[Category:Projets]]
 
[[Category:Projets]]
 
[[Category:OpenWRT]]
 
[[Category:OpenWRT]]

Latest revision as of 21:39, 25 August 2014

Problématique & programme

Avec OpenWRT, il est possible de faire un pont WiFi entre deux réseaux filaire ethernet en restant au niveau 2 OSI.

La difficulté vient du fait que, en WiFi, une interface en mode managed ne peut pas se comporter comme un switch (présenter plusieurs adresses MAC). On doit donc passer au niveau 3 OSI et mettre en place des tables de routage, et/ou du NAT.

Mais il y a une autre solution : créer un tunnel entre les deux routeurs, qui passera par le réseau WiFi, et qui exposera de chaque côté une interface TAP, qui sera bridgée avec l'interface ethernet locale.

Cette page décrit comment mettre en place ce genre de configuration en partant de deux Fonera fraîchement flashées avec OpenWRT. Une servira d'Access Point et aura l'IP 192.168.123.1 sur l'interface WiFi, l'autre fera client et aura l'IP 192.168.123.10 sur l'interface WiFi.

Ce montage a été inspiré notamment par cette présentation de vether(4)

Préparation des interfaces WiFi

Par défaut, OpenWRT est accessible par l'interface ethernet, a pour adresse IP 192.168.1.1/24, et est accessible par telnet.

telnet 192.168.1.1

On rajoute un "network" qui va contenir l'interface WiFi et sa configuration IP, puis l'interface WiFi proprement dite.

uci set network.etherbridge=interface
uci set network.etherbridge.proto=none
uci set network.etherbridge.proto=static
uci set network.etherbridge.ipaddr=192.168.123.1
uci set network.etherbridge.netmask=255.255.255.0
uci commit network

uci set wireless.radio0.disabled=0
uci set wireless.@wifi-iface[0].network=etherbridge
uci set wireless.@wifi-iface[0].ssid=etherbridge
uci set wireless.@wifi-iface[0].encryption=psk2
uci set wireless.@wifi-iface[0].key='la cle wpa du pont'
uci set wireless.@wifi-iface[0].mode=ap
uci commit wireless

On désactive le serveur DHCP sur l'interface WiFi.

uci set dhcp.etherbridge=dhcp
uci set dhcp.etherbridge.interface=etherbridge
uci set dhcp.etherbridge.ignore=1
uci commit dhcp

On rajoute l'interface WiFi dans la zone "LAN" du firewall.

uci add_list firewall.@zone[0].network=etherbridge
uci commit firewall

/etc/init.d/network restart

Pour la Fonera qui va faire client, il suffit de changer wireless.@wifi-iface[0].mode=ap par wireless.@wifi-iface[0].mode=sta et de renseigner une adresse IP différente dans le même range.

Avant de passer a l'étape suivante, rebootez la Fonera et vérifiez que vous pouvez vous y connecter en telnet en passant par le réseau WiFi "etherbridge".

Bascule des interfaces filaires

On va avoir besoin de télécharger des paquets qui ne sont pas inclus dans l'image de base, il faut donc préparer l'interface filaire à se connecter en DHCP (en supposant que le réseau branché a l'internet utilise DHCP. Sinon il faut utiliser une configuration en IP fixe).

uci set network.lan.proto=dhcp
uci delete network.lan.ipaddr
uci delete network.lan.netmask
uci delete network.lan.ip6assign
uci commit network

/etc/init.d/network reload

Un ping 8.8.8.8 suivi d'un ping leloop.org permet de s'assurer que la connexion est bien établie et configurée.

Installation d'OpenVPN

Après avoir, d'une facon ou d'une autre, connecté l'interface filaire de la Fonera à l'internet, on installe OpenVPN, sans la crypto.

opkg update
opkg install openvpn-nossl

Une fois OpenVPN installé, il est judicieux de débrancher le câble ethernet.

Configuration d'OpenVPN

On configure OpenVPN en mode P2P, car il n'y aura qu'un seul pair. Pas de chiffrement, on se repose sur WPA. Attention : on va bridger tap0 et eth0, donc tap0 va potentiellement recevoir des trames ethernet de 1500 octets. OpenVPN, UDP et IP vont chacun rajouter leur encapsulation, et au final on sera toujours contraint par le MTU 802.11 de 1500 octets. La solution ici est de rajouter un header de fragmentation au niveau UDP, pour que les paquets de eth0 qui sont trop gros soient envoyés dans le tunnel en deux parties, chacune étant, une fois les encapsulations appliquées, de taille inférieure à 1500 octets.

uci set openvpn.etherbridge=openvpn
uci set openvpn.etherbridge.dev=tap0
uci set openvpn.etherbridge.proto=udp
uci set openvpn.etherbridge.remote=192.168.123.10
uci set openvpn.etherbridge.fragment=1200
uci set openvpn.etherbridge.enabled=1
uci commit openvpn

/etc/init.d/openvpn enable
/etc/init.d/openvpn start

Si l'opération a réussi, ifconfig tap0 devrait renvoyer les informations sur l'interface. Il est possible qu'elle apparaisse inactive, ce n'est pas gênant à ce stade, l'important c'est qu'elle existe.

Ajout du tunnel au bridge

Dernière étape : on met l'interface ethernet et l'interface tunnel dans le même bridge.

uci set network.lan.ifname='eth0 tap0'
uci commit network

/etc/init.d/network reload

Après le reload, brctl show devrait montrer les deux interfaces eth0 et tap0 dans le bridge br-lan.

Déploiement final

Vue physique du réseau:

{ Réseau Principal }---------[ Fonera 1 ]--+)))       (((+--[ Fonera 2 ]-------{ Extension du réseau }

Vue logique du réseau:

{ Réseau Principal }------[ switch (Fonera 1) ]-------[ switch (Fonera 2) ]----{ Extension du réseau }

À partir de là, la partie "extension du réseau" aura une liaison niveau 2 avec le réseau principal, on pourra lancer un dhclient depuis l'extension et acquérir un bail depuis un serveur situé dans le réseau principal. Attention à configurer correctement le protocole de configuration de l'interface "LAN" pour les adapter au réseau principal.