QoS classification
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.
Cet algorithme conserve les bursts (à la différence du lissage du shaping) mais permet d'écrêter tout le trafic excédant.
Voici les 3 grandes étapes de la mise en place de la QoS dans un réseau :
É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 |
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).
C'est un champ de 8 bits codées ainsi :
7 | 6 | 5 | Correspond à |
---|---|---|---|
1 | 1 | 1 | |
1 | 1 | 0 | |
1 | 0 | 1 | ef |
1 | 0 | 0 | af 4 |
0 | 1 | 1 | af 3 |
0 | 1 | 0 | af 2 |
0 | 0 | 1 | af 1 |
0 | 0 | 0 | default 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.
Reconnaissance et marquage du champ DSCP du trafic HTTP et FTP (modèle DiffServ avec MQC). Le concept est simple :
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
match-all
) ou OU (match-any
) pour indiquer si le trafic doit matcher chaque clause (ET) ou au moins une (OU).show class-map show policy-map interface fa0/1
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.
qos pre-classify
when you want to classify packets based on the pretunnel header. qos pre-classify
when you want to classify packets based on the post-tunnel header.qos pre-classify
when you want to classify packets based on the pretunnel header.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.
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).
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
show interface se0/1/0 show queue se0/1/0
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 :
priority
)) pour la classe ef-traffic ; en limitant son débit à 168 Kbps maximum (j'insère aussi l'ICMP pour faire des tests de ping)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.
show class-map show policy-map interface fa0/1
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.
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
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é).
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
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
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.
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).
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
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.
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 (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>