Provya

Sécurité et téléphonie

Articles & Tutoriaux  -  Liens & Actualités

[pfSense] Configurer la priorisation de trafic avec CBQ

icon 04/02/2015

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.

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)
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
  • Schedule 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 :



À 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, "1Mbps"
  • 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 :
  1. qVoIP : pour le trafic à destination ou en provenance du fournisseur SIP
  2. qACK : pour le trafic ACK (acquittement TCP)
  3. qDefaut : pour le reste du trafic

Nous allons maintenant activer la priorisation de trafic sur l'interface LAN. Cliquer sur "LAN" :

pfSense configuration du traffic shaper


Renseigner les champs comme suit :
  • Enable/Disable : cocher la case pour activer la priorisation de trafic sur l'interface WAN
  • Schedule 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 :

pfSense configuration traffic shaping LAN


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/queue 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 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 :
  1. Règles définies en Floating
  2. Règles définies sur les groupes d'interfaces
  3. 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 des paquets IP 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" :

Menu Firewall Rules pfSense


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 features" (comme les queues d'affectation ou la gateway, par exemple).

Si nous reprenons notre exemple, nous devons créer les règles suivantes :
  1. Une première règle pour diriger le trafic en provenance de l'opérateur de VoIP vers la queue "qVoIP"
  2. Une seconde règle pour diriger le trafic à destination de l'opérateur de VoIP vers la queue "qVoIP"
  3. 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 l'icône en forme de "+" 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 :

config floating traffic shaping pfSense


Puis, dans la section "Advanced features", nous cliquons sur le bouton "Advanced" se trouvant sur 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.

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 :

config floating QoS queue pfSense


Enfin, on clique sur "Save" pour valider la règle.
Voila notre première règle créée :

floating rules QoS pfSense


Nous créons une nouvelle règle en cliquant sur l'icône en forme de "+".

Renseigner 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
Dans la section "Advanced features", nous cliquons sur le bouton "Advanced" se trouvant sur la ligne "Ackqueue/Queue".
Nous laissons la première liste déroulante à "none", et choisissons "qVoIP" pour la seconde.

Exemple de résultat obtenu :

pfSense floating rules QoS


On clique sur "Save" pour valider la règle.

Nous créons la dernière règle en cliquant sur l'icône en forme de "+".

Renseigner les champs comme suit :
  • Action : nous choisissons "Match"
  • Interface : nous choisissons les interfaces "WAN" et LAN
  • Protocol : nous choisissons "TCP"
Dans la section "Advanced features", nous cliquons sur le bouton "Advanced" se trouvant sur la ligne "Ackqueue/Queue".
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 :

pfSense floating rules QoS ACK


Nos trois règles d'affectation sont créées. Nous cliquons sur "Apply changes" pour valider la configuration.

pfSense floating rules exemple




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" :

pfSense reset firewall states


À 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" :

Status queues pfSense


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


Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.

icon Tags de l'article :

8 commentaires

Boujid - 11/10/2016 à 23:57:30

Sincèrement merci pour le tutorial, c'est vraiment génial

j'ai deux questions :

Question 1 :
dans votre cas, la ligne de 3 Mo est symétrique, c'est pour cette raison que vous avez dupliqué les Queues de l'interface WAN en LAN
donc, si j'ai une connexion WAN asymétrique je dois créer des Queues différentes ?
Queue pour le WAN-in (download) et Queue pour le WAN-out (upload) et Queue pour le LAN ???
(normalement le LAN c'est Ethernet 10/100/1000, bande passante très large par rapport au WAN, pourquoi y configurer une Queue ?)

Question 2 :
si j'ai OpenVPN actif, donc la bande passante WAN sera partagée entre le trafic du tunnel OpenVPN et le trafic utilisant le WAN
(exemple connexion vers serveurs du site distant via OpenVPN, mais la navigation Internet via l'interface WAN)
dans cet exemple, la ligne SDLC 3Mo = (WAN+OpenVPN) mais ce sont deux interfaces différentes, comment configurer la bande passante pour le WAN et pour l'OpenVPN ?
si la ligne est asymétrique ça va encore se compliquer

Merci

@répondre #lien

Guillaume - 13/10/2016 à 13:34:25

@Boujid : Bonjour,
Merci pour votre commentaire.

Question 1 : Ce n'est pas exactement ça. La configuration se fait par interface sortante. C'est-à-dire que les queues rattachées à l'interface WAN seront utilisées pour le trafic réseau qui sortira via le WAN (à destination d'Internet). Les queues rattachées à l'interface LAN seront utilisées par le trafic réseau qui sortira vers le LAN (en provenance d'Internet).
Dans votre cas (cas d'une connexion ADSL), vous allez créer une queue rattachée à l'interface WAN qui aura comme bande-passante maximale votre débit montant (ex : 500 Kbps) - puisque ça correspond au débit de votre trafic qui sort via l'interface WAN et qui part vers Internet - et une queue rattachée à l'interface LAN qui aura comme bande-passante maximale votre débit descendant (ex : 20 Mbps) - puisque ça correspond au débit de votre trafic qui sort via l'interface LAN, en provenance d'Internet.

Une fois ces queues existantes, il faut créer des règles de firewall (onglet Floating) pour faire matcher le trafic réseau et le faire transiter par ces queues. Ainsi, les queues rattachées à l'interface LAN ne brident pas le débit que vous avez en local (10/100/1000) car vous n'aurez pas de règle de firewall qui fera passer ce trafic par ces queues.

Questions 2 : C'est le même principe. Si, par exemple, vous souhaitez attribuer 1 Mbps à votre tunnel OpenVPN et 2 Mbps pour votre surf, vous allez créer 2 queues :
- qInternet : pour le trafic Internet
- qOpenVPN : pour le trafic VPN

Vous allez donc créer ces 2 queues sur l'interface WAN (pour le trafic sortant) et sur l'interface LAN (pour le trafic entrant).
Ensuite, si vous souhaitez prioriser le trafic qui passe à travers votre lien VPN (par exemple pour prioriser du flux VoIP sur un autre flux Data), vous devrez créer des queues sur l'interface OpenVPN et les règles de firewall correspondantes (via l'onglet floating).

