[pfSense] Configurer la priorisation de trafic avec CBQ
28/08/2019 - 27 commentaires
pfSense offre plusieurs mécanismes de priorisation de trafic. Après notre premier article présentant le mode de fonctionnement des trois principaux mécanismes de priorisation ([pfSense] Comprendre la priorisation de trafic), nous procédons dans cet article à sa mise en application à l'aide du protocole CBQ.
Article mis à jour le : 28/08/2019
Si nos besoins en règles de priorisation de trafic sont des besoins traditionnels, il est conseillé de travailler avec CBQ.
Nous ne détaillerons pas ici le mode de fonctionnement de CBQ, ni ses avantages ou inconvénients. Nous traiterons d'un cas pratique de mise en application sous pfSense et des bonnes pratiques à respecter.
Le mode de fonctionnement de CBQ est présenté dans notre article dédié : [pfSense] Comprendre la priorisation de trafic
Généralités sur la priorisation de trafic
Pour la mise en place de la priorisation de trafic, nous allons configurer d'un côté des queues (file d'attente) et de l'autre des rules (règles d'affectation des paquets dans ces files d'attente) :
- Queues : "file d'attente" à laquelle est associée une priorité de traitement et une bande passante
- Rules : "règle d'affectation" définissant la queue par laquelle un paquet va transiter. Ces règles sont les mêmes que pour la configuration du firewall : filtrage par port et adresse IP source, port et adresse IP de destination, protocole utilisé, etc.
La priorité de traitement la plus forte doit toujours être donnée aux applications nécessitant un traitement temps-réel. Typiquement, la VoIP.
La priorité suivante doit toujours être donnée aux acquittements TCP (ACK). Les ACK correspondent à des sortes d'accusé de réception sur les données transmises en TCP. Il est important que ces paquets soient prioritaires car autrement l'émetteur considérera que les paquets envoyés n'ont pas été correctement reçus et procédera à leur réémissions. Ce qui, par effet boule de neige, augmentera la charge sur la ligne Internet.
On considère que la bande passante nécessaire pour les ACK est de 10 à 15% du débit maximum offert en dowload (nous verrons en fin d'article comment affiner ce réglage).
Enfin, par convention de nommage, les queues commencent toujours par la lettre "q" (ex : qVoIP, qACK, qDefault, ...).
Pour le nommage des queues, et afin de facilité la lisibilité, nous recommandons l'utilisation du lowerCamelCase.
Cas d'application
Nous partirons du cas d'application suivant : une entreprise disposant d'une connexion Internet SDSL de 3Mbps sur laquelle transite sa téléphonie (VoIP) vers son opérateur SIP et le reste de sa data (surf, messagerie, etc.).
Le besoin est de prioriser sa téléphonie afin de garantir la qualité des communications et de disposer d'une répartition dynamique de sa bande passante.
Nous respecterons le principe KISS et mettrons en place les trois queues suivantes :
- qVoIP : ce sera la queue réservée à la téléphonie
- qACK : ce sera la queue réservée aux paquets ACK
- qDefaut : la queue par défaut par laquelle nous ferons passer le reste du trafic
Il est important de démarrer avec un nombre de queues réduit et sur des règles d'affectation simples. Puis, de procéder à du fine-tuning si nécessaire.
La queue qVoip disposera de la priorité la plus forte et d'une bande passante de 1Mbps (ce qui correspond environ à 10 appels simultanés avec le codec G.711)
La queue qACK disposera de la priorité suivante et d'une bande passante de 10% du débit max en download, soit 300Kbps.
Enfin, la queue qDefaut disposera d'une priorité assez faible (et du reste de la bande passante) permettant l'ajout ultérieur de queues avec des priorités intermédiaires en cas de besoin.
Configuration des queues
Nous commençons par la configuration des queues sur l'interface WAN.
Se rendre dans le menu Firewall > Traffic Shaper :
Dans l'onglet « By Interface » (celui par défaut), cliquer sur « WAN » :
Renseigner les champs comme suit :
- Enable/Disable : cocher la case pour activer la priorisation de trafic sur l'interface WAN
- Scheduler Type : choisir "CBQ"
- Bandwidth : indiquer le débit max en upload diminué de 10% (soit 2700Kbps)
- Queue Limit : laisser vide (sauf si l'on souhaite modifier la taille du buffer de paquets)
- TBR Size : laisser vide
Cliquer sur le bouton "Save" pour valider la configuration.
Exemple de résultat obtenu :
À noter : ne pas tenir compte pour le moment du message nous invitant à appliquer les changements. Nous le ferons lorsque nous aurons fini de configurer l'ensemble des queues.
Nous allons maintenant créer les queues. Pour cela, se repositionner sur l'interface "WAN" :
Puis cliquer sur le bouton "Add new Queue".
Renseigner les champs comme suit :
- Enable/Disable : cocher la case pour activer la file d'attente
- Queue Name : le nom de la file d'attente. Ici, ce sera "qVoIP"
- Priority : on choisit "7"
- Queue Limit : laisser vide (sauf si l'on souhaite modifier la taille du buffer de paquets)
- Scheduler options : laisser vide
- Description : une description optionnelle
- Bandwidth : la bande passante allouée à la queue. Dans notre exemple, "1000 Kbps"
- Scheduler specific options : cocher cette case afin d'activer le partage dynamique de bande-passante pour cette queue
Cliquer sur le bouton "Save" pour valider la configuration.
Exemple de résultat obtenu :
Notre première queue est créée. Pour la création de la suivante, nous nous repositionnons sur l'interface WAN (l'icône a pris la forme d'un dossier) :
Puis cliquer sur le bouton "Add new Queue".
Renseigner les champs comme suit :
- Enable/Disable : cocher la case pour activer la file d'attente
- Queue Name : le nom de la file d'attente. Ici, ce sera "qACK"
- Priority : on choisit "6"
- Queue Limit : laisser vide (sauf si l'on souhaite modifier la taille du buffer de paquets)
- Scheduler options : laisser vide
- Description : une description optionnelle
- Bandwidth : la bande passante allouée à la queue. Dans notre exemple, "300Kbps"
- Scheduler specific options : cocher cette case afin d'activer le partage dynamique de bande-passante pour cette queue
Cliquer sur le bouton "Save" pour valider la configuration.
Exemple de résultat obtenu :
Notre seconde queue est créée. Pour la création de la troisième et dernière queue (la queue par défaut), nous nous repositionnons sur l'interface WAN.
Puis nous cliquons sur le bouton "Add new Queue".
Renseigner les champs comme suit :
- Enable/Disable : cocher la case pour activer la file d'attente
- Queue Name : le nom de la file d'attente. Ici, ce sera "qDefaut"
- Priority : on choisit "2"
- Queue Limit : laisser vide (sauf si l'on souhaite modifier la taille du buffer de paquets)
- Scheduler options : cocher la case "Default Queue"
- Description : une description optionnelle
- Bandwidth : la bande passante allouée à la queue. Dans notre exemple, "1400Kbps"
- Scheduler specific options : cocher cette case afin d'activer le partage dynamique de bande-passante pour cette queue
Cliquer sur le bouton "Save" pour valider la configuration.
Exemple de résultat obtenu :
L'ensemble de nos queues côté WAN est créé. Nous disposons de 3 queues :
- qVoIP : pour le trafic à destination ou en provenance du fournisseur SIP
- qACK : pour le trafic ACK (acquittement TCP)
- qDefaut : pour le reste du trafic
Nous allons maintenant activer la priorisation de trafic sur l'interface LAN. Cliquer sur « LAN » :
Renseigner les champs comme suit :
- Enable/Disable : cocher la case pour activer la priorisation de trafic sur l'interface LAN
- Scheduler Type : choisir "CBQ"
- Bandwidth : indiquer le débit max en download diminué de 10% (soit 2700Kbps)
- Queue Limit : laisser vide (sauf si l'on souhaite modifier la taille du buffer de paquets)
- TBR Size : laisser vide
Cliquer sur le bouton "Save" pour valider la configuration.
Exemple de résultat obtenu :
Nous allons maintenant dupliquer les queues créées sur l'interface WAN vers l'interface LAN. Se rendre dans l'onglet "By Queue" :
Sélectionner la queue "qVoIP", puis, dans la section "LAN", choisir "Clone Shaper on this interface" :
Procéder de la même manière avec les queues "qACK" et "qDefaut".
Nos queues sont toutes créées :
Nous validons l'ensemble de ces paramétrages en cliquant sur le bouton "Apply Changes" :
Configuration des rules
Nous allons maintenant créer les règles d'affectation du trafic dans ces queues.
La configuration s'effectue au niveau des règles du Firewall. Elle peut s'effectuer directement depuis les règles existantes, ou en créant des règles génériques sur l'interface "Floating".
Les règles de vérification du Firewall s'opèrent dans l'ordre suivant :
- Règles définies en Floating
- Règles définies sur les groupes d'interfaces
- Règles définies sur les interfaces logiques
Pour un rappel sur le mode de fonctionnement des interfaces réseaux ou groupe d'interfaces sous pfSense, se référer à l'article dédié [pfSense] Comprendre la gestion des interfaces réseaux.
Dans notre cas, nous ne toucherons pas aux règles de filtrage en place sur nos interfaces ou groupe d'interfaces, mais nous créerons des règles spécifiques d'affectation du trafic depuis l'interface "Floating".
C'est ce que nous recommandons de faire systématiquement. Ainsi, nous ne mélangeons pas la partie "filtrage firewall" de la partie "règles de priorisation de trafic".
Pour cela, se rendre dans le menu "Firewall" > "Rules", puis sur l'onglet "Floating" :
La méthode de création des règles de firewall depuis l'onglet "Floating" est exactement la même que pour n'importe quelle interface. La seule différence est la présence de l'action "Match".
L'action "Match" signifie qu'aucune décision ne sera prise quant à l'acceptation (Pass) ou au refus (Block ou Reject) du paquet, mais que s'il correspond (="match") aux critères définis (adresse IP source ou destination, port source ou destination, système d'exploitation, protocole, etc.), alors il se verra appliquer les options définies dans les "Advanced Options" (comme les queues d'affectation ou la gateway, par exemple).
Si nous reprenons notre exemple, nous devons créer les règles suivantes :
- Une première règle pour diriger le trafic en provenance de l'opérateur de VoIP vers la queue "qVoIP"
- Une seconde règle pour diriger le trafic à destination de l'opérateur de VoIP vers la queue "qVoIP"
- Une dernière règle pour diriger tous les paquets ACK du trafic TCP vers la queue "qACK"
Nous créons notre première règle en cliquant sur le bouton "Add" et renseignons les champs comme suit :
- Action : nous choisissons "Match"
- Interface : nous choisissons l'interface "WAN"
- Direction : nous choisissons "in" (c'est-à-dire arrivant sur l'interface WAN)
- Protocol : nous choisissons "UDP" (les protocoles de VoIP SIP et RTP utilisant UDP)
- Source : nous choisissons "Single host or alias" et renseignons l'adresse IP du serveur VoIP de l'opérateur
Exemple de résultat obtenu :
Puis, dans la section "Advanced Options", nous cliquons sur le bouton "Display Advanced" et localisons en bas de page la ligne "Ackqueue / Queue". La première liste déroulante correspond à la queue d'acquittement (paquets ACK), la seconde liste déroulante correspond à la queue en tant que telle.
On ne peut choisir une "Ackqueue" (première liste déroulante), que si on a choisi une queue (seconde liste déroulante).
Ici, nous choisissons la queue "qVoIP" et nous laissons l'Ackqueue à "none" (les protocoles de VoIP SIP et RTP utilisant UDP).
Exemple de résultat obtenu :
Enfin, nous cliquons sur "Save" pour valider la règle.
Voila notre première règle créée :
Nous créons une nouvelle règle en cliquant sur le bouton "Add".
Nous renseignons les champs comme suit :
- Action : nous choisissons "Match"
- Interface : nous choisissons l'interface "WAN"
- Direction : nous choisissons "out" (c'est-à-dire sortant par l'interface WAN)
- Protocol : nous choisissons "UDP"
- Destination : nous choisissons "Single host or alias" et renseignons l'adresse IP du serveur VoIP de l'opérateur
Nous laissons la première liste déroulante à "none", et choisissons "qVoIP" pour la seconde.
Exemple de résultat obtenu :
Nous cliquons sur "Save" pour valider la règle.
Nous créons enfin la dernière règle en cliquant sur le bouton "Add".
Nous renseignons les champs comme suit :
- Action : nous choisissons "Match"
- Interface : nous choisissons les interfaces "WAN" et LAN
- Protocol : nous choisissons "TCP"
Nous choisissons "qACK" dans première liste déroulante à "none", et choisissons "qDefaut" dans la seconde.
On clique sur "Save" pour valider la règle.
Exemple de résultat obtenu :
Nos trois règles d'affectation sont créées. Nous cliquons sur "Apply changes" pour valider la configuration.
Remise à zéro de la table d'état
Les règles de priorisation de trafic ne s'appliquent que sur les nouvelles connexions. Les connexions en cours (visibles dans la table d'état) ne sont pas impactées par les règles que nous venons de créer.
Aussi, pour que ces règles soient prises en compte totalement, il est nécessaire de vider la table d'état.
Pour cela, se rendre dans le menu "Diagnostics" > "States".
Cliquer sur l'onglet "Reset States", puis sur le bouton "Reset" :
À noter : la page va charger sans fin. Ce comportement est normal : l'état de la connexion entre notre navigateur et le pfSense vient d'être réinitialisé.
Il suffit de rafraîchir la page pour continuer.
Analyse et Debug
Les statistiques d'utilisation des queues se trouvent dans le menu "Status" > "Queues" :
Si l'on voit des "drops" de paquets (avant-dernière colonne du tableau) dans une des queues prioritaires (qVoIP ou qACK), cela signifie que la bande passante qui leur est allouée est trop faible et qu'il faut, a priori, l'augmenter.
En revanche, avoir du drops de paquets dans les queues disposant d'une priorité faible (qDefaut) est normal : en cas de saturation de la ligne Internet, ces queues ne sont pas prioritaires.
La priorisation de trafic est maintenant en place sur notre pfSense !
Pour aller plus loin
[pfSense] Comprendre la priorisation de trafic
[pfSense] Utiliser les limiters pour contrôler la bande-passante par utilisateur
Tous nos articles classés par thème
Voir un article au hasard
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.