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 :
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 :
Après modification, le fichier devrait ressembler à ça :
Faîtes ensuite un restart networking pour prise en compte. La commande ifconfig devrait vous renvoyer ce qui suit :
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.
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
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