Cordialement,

Guillaume
--
Provya

@répondre #lien

juba - 09/11/2016 à 10:53:57

Très beau tutoriel, j'ai beaucoup aimé.

Donc, dans mon cas j'ai une connexion ADSL de 4 Mo et je voulais partager ma connexion entre 3 flux à savoir: assistance par teamviewer, accès distant aux caméras de surveillance et le trafic internet par ordre de priorité. Pour cela j'ai fais comme expliquer dans le tutoriel et j'ai créer ces queues:
1. qSupport (pour l'assistance)
2. qCamera
3. qDefaut (pour le reste du trafic)
4. qASK
Dans la page Statut traffic Shaper, le trafic dans les queues qSupport et qCamera est nul, je crois que les connexion de teamviewer et l'accès aux caméras ne passe pas par ces queues.

@répondre #lien

juba - 09/11/2016 à 11:10:11

@juba :
Peut être que j'ai mal configurer les règles de floating.
Pour la queue qSupport j'ai fais:
-direction: any
-protocole tcp
-source type: any
-source port: 5938 (port utilisé par teamviewer)
-destination type: any
-destination port: 5938
-Ackqueue/Queue: none/qSupport
pour la queue qCamera:
-direction : any
-protocole tcp
-source type: any
-source port: 3777(port utilisé par le dvr)
-destination type: any
-destination port: 3777
-Ackqueue/Queue: none/qCamera

@répondre #lien

Guillaume - 10/11/2016 à 08:42:13

@juba : Bonjour,
Il y a un problème dans vos règles de floating. Vous confondez port source et port destination, je crois. Dans vos règles, laissez "any" pour le champ "source port".

Cordialement,

Guillaume
--
Provya

@répondre #lien

MONTA - 18/11/2017 à 09:28:14

Bonjour,

Je n'arrive pas à trouver le document qu'il me faut depuis depuis, sur la priorisation de groupe d'adresse IP dans un même Alias et surtout le partage de bande passante dynamique des adresse IP dans notre LAN. Nous n'avons pas besoin de prioriser des différents trafics (VoiP, ...) juste surf sur internet simple http et https. Pourrais-je utiliser encore CBQ, ... ou avez-vous d'autres suggestions SVP. Je voudrais prioriser les IP : 192.168.1.1 - 192.168.1.5 avec une priorisation de 1 à 5 puis diviser la reste des bandes passantes (ex : 2Mpbs) pour 20 personnes, c'est à dire chacun a 102,4 Kbps équitablement. Très très GRAND MERCI à vous.

@répondre #lien

Guillaume - 19/11/2017 à 10:07:23

@MONTA :
Bonjour,

CBQ peut effectivement être adapté à ce que vous souhaitez faire en terme de priorisation. Vous définissez des files d'attentes (queues), puis des règles d'affectation du trafic dans ces files. Ces règles peuvent être pour des services spécifiques (HTTP, SIP, etc.) ou pour des adresses IP (192.168.1.1 à .5), par exemple.

Pour le partage équitable de bande-passante entre vos 20 utilisateurs, je vous recommande de regarder du côté des limiters qui est clairement adapté pour cet usage.
Nous avons justement un article en cours de rédaction sur l'implémentation des limiters. Il devrait être publié d'ici la fin de l'année.

Cordialement,

Guillaume
--
Provya

@répondre #lien

icon Flux RSS des commentaires de cet article