Table of Contents

QoS classification

QoS

La QoS (Quality Of Service) a pour but d'optimiser les ressources réseau : bandwidth, delay, jitter, packet loss pour les applications qui en ont le plus besoin (typiquement : la voix). Le concept, c'est donc de détecter les paquets de voix et de les faire passer avant les autres, considérés comme moins urgents.

Leaky bucket VS token bucket

Cet algorithme conserve les bursts (à la différence du lissage du shaping) mais permet d'écrêter tout le trafic excédant.

Modèles de QOS

Implémentation de la QoS

Les différents délais d'acheminement

Méthodologie de mise en place

Voici les 3 grandes étapes de la mise en place de la QoS dans un réseau :

Les différentes étapes de la QoS

Étape de la QoS Méthodes
classification & marquing class-map, DSCP
queuing (congestion management) WFQ, CBWFQ, LLQ
congestion avoidance WRED
shaping/policing CB-shaping/CB-policing
link efficiency cRTP, cPayload, HLPPP
CAC gatekeeper, RSVP

Classification et marquing

On peut différencier les paquets en fonctions des paramètres suivants :

Le marquage peut se faire à différentes couches OSI, dans différents champs en fonction du protocole :

L'IP precedence est l'ancienne utilisation du champ TOS d'IP : on n'utilisait que les 3 bits de poids fort (bits 7 à 5) ce qui faisait 6 classes (2 combinaisons étant réservées : 111 et 110).

Le champ TOS ou DSCP

C'est un champ de 8 bits codées ainsi :

765Correspond à
111
110
101ef
100af 4
011af 3
010af 2
001af 1
000default PHB

Une exception existe pour la valeur “001 000” qui code le trafic scavenger (less-than-best-effort, souvent du P2P).

Exemple : Si le champ TOS vaut 100010, le paquet correspond à de l'af41 (on découpe ainsi : 100-01-0). Ces 6 bits peuvent se lire en décimal : “PHB af41” correspond à “DSCP 34” (ces notations sont équivalentes).

Il existe une notation de classes “CS” (IPP), qui vaut xxx000 pour la compatibilité avec l'IP Precedence. Elle est donc codée sur 3 bits ; les valeurs 7 et 6 sont réservées (comme pour PHB).

TODO : insérer la table d'équivalence entre notation DSCP et CS.

Mise en place du marquage

Reconnaissance et marquage du champ DSCP du trafic HTTP et FTP (modèle DiffServ avec MQC). Le concept est simple :

  1. définition d'une classe de trafic (class-map) = on matche un trafic (dans notre cas on se sert d'ACLs dans les class-map)
  2. définition d'une policy pour cette classe = ce qui va être fait à ce trafic (policy-map)
  3. application de la policy sur une interface (service-policy)
access-list 101 permit cp any any eq ftp
access-list 101 permit cp any any eq ftp-data
access-list 102 permit cp any any eq www

class-map match-all match-ftp
 match access-group 101
class-map match-all match-www
 match access-group 102

policy-map mark-apps
 class match-ftp
  set dscp af11
 class match-www
  set dscp default

interface FastEthernet0/1
 service-policy input mark-apps
Vérifications
show class-map
show policy-map interface fa0/1

QoS pre-classify

Dans le cas de VPN, les entêtes IPs sont modifiées donc la classification peut être écrasée. Cisco utilise la fonction qos pre-clasify (ou QoS for VPNs) pour gérer ce problème.

Cette fonctionnalité est appelée QoS for Virtual Private Networks (VPNs) par Cisco ; certaines versions d'IOS un peu anciennes ne l'implémentent pas. En outre, cette commande est disponible uniquement sur les interfaces tunnel, virtual template interfaces, et sur les crypto map.

Mécanismes de queuing

Il s'agit du mécanisme d'ordonnancement des files d'attentes.

Les mécanismes de gestion de file d'attente software, qui servent à la QoS, ne sont utilisés que lorsque la file d'attente hardware de l'interface est pleine. Cette dernière est toujours en mode FIFO ; pour connaitre la taille du buffer hardware d'une interface (ici 128 max, et contient actuellement 0 paquet) :

show controller se0/1/0 | i tx_limited
 tx_limited = 0(128), errata19 count1 - 0, count2 - 0

Le buffer hardware peut être configuré avec la commande :

tx-ring-limit <taille>

