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.

14 Comments on “Trunk dot1q et vlan natif

  1. merci, je suis des cours cisco mais ce n’était pas clair. je ne comprennais pas le vlan natif sur le trunk.
    maintenant oui