Trunk dot1q et vlan natif
Histoire d’aller un peu plus en profondeur dans la compréhension des trunks dot1q, je vais aborder ici la notion de vlan natif ainsi que son utilité et les bonnes pratique en matière de sécurité à son égard…
Le trunk dot1q…
Pour rappel, un trunk est une liaison ayant pour but de véhiculer le trafic de plusieurs vlans. Vu qu’une trame ethernet standard ne dispose pas d’information relative au vlan duquel elle provient, il est nécessaire d’ajouter ces informations par l’intermédiaire d’un protocole.
Dans la cas de dot1q (protocole standard IEEE 802.1q), un tag est inséré entre le champ d’adresse MAC source et le champ Type/Longueur de la trame:
Comme le montre le schéma, le tag dot1q comporte plusieurs informations:
- Un identifiant du protocol (2 bytes)
- 3 bits pour indiquer une priorité (utilisé pour des fonctionnalités de QoS au niveau de la trame).
- CFI: 1 bit servant à garantir la compatibilité entre les trames ethernet et token-ring (ce bit est toujours à 0 pour une trame ethernet).
- L’identifiant du vlan, codé sur 12 bits (valeurs allant de 0 à 4096, certaines d’étant pas utilisées)
Lorsqu’une trame est émise par une interface trunk, celle-ci est marquée d’un tag dot1q contenant donc l’identifiant du vlan auquel elle appartient, cela permettant bien entendu à l’équipement qui la reçoit de la replacer dans le vlan adéquat.
Vlan natif… pourquoi ?
Certaines trames véhiculées sur un trunk ne sont pas marquées d’un tag dot1q. Dés lors il faut pouvoir les placer quelque part. C’est là qu’intervient le vlan natif.
Le vlan natif, est le vlan dans lequel sont véhiculées les trames non taguées dot1q. Donc si un switch reçoit sur une interface trunk une trame ethernet standard, il la placera dans ce vlan natif, en quelque sorte, un vlan par défaut (de marquage).
Sur les équipements Cisco, certains protocoles comme CDP ou DTP sont véhiculés dans des trames non taguées et donc dans le vlan natif.
Sécuriser le vlan natif…
Il est important de se préoccuper du vlan natif pour plusieurs raisons:
- Il est préférable de ne pas véhiculer des trames de protocoles comme CDP, DTP etc dans le même vlan que des données. Ainsi on évite qu’un utilisateur ne puisse capturer se trafic ou, pire encore, de générer de faux messages CDP ou DTP entre autre dans le but de détourner le fonctionnement du réseau.
- Le fait qu’un vlan véhicule des trames non-taguée permet de mettre ne place des attaques du type « vlan-hopping », dont le but est d’envoyer artificiellement du trafic dans un vlan où la machine émettrice ne se trouve pas et ce en ajoutant de faux tags dot1q, c’est le principe du « double tagging ». On génère une trame avec deux tags dot1q, à l’arrivée sur le port, le switch se débarrasse du premier, mais traite le 2e tag et place la trame dans le vlan qui y est renseigné.
Afin de remédier à cela, il existe deux techniques principales:
- Changer la valeur du vlan natif (par défaut, sur un switch Cisco, le vlan 1 est le vlan natif).
- Forcer le tagging de tous les vlans, y compris le vlan natif.
Un peu de pratique
Nous avons donc ici deux switches, chacun ayant des machines connectées dans les vlans 10 et 20. La liaison entre eux sera configurée en trunk dot1Q.
Configuration de base des switches (vlans, trunks, …)
Sur 3560-1…
3560-1#configure terminal ! Création des vlans 3560-1(config)#vlan 10,20 3560-1(config-vlan)#exit ! Placement des interfaces dans le vlan 10 3560-1(config)#interface range fastEthernet 0/1-12 3560-1(config-if-range)#switchport mode access 3560-1(config-if-range)#switchport access vlan 10 3560-1(config-if-range)#exit ! Placement des interfaces dans le vlan 20 3560-1(config)#interface range fastEthernet 0/13-24 3560-1(config-if-range)#switchport mode access 3560-1(config-if-range)#switchport access vlan 20 3560-1(config-if-range)#exit ! Configuration de base du trunk vers 3560-2 3560-1(config)#interface gigabitEthernet 0/1 3560-1(config-if)#switchport trunk encapsulation dot1q 3560-1(config-if)#switchport mode trunk 3560-1(config-if)#exit 3560-1(config)#
Sur 3560-2…
3560-2#configure terminal ! Création des vlans 3560-2(config)#vlan 10,20 3560-2(config-vlan)#exit ! Placement des interfaces dans le vlan 10 3560-2(config)#interface range fastEthernet 0/1-12 3560-2(config-if-range)#switchport mode access 3560-2(config-if-range)#switchport access vlan 10 3560-2(config-if-range)#exit ! Placement des interfaces dans le vlan 20 3560-2(config)#interface range fastEthernet 0/13-24 3560-2(config-if-range)#switchport mode access 3560-2(config-if-range)#switchport access vlan 20 3560-2(config-if-range)#exit ! Configuration de base du trunk vers 3560-1 3560-2(config)#interface gigabitEthernet 0/1 3560-2(config-if)#switchport trunk encapsulation dot1q 3560-2(config-if)#switchport mode trunk 3560-2(config-if)#exit 3560-2(config)#
Vérifications…
Vérifications des vlans…
3560-1#show vlan brief VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Gi0/2 10 VLAN0010 active Fa0/1, Fa0/2, Fa0/3, Fa0/4 Fa0/5, Fa0/6, Fa0/7, Fa0/8 Fa0/9, Fa0/10, Fa0/11, Fa0/12 20 VLAN0020 active Fa0/13, Fa0/14, Fa0/15, Fa0/16 Fa0/17, Fa0/18, Fa0/19, Fa0/20 Fa0/21, Fa0/22, Fa0/23, Fa0/24 1002 fddi-default act/unsup 1003 token-ring-default act/unsup 1004 fddinet-default act/unsup 1005 trnet-default act/unsup 2960-1#
Les interfaces sont dans les bons vlans, la G0/1 n’apparaît pas puisqu’il s’agit d’un trunk. Seule la G0/2 reste dans le vlan 1 par défaut (notez que ce n’est pas une bonne pratique, il vaudrait mieux la placer dans un vlan dédié aux interfaces non utilisées).
3560-1#show interfaces trunk Port Mode Encapsulation Status Native vlan Gi0/1 on 802.1q trunking 1 Port Vlans allowed on trunk Gi0/1 1-4094 Port Vlans allowed and active in management domain Gi0/1 1,10,20 Port Vlans in spanning tree forwarding state and not pruned Gi0/1 1,10,20 3560-1#
L’interface G0/1 est bien en mode trunking, par défaut tout les vlans actifs sont véhiculés dessus.
3560-1#show interfaces gigabitEthernet 0/1 switchport Name: Gi0/1 Switchport: Enabled Administrative Mode: trunk Operational Mode: trunk Administrative Trunking Encapsulation: dot1q Operational Trunking Encapsulation: dot1q Negotiation of Trunking: On Access Mode VLAN: 1 (default) Trunking Native Mode VLAN: 1 (default) Administrative Native VLAN tagging: disabled Voice VLAN: none Administrative private-vlan host-association: none Administrative private-vlan mapping: none Administrative private-vlan trunk native VLAN: none Administrative private-vlan trunk Native VLAN tagging: enabled Administrative private-vlan trunk encapsulation: dot1q Administrative private-vlan trunk normal VLANs: none Administrative private-vlan trunk associations: none Administrative private-vlan trunk mappings: none Operational private-vlan: none Trunking VLANs Enabled: ALL Pruning VLANs Enabled: 2-1001 Capture Mode Disabled Capture VLANs Allowed: ALL Protected: false Unknown unicast blocked: disabled Unknown multicast blocked: disabled Appliance trust: none 3560-1#
La commande « show interface g0/1 switchport » nous donne les informations quant aux vlan natif etc. Le vlan natif est le vlan 1 (par défaut) et le tagging du vlan natif n’est pas activé.
Sécurisation du vlan natif…
La première bonne pratique consiste donc à modifier la valeur du vlan natif sur le trunk. Il faut cependant être vigilant…
- Il est fortement conseillé d’utiliser un vlan « vide » comme vlan natif, sans interface connectée dedans etc.
- Le vlan natif doit être identique aux deux extrémités du trunk, sans quoi, on induirait une multitude de problèmes… comme le fait que des trames passeraient d’un vlan à un autre, mais aussi des problème de convergence Spanning-Tree et donc la formation de boucle au niveau du switching des trames.
Sur 3560-1…
3560-1#configure terminal ! Création d’un nouveau vlan spécifique 3560-1(config)#vlan 999 3560-1(config-vlan)#name NATIF 3560-1(config-vlan)#exit ! Configuration du clan natif sur le trunk 3560-1(config)#interface gigabitEthernet 0/1 3560-1(config-if)#switchport trunk native vlan 999 3560-1(config-if)# ! STP et CDP ne sont pas spécialement contents… Le premier détecte une incohérence ! entre les BPDU qui s’échangent entre les deux switches… Et de son côté CDP lui détecte ! la différence de vlan natif et l’exprime… *Mar 1 02:58:07.094: %SPANTREE-2-RECV_PVID_ERR: Received BPDU with inconsistent peer vlan id 1 on GigabitEthernet0/1 VLAN999. *Mar 1 02:58:07.094: %SPANTREE-2-BLOCK_PVID_PEER: Blocking GigabitEthernet0/1 on VLAN0001. Inconsistent peer vlan. *Mar 1 02:58:07.094: %SPANTREE-2-BLOCK_PVID_LOCAL: Blocking GigabitEthernet0/1 on VLAN0999. Inconsistent local vlan. *Mar 1 02:58:07.103: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to down *Mar 1 02:58:09.166: %CDP-4-NATIVE_VLAN_MISMATCH: Native VLAN mismatch discovered on GigabitEthernet0/1 (999), with 3560-2 GigabitEthernet0/1 (1).
Sur 3560-2…
3560-2#configure terminal ! Création du clan spécifique 3560-2(config)#vlan 999 3560-2(config-vlan)#name NATIF 3560-2(config-vlan)#exit ! Configuration du vlan 99 sur le trunk 3560-2(config)#interface gigabitEthernet 0/1 3560-2(config-if)#switchport trunk native vlan 999 3560-2(config-if)#end 3560-2# ! Tout rentre dans l’ordre pour STP maintenant que le vlan natif est identique des deux côtés de la liaison *Mar 1 03:04:25.236: %SPANTREE-2-UNBLOCK_CONSIST_PORT: Unblocking GigabitEthernet0/1 on VLAN0999. Port consistency restored. *Mar 1 03:04:25.236: %SPANTREE-2-UNBLOCK_CONSIST_PORT: Unblocking GigabitEthernet0/1 on VLAN0001. Port consistency restored.
Forcer le tagging du vlan natif…
Sur 3560-1…
3560-1(config)#vlan dot1q tag native
Sur 3560-2…
3560-2(config)#vlan dot1q tag native
Vérifications…
3560-1#show interfaces gigabitEthernet 0/1 switchport Name: Gi0/1 Switchport: Enabled Administrative Mode: trunk Operational Mode: trunk Administrative Trunking Encapsulation: dot1q Operational Trunking Encapsulation: dot1q Negotiation of Trunking: On Access Mode VLAN: 1 (default) Trunking Native Mode VLAN: 999 (NATIF) Administrative Native VLAN tagging: enabled Voice VLAN: none Administrative private-vlan host-association: none Administrative private-vlan mapping: none Administrative private-vlan trunk native VLAN: none Administrative private-vlan trunk Native VLAN tagging: enabled Administrative private-vlan trunk encapsulation: dot1q Administrative private-vlan trunk normal VLANs: none Administrative private-vlan trunk associations: none Administrative private-vlan trunk mappings: none Operational private-vlan: none Trunking VLANs Enabled: ALL Pruning VLANs Enabled: 2-1001 Capture Mode Disabled Capture VLANs Allowed: ALL Protected: false Unknown unicast blocked: disabled Unknown multicast blocked: disabled Appliance trust: none 3560-1#
On constate donc que le vlan natif est bien maintenant le vlan 999 et qu’en plus de cela il est désormais tagué.
Remarque
Certains modèles de switches ne permettent pas de définir si on souhaite ou non taguer le vlan natif. Par exemple, sur certains WS-C2960, cette fonctionnalité est présente par défaut et il n’est pas possible de la désactiver.
Article simple et digest , très utile et pratique, Merci infiniment.
Super article Merci
Merci beaucoup !!
MERCI Steve.
Bonjour,
juste pour signaler une petite coquille, juste sous le schéma, dans « la configuration de base des switch » le premier encadré est titré : « sur 2960-1 ». D’ailleurs dans « Sécurisation du Vlan natif » idem.
Ça prête à confusion, je testais les commandes sous un 2960, j’ai cru que ça marchait de la même manière.
Merci pour ce feedback, c’est désormais corrigé.
Bonjour Steve.
J’ai une question.
Dans la commande show interface …switchport ci-dessus, on a dans le résultat notamment les 2 lignes suivantes:
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 999 (NATIF)
Peux tu me dire, si une trame non tagguée arrive sur l’interface, sera-telle associée au vlan natif modifié (999) ou au vlan 1 (mode access) ?
Merci
Les trames non taguées arriveront dans le vlan 999, tant que le port fonctionnera en trunk. Le vlan d’accès n’est là que pour indiquer à quel vlan appartiendrait l’interface si elle fonctionnait en mode access.
merci beaucoup
Cool. Un plus!
Merci infiniment STEVE pour toutes ces informations. Merci encore une fois