mercredi 27 mars 2013

Mise en place d'un bridge sous Debian/Ubuntu

Dans ma quête perpétuelle de la mise en place de truc qui fonctionne à moitié, j'ai eu la chance de me frotter aux bridges ethernets et aux interfaces ethernets virtuelles de l'ami Linux.

Mais qu'est ce qu'un bridge ethernet allez-vous me dire et pourquoi vouloir en mettre un en place ?

Un bridge ethernet est l'équivalent d'un switch virtuel au niveau système. L'idée est d'utiliser une interface réelle (mettons eth0) pour faire transiter du trafic des interfaces virtuelles (généralement tap0, tap1 etc.).

Pour ce qui est de l'utilité, vous en avez plusieurs avec notamment les deux exemples suivants :
  • Exposer une machine virtuelle sur un réseau réelle ;
  • Mettre en place un bridge ethernet pour openvpn.
Dans mon cas, je fais ça pour openvpn mais on peut également l'utiliser pour kvm par exemple.

Mise en place d'un bridge

Avant toute chose, il va nous falloir installer deux packages qui vous serons utiles pour gérer les bridges et les interfaces virtuelles (et puis, que serait un article sur Debian sans l'utilisation d'apt-get) :

apt-get install uml-utilities bridge-utils

Ici, rien de bien extraordinaire, nous allons d'abord déclarer un bridge (br0) dans le fichier /etc/network/interfaces, y ajouter notre interface ethernet (eth0) et enfin rattacher l'adresse dhcp au bridge. Ci-dessous, vous trouverez un exemple de fichier avant modification :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Après modification, le fichier devrait ressembler à ça :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Faîtes ensuite un restart networking pour prise en compte. La commande ifconfig devrait vous renvoyer ce qui suit :

# ifconfig
br0       Link encap:Ethernet  HWaddr 7e:68:47:11:36:c9  
          inet adr:192.168.0.34  Bcast:192.168.0.255  Masque:255.255.255.0
          adr inet6: fe80::7c68:47ff:fe11:36c9/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Packets reçus:3193 erreurs:0 :0 overruns:0 frame:0
          TX packets:1289 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          Octets reçus:273039 (273.0 KB) Octets transmis:331151 (331.1 KB)

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          Packets reçus:312 erreurs:0 :0 overruns:0 frame:0
          TX packets:312 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          Octets reçus:32926 (32.9 KB) Octets transmis:32926 (32.9 KB)

eth0      Link encap:Ethernet  HWaddr c8:60:00:e2:c9:2b  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Packets reçus:4925 erreurs:0 :0 overruns:0 frame:0
          TX packets:1289 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          Octets reçus:679553 (679.5 KB) Octets transmis:331151 (331.1 KB)

On voit ici que c'est le bridge qui a une adresse IP. Ceci est important pour permettre le fonctionnement correcte de notre machine. Dans le cas contraire, on pourrait avoir des comportements bizarre de notre ami le serveur. Il faut bien voir que notre interface ethernet est simplement considéré comme un connecteur vers le monde réel.

Pour les plus curieux, il est possible de consulter l'état de notre bridge avec la commande brctl :

# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.7e68471136c9       no              eth0

Passons maintenant à la déclaration d'une interface virtuelle.

Déclaration d'une interface virtuelle et rattachement au bridge

Maintenant que notre bridge est fonctionnel, nous allons rattacher une interface virtuelle (tap0). Pour se faire, rien de plus simple, modifions de nouveau notre fichier /etc/network/interfaces de la manière suivante :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto tap0
iface tap0 inet manual
        pre-up tunctl -t tap0
        up ifconfig tap0 up
        down ifconfig tap0 down

auto br0
iface br0 inet dhcp
        bridge_ports eth0 tap0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Les lignes concernant tap0 contiennent l'utilisation de la commande tunctl qui va déclarer l'interface. Une fois déclarée, cette interface sera rattachée automatiquement au bridge à l'aide de la ligne bridge_ports.

Pour s'en convaincre, une fois que le réseau a été redémarré (restart networking), il suffit de relancer la commande brctl show br0. Ce dernier devrait renvoyer le résultat suivant :


# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.1c6f65217bc0       no              eth0
                                                        tap0