Cependant il faut faire attention car une mauvaise configuration de ce dernier peut annuler toute la politique de QoS (s'il est trop important ou pas assez).

Mise en place du WFQ

Le WFQ priorise les flux qui ont un petit finish time càd les paquets qui mettent le moins de temps à être émis sur le lien. Cela prend en compte la taille du paquet (+ vite émis qu'un gros) ainsi que le remplissage de sa file (on privilégie les files les moins remplies quand on doit déterminer quel paquet dropper si le HQO (nombre max de paquets) est atteind, quitte a dropper un paquet déjà empilé dans une autre file plus longue).

La mise en place est très simple mais n'est possible que sur une interface de moins de 2 Mbps (à valider).

fair-queue [CDT [conversation dynamic-queues [conversation reservable-queues]]]

Réglage de la HQO (le défaut est 1000) :

hold-queue <max-limit> out
Vérifs
show interface se0/1/0
show queue se0/1/0

Mise en place de LLQ

On travaille sur des paquets déjà taggués en amont et on leur applique une politique de gestion de file d'attente en fonction de leur marquage.

Les classes reconnues sont définies dans des class-map :

class-map match-any ef-traffic
 match  dscp ef
 match protocol icmp
class-map match-all af21-traffic
 match  dscp af21
class-map match-all af31-traffic
 match  dscp af31
class-map match-all af11-traffic
 match  dscp af11
class-map match-all cs1-traffic
 match  dscp cs1

On définit l'action dans une policy-map globale, dans laquelle on va définir :

Chez Cisco, par défaut, on ne peut pas dépasser 75% de réservation pour toutes les files, les 25% restant étant gardé pour le routage, les entêtes de niveau 2, etc…

L'unité pour toutes les files de CBWFQ (af-xy et défaut ici) doivent être la même partout. Elle peut être soit une valeur de débit (bandwidth), soit un pourcentage du débit de l'interface ((bandwidth percent) soit un pourcentage du débit restant (bandwidth remaining percent).

policy-map llq-policy
 class ef-traffic
  priority 168
 class af31-traffic
  bandwidth remaining percent 40
 class af21-traffic
  bandwidth remaining percent 20
 class af11-traffic
  bandwidth remaining percent 13
 class cs1-traffic
  bandwidth remaining percent 2
 class class-default
  fair-queue 1024
  queue-limit 50
  bandwidth remaining percent 25

On applique (en output) sur une interface, par exemple la se0/1/0 (toute la QoS précédemment configurée est basée sur le paramètre bandwidth 384 (384 Kbps) de l'interface) :

interface Serial0/1/0
 bandwidth 384
 service-policy output llq-policy

Cette interface ne doit pas être en WFQ sous peine de tomber sur le message Must remove fair-queue configuration first.no fair-queue

⇒ la classification se fait en input et le queuing se fait en output.

Vérifications
show class-map
show policy-map interface fa0/1

Congestion avoidance

La méthode consiste à droper des paquets dans les buffers d'interface (software) avant son remplissage complet (chez Cisco c'est implémenté dans le WFQ). Ces drops anticipés permettent :

Les différentes gestions de file d'attente :

3 types de “drop” en RED : no drop, random drop et tail drop (ou full drop).

Pour mettre en place du (CB)(W)RED sur un type de classe, il faut passer la commande random-detect dans la rubrique class d'une policy-map (après avoir passé le paramètre bandwidth) :

policy-map pmap-test
 class match-http
  bandwidth percent 20
  random-detect dscp af11 32 36 10

Les paramètres ci-dessus sont facultatifs, mais s'ils sont précisés, ils affinent, dans l'ordre, le seuil min, le seuil max et le max-prod-denominator. Ce dernier chiffre est un dénominateur qui indique la pente de la droite de %age de drop entre les 2 seuils, min et max. Concrètement, un dénominateur de 10 comme au dessus indique un quotient de 1/10 soit 10%. Le taux de drop entre le seuil min et max est une droite qui part de 0% à 10 %. Puis, après le seuil max, on passe directement à 100% de drop.

Shaping/policing

ou trafic conditioner ; il s'agit de mécanismes de régulation de trafic.

Policing VS Shaping

Lexique

GTS : Generic Traffic Shaping
CIR Commited Information Rate = mean rate, ou débit souscrit
CAR Committed Access Rate
Bc conform burst
Be excess burst
pir Peak Information Rate
conform-action : action lorsque le débit est inférieur au Bc
exceed-action : action lorsque le débit est compris entre Bc et Bc+Be
violate-action : action lorsque le débit est supérieur à Bc+Be

Cisco recommends the following values for the normal and extended burst parameters:
normal burst = configured rate * (1 byte)/(8 bits) * 1.5 seconds
extended burst = 2 * normal burst

shaping

Le shaping c'est du lissage de trafic = étalement des bursts qui dépassent le CIR (Commited Information Rate, c'est-à-dire le débit souscrit d'une liaison louée) en remplissant un tampon (c'est peu conseillé pour les liaisons rapides car le tampon saturerait immédiatement). Ce tampon se vide lorsque la liaison est libre, c'est le concept du leaky bucket (seau troué).

Mise en place

Il existe 2 manières de mettre en place du shaping :

S'applique sur tout le trafic sortant de l'interface :

int xxx
 traffic-shape rate CIR [Bc [Be [buffer limit]]]

ou en utilisant une ACL pour sélectionner le trafic sur lequel s'appliquera le shaping :

int xxx
 traffic-shape groupe ACL CIR [Bc [Be]]
class-map match-all toto_class-map
 description class-map all traffic
 match any
!
policy-map toto_policy-map
 class toto_class-map
  ! envoyer Bc par intervalle
  shape average CIR Bc Be
  ! envoyer Bc+Be par intervalle
  shape peak CIR Bc Be
!
int xxx
 service-policy {input|output} toto_policy-map

policing

Le policing est l'écrêtement du trafic qui dépasse le CIR.

Le policing utilise le concept du token bucket (seau à jetons) = les jetons se régénèrent à la vitesse du CIR = Bc / Tc

Liens

Mécanismes :

policy-map llq-policy
 class ef-traffic
  compression header ip rtp
int se0/1/0
 compress [lzs | mppc | prediction | stac]
sh compress details
 Serial0/1/0
       Compression not active
       uncompressed bytes xmt/rcv 775/2114690
       compressed bytes   xmt/rcv 635/1334934
       Compressed bytes sent:       635 bytes   0 Kbits/sec  ratio: 1.220
       Compressed bytes recv:   1334934 bytes   36 Kbits/sec  ratio: 1.584
       1  min avg ratio xmt/rcv 0.000/0.000
       5  min avg ratio xmt/rcv 0.088/0.865
       10 min avg ratio xmt/rcv 0.088/0.865
       no bufs xmt 0 no bufs rcv 0
       resyncs 80
int se0/1/0
 ppp multilink group 1
int multilink 1
 shut
 ppp multilink fragment delay 10
 ppp multilink interleave
 no shut

Le but pour que cela soit efficace est d'avoir un “fragment delay” de 10 à 15 ms maximum.

Ces mécanismes sont consommateurs de ressources CPU ; aussi on les utilise surtout sur des interfaces à 64 Kbps ou moins.

VAD

La VAD (Voice Activity Detection) est un système de détection de blancs dans une conversation en VoIP. Cela permet de ne pas transmettre ces données inutiles, et donc de sauvegarder de la bande passante sur le réseau. Il permet de sauver 35% de la bande passante en moyenne (atteint pour un lien qui transmet 24 appels), mais cela dépend du fond sonore, du type d'appel (appel classique, conference-call = one-way, streaming).

Mise en place du control-plane

Le CoPP ou Control Plane Policing est un mécanisme censé protéger un routeur des attaques de type DoS en définissant des règles de priorité en cas de forte charge. Il protège le control plane (flux faisant fonctionner le réseau, comme les protocoles de routage OSPF ou BGP) et le management plane (flux d'administration : SSH, SNMP, etc…) en dépriorisant (mince, ce mot n'existe pas - mais vous devinez le sens ;) le service plane (services réseau comme les flux VPN par exemple) et le data plane (tous les autres flux = flux utilisateurs).

L'exemple ci-dessous permet, en cas de surcharge du routeur, de dropper tous les paquets sauf les paquets telnet initiés dans le LAN 192.168.0.0 /24.

access-list 110 deny tcp 192.168.0.0 0.0.0.255 any eq telnet
access-list 110 deny tcp any eq telnet 192.168.0.0 0.0.0.255
access-list 110 permit any any

class-map match-all telnet-class
 match access-group 110

policy-map control-plane-in
 class telnet-class
  drop

control-plane
 service-policy input control-plane-in

Cisco AutoQoS

Il existe 2 types d'autoQoS : VoIP et Enterprise. VoIP implémente un modèle statique pour la voix alors qu'Enterprise passe par une période de découverte (écoute passive) des flux afin d'affiner des classes en fonction du trafic réel de l'interface (avec NBAR). AutoQoS Enterprise permet de créer jusqu'à 10 classes de trafic.

L'AutoQoS Enterprise met en place les méthodes de QoS suivantes : LLQ, cRTP et LFI.

Prérequis

Limitations

Mise en place de l'AutoQos enterprise

auto discovery qos
auto qos

Vérifications :

show auto qos [interface se0/1/0]
show auto discovery qos [interface se0/1/0]
show mls qos interface se0/1/0
show mls qos maps

NBAR

NBAR (Network-Based Application Recognition) permet l'identification des applications/protocoles d'un paquet sur la base de signatures (PDLM) et permet d'en faire de la classification et des statistiques. Il travaille au niveau 4 - 7 mais il ne saura pas reconnaitre du HTTP sur un autre port que le celui qu'on lui spécifie (80 par défaut). Cela veut dire qu'il se base sur le numéro de port pour savoir lire le protocole auquel il s'attend. Ce n'est pas un IPS qui se base sur des signatures applicative et qui peut détecter du HTTP sur un “non-standard port”.

PDLM (Packet Description Language Module) : bout de code pour reconnaitre un protocole

Pour activer NBAR sur une interface (le CEF doit être activé : #ip cef) :

(config-if)#ip nbar protocol-discovery
show ip nbar port-map
 port-map bgp                      udp 179
 port-map bgp                      tcp 179
 port-map citrix                   udp 1604
 [..]

Pour modifier un port d'un protocole connu :

(config)#ip nbar port-map http tcp 8080

Puis, pour voir les statistiques des protocoles {sur l'interface fa0/1} :

show ip nbar protocol-discovery {interface fa0/1}

Ce nouveau port remplace celui par défaut (cela signifit que NBAR ne reconnaitra plu le HTTP sur le port standard (80) !) ; pour en rajouter un, on l'ajoute à la suite :

(config)#ip nbar port-map http tcp 80 8080

Pour charger un PLDM :

(config)#ip nbar pldm <nom du pldm>