VLAN tagging on Linux & Cisco
VLAN quoi ?
Le VLAN tagging est une technique consistant à étiqueter le trafic afin d’opérer un filtrage et une séparation entre les flux. Linux est depuis longtemps capable de gérer par lui-même cette séparation, qui était à l’origine le privilège des équipements d’intercommunication. Petite démonstration avec un nunux et un switch Cisco.
Prérequis et configuration du Linux
Pour utiliser le VLAN tagging, il faut :
- un Linux avec le support du VLAN tagging. Normalement, tout kernel au-dessus de 2.4 supporte 802.1q
- des switches qui les supportent également
Tout d’abord, il faut activer le packet forwarding au sein du Linux. Il est possible de l’activer sans avoir à rebooter, même s’il faut tout de même le fixer pour ne pas perdre l’option au reboot en mettant net.ipv4_forward à 1 dans /etc/sysctl.conf.
# echo 1 > /proc/sys/net/ipv4/ip_forward
Si vous avez plusieurs interfaces réseaux, choisissez celle qui supportera le vlan tagging. Dans mon cas, je n’en ai qu’une, eth0, d’où justement l’intérêt de tagguer différemment le flux en fonction de l’ip.
L’idée est de s’appuyer sur la conf existante pour créer une interface fictive s’appuyant sur la même interface physique (eth0). A ceci-près que le fichier de conf sera affublé d’un . suivi du numéro de VLAN que l’on souhaite tagger sur cette interface. Il est possible de le forcer également avec la directive VLAN_ID.
# cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.21} # cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.11.255 HWADDR=xx:xx:xx:xx:xx:xx IPADDR=192.168.11.7 NETMASK=255.255.255.0 NETWORK=192.168.11.0 ONBOOT=yes # cat /etc/sysconfig/network-scripts/ifcfg-eth0.21 DEVICE=eth0.21 BOOTPROTO=none BROADCAST=192.168.21.255 HWADDR=xx:xx:xx:xx:xx:xx IPADDR=192.168.21.7 NETMASK=255.255.255.0 NETWORK=192.168.21.0 ONBOOT=yes VLAN=yes
La configuration de ifcfg-eth0.21 va permettre de créer une interface ethernet virtuelle qui sera en charge d’exploiter les packets taggués pour le VLAN 21.
Il reste à recharger le service réseau afin de remonter les interfaces réseaux tout bien comme il faut.
# service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK] Disabling IPv4 packet forwarding: net.ipv4.ip_forward = 0 [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface eth0.21: Added VLAN with VID == 21 to IF -:eth0:- [ OK ]
Configuration du switch Cisco
On veut que la conf du switch soit comme suit :
- port fa0/1 pour le linux
- port fa0/2 sera assigné au VLAN 21
- port fa0/3 sera assigné au VLAN 22.
Maintenant, de la conf. Pour attaquer le sswitch Cisco, il faut l’attraper par un telnet ou une connexion en console. Passez en mode enable.
# conf t (config)# vlan 21 (config-vlan)# exit (config)# vlan 22 (config-vlan)# exit (config)# exit # wr me #sh vlan brief VLAN Name Status Ports --------- --------- ------------------------------- 1 default active Fa0/2, Fa0/3, Fa0/4, Fa0/5 Fa0/6, Fa0/7, Fa0/8, Fa0/9 Fa0/10, Fa0/11, Fa0/12, Fa0/13 Fa0/14, Fa0/15, Fa0/16, Fa0/17 Fa0/18, Fa0/19, Fa0/20, Fa0/21 Fa0/22, Fa0/23, Fa0/24, Gi0/1 Gi0/2 21 VLAN0021 active 22 VLAN0022 active [...]
Pour attribuer les ports du switch aux différents VLAN, il suffit alors de le lui dire.
# conf t (config)# int fa0/2 (config-if)# switchport mode access (config-if)# switchport access vlan 21 (config-if)# spanning-tree portfast (config-if)# exit (config)# exit # wr me # sh run [...] interface FastEthernet0/2 switchport access vlan 21 switchport mode access spanning-tree portfast # conf t (config)# int fa0/3 (config-if)# switchport mode access (config-if)# switchport access vlan 22 (config-if)# spanning-tree portfast (config-if)# exit (config)# exit # wr me # sh run [...] interface FastEthernet0/3 switchport access vlan 22 switchport mode access spanning-tree portfast
A cela, il faut enrichir le trunk afin qu’il accepte de supporter et de router les VLAN 21 et 22 :
# conf t (config)# int fa0/1 (config-if)# switchport mode trunk (config-if)# switchport trunk allowed vlan 21,22 (config-if)# exit (config)# exit # wr me
Le résultat doit donner :
# sh vlan brief VLAN Name Status Ports --------- --------- ------------------------------- 1 default active Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12, Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17, Fa0/18, Fa0/19, Fa0/20, Fa0/21, Fa0/22, Fa0/23, Fa0/24, Gi0/1 Gi0/2 21 VLAN0021 active Fa0/2 22 VLAN0022 active Fa0/3 [...]
And voila ! Votre conf est prête, vous pouvez normalement router sur chacun des VLANs.