27.7. Configuration de la limitation du débit des paquets à l'aide de l'utilitaire tc-ctinfo
L'entrée de suivi de connexion stocke la marque Netfilter
et les informations de connexion. Lorsqu'un routeur transmet un paquet provenant du pare-feu, il supprime ou modifie l'entrée de suivi de connexion du paquet. Le module d'informations de suivi de connexion (ctinfo
) récupère les données des marques de suivi de connexion dans différents champs. Ce module du noyau préserve la marque Netfilter
en la copiant dans le champ de métadonnées de la marque de la mémoire tampon de la socket (skb
). Les étapes suivantes permettent de limiter le débit des paquets sur les systèmes serveurs à l'aide du module ctinfo
.
Conditions préalables
-
L'utilitaire
iperf3
est installé sur un serveur et un client.
Procédure
Effectuez les étapes suivantes sur le serveur :
Ajouter un lien virtuel à l'interface réseau :
# ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
Cette commande a les paramètres suivants :
-
name ifb4eth0
nom de l'appareil virtuel : Définit le nouveau nom de l'appareil virtuel -
numtxqueues 48
nombre de files d'attente : Définit le nombre de files d'attente d'émission -
numrxqueues 48
nombre de files d'attente de réception : Définit le nombre de files d'attente de réception -
type ifb
type d'appareil : définit le type du nouvel appareil
-
Modifier l'état de l'interface
ifb4eth0
:# ip link set dev ifb4eth0 up
Ajouter le site
qdisc
sur l'interface réseau et l'appliquer au trafic entrant :# tc qdisc add dev enp1s0 handle ffff: ingress
Dans l'option
handle ffff:
, le paramètrehandle
attribue le numéro majeur comme valeur par défautffff:
à une classeqdisc
. Le paramètreqdisc
est un paramètre de discipline de mise en file d'attente permettant d'analyser le contrôle du trafic.Ajouter un filtre sur l'interface
enp1s0
du protocoleip
pour classifier les paquets :# tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
Cette commande possède les attributs suivants :
-
parent ffff:
: Définit le numéro majeurffff:
pour le parentqdisc
. -
u32 match u32 0 0
le filtreu32
est défini pourmatch
les en-têtes IP du modèleu32
. Le premier0
représente le deuxième octet de l'en-tête IP et le second0
correspond au masque qui indique au filtre quels bits doivent être pris en compte. -
action ctinfo
action : Définit l'action pour récupérer les données du marqueur de suivi de connexion dans les différents champs. -
cpmark 100
copie la marque de suivi de connexion (connmark)100
dans le champ d'en-tête IP du paquet. -
action mirred egress redirect dev ifb4eth0
le message suivant s'affiche :action
mirred
redirige les paquets reçus vers l'interface de destinationifb4eth0
.
-
Ajouter un classful
qdisc
à l'interfaceifb4eth0
:# tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
Cette commande définit le numéro majeur
1
à la racineqdisc
et utilise le jeton de hiérarchie buckethtb
classfulqdisc
of minor-id1000
.Limiter le trafic sur
ifb4eth0
à 1 Mbit/s avec une limite supérieure de 2 Mbit/s :# tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
Cette commande a les paramètres suivants :
-
parent 1:1
: Définitparent
avecclassid
en tant que1
etroot
en tant que1
. -
classid 1:100
le siteclassid
est nommé1:100
où1
est le numéro du parentqdisc
et100
est le numéro des classes du parentqdisc
. -
htb ceil 2mbit
la classehtb
qdisc
autorise la limite supérieure de la bande passante de2 Mbit/s
en tant que limite de débit deceil
.
-
Appliquer le Stochastic Fairness Queuing (
sfq
) de l'interface sans classeqdisc
à l'interfaceifb4eth0
avec un intervalle de temps de60
secondes pour réduire la perturbation de l'algorithme de la file d'attente :# tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
Ajouter le filtre Firewall mark (
fw
) à l'appareilifb4eth0
:# tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
Restaurer la méta-marque de paquet à partir de la marque de connexion (
CONNMARK
) :# nft add rule ip mangle PREROUTING counter meta mark set ct mark
Dans cette commande, l'utilitaire
nft
dispose de la tablemangle
avec la spécification de la règle de chaînePREROUTING
qui modifie les paquets entrants avant le routage pour remplacer la marque du paquet parCONNMARK
.Pour créer une table et ajouter une règle de chaîne s'il n'existe pas de table et de chaîne
nft
:# nft add table ip mangle # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
Définir la marque méta sur les paquets
tcp
qui sont reçus à l'adresse de destination spécifiée192.0.2.3
:# nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
Enregistrer la marque de paquet dans la marque de connexion :
# nft add rule ip mangle PREROUTING counter ct mark set mark
Exécutez
iperf3
en tant que serveur sur un système et écoutez en tant que serveur-s
qui attend la réponse de la connexion du client :# iperf3 -s
Exécutez
iperf3
sur un autre système en tant que client et connectez-vous au serveur qui écoute l'adresse IP192.0.2.3
pour obtenir l'horodatage des requêtes et des réponses HTTP périodiques :# iperf3 -c 192.0.2.3 -t TCP_STREAM | tee rate
- Sur le serveur, appuyez sur Ctrl+C.
L'utilitaire
iperf3
du serveur affiche les résultats :Accepted connection from 192.0.2.4, port 52128 [5] local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130 [ID] Interval Transfer Bitrate [5] 0.00-1.00 sec 119 KBytes 973 Kbits/sec [5] 1.00-2.00 sec 116 KBytes 950 Kbits/sec .... - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Interval Transfer Bitrate [5] 0.00-14.81 sec 1.51 MBytes 853 Kbits/sec receiver iperf3: interrupt - the server has terminated
Appuyer sur Ctrl+C pour mettre fin à
iperf3
sur le serveur :Connecting to host 192.0.2.3, port 5201 [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201 [ID] Interval Transfer Bitrate Retr Cwnd [5] 0.00-1.00 sec 481 KBytes 3.94 Mbits/sec 0 76.4 KBytes [5] 1.00-2.00 sec 223 KBytes 1.83 Mbits/sec 0 82.0 KBytes .... - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Interval Transfer Bitrate Retr [5] 0.00-14.00 sec 3.92 MBytes 2.35 Mbits/sec 32 sender [5] 0.00-14.00 sec 0.00 Bytes 0.00 bits/sec receiver iperf3: error - the server has terminated
Vérification
Affichez les statistiques sur le nombre de paquets des classes
htb
etsfq
sur l'interfaceifb4eth0
:# tc -s qdisc show dev ifb4eth0 qdisc htb 1: root .... Sent 26611455 bytes 3054 pkt (dropped 76, overlimits 4887 requeues 0) .... qdisc sfq 8001: parent .... Sent 26535030 bytes 2296 pkt (dropped 76, overlimits 0 requeues 0) ....
Affichez les statistiques du nombre de paquets pour les actions
mirred
etctinfo
:# tc -s filter show dev enp1s0 ingress filter parent ffff: protocol ip pref 49152 u32 chain 0 filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1 filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid not_in_hw (rule hit 8075 success 8075) match 00000000/00000000 at 0 (success 8075 ) action order 1: ctinfo zone 0 pipe index 1 ref 1 bind 1 cpmark 0x00000064 installed 3105 sec firstused 3105 sec DSCP set 0 error 0 CPMARK set 7712 Action statistics: Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 action order 2: mirred (Egress Redirect to device ifb4eth0) stolen index 1 ref 1 bind 1 installed 3105 sec firstused 3105 sec Action statistics: Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 61 requeues 0) backlog 0b 0p requeues 0
Affiche les statistiques de
htb
rate-limiter et sa configuration :# tc -s class show dev ifb4eth0 class htb 1:100 root leaf 8001: prio 7 rate 1Mbit ceil 2Mbit burst 1600b cburst 1600b Sent 26541716 bytes 2373 pkt (dropped 61, overlimits 4887 requeues 0) backlog 0b 0p requeues 0 lended: 7248 borrowed: 0 giants: 0 tokens: 187250 ctokens: 93625
Ressources supplémentaires
-
tc(8)
page de manuel -
tc-ctinfo(8)
page de manuel -
nft(8)
page de manuel