Translation(s): English - Français
Etablir des ponts entre les connexions réseaux
Contents
Introduction
Ponter (Bridging) votre connexion réseau est une méthode pratique pour partager votre connexion Internet entre deux (ou plus) ordinateurs. Cela est très pratique si vous ne pouvez pas acheter un routeur avec plus qu'un seul port Ethernet, ou si vous êtes un étudiant dans un dortoir avec des prises Ethernet limités et pas de routeur.
Basiquement, établir un pont consiste à connecter un ordinateur dans un autre qui a déjà une connexion à un réseau plus large (comme Internet) et laisser l'ordinateur ponté utiliser le réseau de l'ordinateur connecté. Pour faire cela, l'ordinateur connecté a besoin d'avoir deux ports Ethernet, un pour le gros réseau, et l'autre pour l'ordinateur à ponter. Assurez vous avant de commencer que l'ordinateur par lequel le pont va passer a bien deux ports Ethernet, et que le matériel est capable d'établir des pont des Ethernet entre eux (Cela devrait être probablement le cas).
Un autre scénario pour utiliser le pontage est de fournir des capacités de redondance réseau. Par exemple en utilisant deux interfaces réseaux pour se connecter à deux switchs ayant le spanning tree d'activé et ainsi fournir une redondance en cas de défaut sur un câble, une interface ou un switch Cela demande d'avoir le spanning tree d'activé sur les deux interfaces pontés et sur les switchs.
Installer le logiciel
Le programme dont vous allez avoir besoin s'appelle brctl et fait parti de bridge-utils. Trouvez le dans Synaptic, ou installez le en utilisant cette commande :
# aptitude install bridge-utils
Ce programme nous permet de configurer et d'utiliser l'interface pont(bridge). L'interface pour le pont apparaît comme une nouvelle interface dans ip link, un peu comme eth0 ou eth1. Elle n'existe pas physiquement sur votre ordinateur, mais c'est une interface virtuelle qui prends juste les paquets depuis une interface physique et de manière transparente les route vers l'autre.
Configurer le pont(Bridge)
Configuration manuelle
Note: Toutes ces commandes doivent être émises sur l'ordinateur avec la connexion réseau existante. Pour configurer l'ordinateur qui va être ponté, faites le normalement, comme si vous le feriez pour n'importe quel autre ordinateur. Vous POUVEZ utiliser le DHCP, ou bien une adresse statique. Cela n'a pas d'importance.
Note: Si, après avoir essayé d'utiliser le pont, vous trouvez votre lien mort et qui refuse de fonctionner à nouveau, cela peut être le routeur/switch en amont qui bloque les "switchs non autorisés" dans le réseau (par exemple, en détectant les paquets BPDU). Il faudra changer sa configuration pour déclarer explicitement la machine/port hôte comme un "switch".
La première étape pour créer un réseau bridge est de le créer. Tapez cette commande pour créer la nouvelle interface.
# brctl addbr br0
Le nom br0 est totalement à votre convenance, c'est juste un exemple que j'avais choisis pour l'article du wiki. Maintenant que vous avez votre pont, vous devrez ajouter les interfaces qui vont être pontées. Vous pouvez vérifier la numération de vos cartes Ethernet avec (eth0, eth1, etc.) :
# ip addr show
Ajoutez les deux interfaces, celle du second ordinateur, et celle qui mène au réseau existant. Faites le avec cette commande :
# brctl addif br0 eth0 eth1
Cela ajoutera les deux interfaces eth0 et eth1 au pont(bridge) br0, tout simplement. Il n'y a pas de différence sur la manière d'ajouter les ponts, ni dans l'ordre pour le faire, ni de commandes spéciales à ajouter pour pouvoir les distinguer. Ne vous souciez pas de cela.
Bien, maintenant nous avons nos ponts, activez les interfaces, et tout sera configuré!
Configurer le pontage dans /etc/network/interfaces
Pour avoir un pont un peu plus permanent, vous aurez besoin d'éditer /etc/network/interfaces. En utilisant notre exemple de noms, faites le ressembler à ça, et ce sera configuré (si vous souhaitez utiliser le DHCP) :
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo br0 iface lo inet loopback # Configurez les interfaces manuellement en évitant les conflits avec le manager réseau. iface eth0 inet manual iface eth1 inet manual # Configuration du pont(bridge) iface br0 inet dhcp bridge_ports eth0 eth1
Pour activer votre pont, vous avez juste à lancer # ifup br0 et il montera les autres interfaces nécessaire, même s'il n'y a aucune mention dans le fichier interfaces à propos des interfaces pontées.
Si vous préférez des adresses IP statiques, vous pouvez juste ajouter les options pour IP statiques sous le réglages de l'interface br0, un peu comme ceci :
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo br0 iface lo inet loopback # Configurez les interfaces manuellement en évitant les conflits avec le manager réseau. iface eth0 inet manual iface eth1 inet manual # Configuration du pont(bridge) iface br0 inet static bridge_ports eth0 eth1 address 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 gateway 192.168.1.1
Options utiles pour les environnements virtualisés
Les autres options pratiques à utiliser dans le cadre d'un environnement virtualisés sont :
bridge_stp off # désactiver le protocole Spanning Tree bridge_waitport 0 # pas de délais avant qu'un port soit disponible bridge_fd 0 # pas de délais de transfert bridge_ports none # si vous ne voulez ponter aucun port bridge_ports regex eth* # utiliser une expression régulière pour définir les ports
Configurer les variables "bridge" du noyau
Il y a plusieurs variables qui affecte le pontage. Dans certains cas vous aurez besoin de modifier ces variables. Il y a deux options répandues :
Ajouter les variables à /etc/sysctl.conf directement
Les placer dans un fragment de fichier de configuration de sysctl (exemple /etc/sysctl.d/bridge_local.conf)
Dans ce dernier cas, le script init procps devra s'occuper de les charger durant le démarrage. Cependant, sur Squeeze il ne le fait pas, et vous avez besoin de le relancer depuis /etc/rc.local (ou similaire) :
# /etc/rc.local # Load kernel variables from /etc/sysctl.d /etc/init.d/procps restart exit 0
Libvirt et le pontage(bridging)
Libvirt est une API de virtualisation qui support KVM ainsi que d'autres techniques de virtualisation. Dans beaucoup de cas, il est souhaitable de partager une interface réseau physique avec les invités, c'est à dire, configurer un pont qu'ils peuvent utiliser. Cette opération se composent de deux parties :
Configurer le pont sur l'hôte comme décrit dans l'article ici
- Configurer l'invité pour utiliser le pont nouvellement créé.
Vous pouvez regarder si le pontage fonctionne correctement en regardant la sortie de brctl :
root@server:/etc/libvirt/qemu# brctl show bridge name bridge id STP enabled interfaces br0 8000.001ec952d26b yes eth0 vnet0 vnet1 vnet2 virbr0 8000.000000000000 yes
Comme on peut le voir, les interfaces des invités vnet0, vnet1 et vnet2 sont liées avec l'interface physique eth0 dans le pont br0. L'interface virbr0 est utilisé seulement pour un connexion en NAT avec libvirt.
Etablir un pont avec une carte réseau sans fil
De la même manière que vous pontez des interfaces réseaux câbles, vous pouvez ponter une interface Ethernet et une interface sans fil. Cependant, la plupart des points d'accès vont rejeter les trames qui ont une adresse source non identifié par le point d'accès. Depuis que Linux fait du pontage Ethernet de manière transparente (sans modifer les trames entrantes ou sortantes), nous avons besoin de configurer quelques règles pour faire cela avec un programme nommé ebtables.
Présentation d'ebtables
ebtables est quasiment comme iptables, à l'exception qu'il opére sur la couche liaison (MAC) du modèle OSI, au lieu de la couche réseau. Dans notre cas, cela permet de changer l'adresse MAC source pour toutes nos trames. C'est pratique parce que l'on trompe notre point d'accés, en lui faisant croire que toutes les trames viennent de la machine authentifiée.
Modifications avec bridge-utils
Avant que cela ne fonctionne, vous aurez besoin de modifier votre fichier /etc/network/interfaces et d'ajouter cela au paragraphe bridge :
pre-up iwconfig wlan0 essid $YOUR_ESSID bridge_hw $MAC_ADDRESS_OF_YOUR_WIRELESS_CARD
Évidemment en remplacent $MAC_ADDRESS_OF_YOUR_WIRELESS_CARD avec l'adresse MAC de votre carte sans fil, et $YOUR_ESSID par le ESSID de votre réseau sans fil. Si vous ne connaissez pas votre adresse MAC, vous pouvez la trouver en tapant
# ip link show wlan0
Où wlan0 est votre interface sans fil. Votre adresse MAC est listé comme l'HWaddr.
Configurer les règles
Premièrement, installez ebtables :
# aptitude install ebtables
Maintenant vous pouvez commencer à configurer les règles. La syntaxe pour ebtables est presque la même que pour iptables, donc si vous avez une expérience avec iptables, cela devrait vous être familier.
La première règle que vous allez configurer va changer l'adresse MAC source de toutes les trames en provenance du point d'accés pour l'adresse MAC de votre pont.
# ebtables -t nat -A POSTROUTING -o wlan0 -j snat --to-src $MAC_OF_BRIDGE --snat-arp --snat-target ACCEPT
La règle suivante demande de savoir la MAC et l'IP de chaque machine en amont de votre pont. Remplacez $MAC et $IP avec celles-ci.
# ebtables -t nat -A PREROUTING -p IPv4 -i wlan0 --ip-dst $IP -j dnat --to-dst $MAC --dnat-target ACCEPT # ebtables -t nat -A PREROUTING -p ARP -i wlan0 --arp-ip-dst $IP -j dnat --to-dst $MAC --dnat-target ACCEPT
Cela peut être fastidieux à taper à chaque fois que vous ajoutez un nouvel ordinateur à un switch derrière le pont, donc j'ai écris pour vous un script pour faire cela.
1 #!/bin/bash
2 # addcomputer
3 # Will Orr - 2009
4
5 INIF="wlan0"
6
7 function add_ebtables () {
8 COMPIP=$1
9 COMPMAC=$2
10
11 ebtables -t nat -A PREROUTING -i $INIF -p IPv4 --ip-dst $COMPIP -j \
12 dnat --to-dst $COMPMAC --dnat-target ACCEPT
13 ebtables -t nat -A PREROUTING -i $INIF -p ARP --arp-ip-dst $COMPIP \
14 -j dnat --to-dst $COMPMAC --dnat-target ACCEPT
15
16 }
17
18 if [[ $# -ne 2 ]]; then
19 echo "Usage: $0 ip mac"
20 elif [[ $(whoami) != "root" ]]; then
21 echo "Error: must be root"
22 else
23 add_ebtables $1 $2
24 fi
Sauvegarder vos règles
Après que vous ayez écris vos règles ebtables, vous aurez besoin de les sauver dans un fichier atomic. Sinon, vos règles ne vont pas être conservées. Les sauver est cependant assez simple.
# EBTABLES_ATOMIC_FILE=/root/ebtables-atomic ebtables -t nat --atomic-save
Et rechargez les comme ceci :
# EBTABLES_ATOMIC_FILE=/root/ebtables-atomic ebtables -t nat --atomic-commit
Si vous voulez charger vos règles ebtables au démarrage, l'endroit pratique pour coller la commande de commit est dans /etc/rc.local. Placez le juste là avant la ligne exit 0
Aggrégation de liens (LACP) et VLAN
Voici un exemple de fichier /etc/network/interfaces pour un agrégat de deux liens avec des VLAN définis sur ce même lien.
Notes: Testé sur Debian Jessie 8.0 rc1 le 3/11/2015 (AMD64)
Des paquets sont recquis pour le vlan et l'agrégation (bonding) :
aptitude install vlan ifenslave echo "8021q" >> /etc/modules
Le fichier /etc/network/interfaces ressembler à cela :
auto lo iface lo inet loopback # Il y a une autre que j'oublie ici ... voir la configuration de l'agrégat plus bas ###### Bonded 10Gig setup - LACP Aggregation ####### agrégat entre eth4 et eth5 #### (Configurer le switch comme un trunk avec LACP) puis diviser les VLAN. ## Voir l'état avec: cat /proc/net/bonding/bond0 auto bond0 iface bond0 inet manual up ifconfig bond0 0.0.0.0 up slaves eth4 eth5 # bond-mode 4 = 802.3ad bond-mode 4 bond-miimon 100 bond-downdelay 200 bond-updelay 200 bond-lacp-rate 1 bond-xmit-hash-policy layer2+3 auto vlan1023 iface vlan1023 inet static address 18.28.4.123 netmask 255.255.255.0 gateway 18.28.4.1 vlan-raw-device bond0 auto vlan1024 iface vlan1024 inet static address 10.15.160.1 netmask 255.255.255.0 gateway 10.15.160.100 vlan-raw-device bond0