Rechercher

27.7. Configuration de la limitation du débit des paquets à l'aide de l'utilitaire tc-ctinfo

download PDF

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

  1. Effectuez les étapes suivantes sur le serveur :

    1. 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
    2. Modifier l'état de l'interface ifb4eth0:

      # ip link set dev ifb4eth0 up
    3. 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ètre handle attribue le numéro majeur comme valeur par défaut ffff: à une classe qdisc. Le paramètre qdisc est un paramètre de discipline de mise en file d'attente permettant d'analyser le contrôle du trafic.

    4. Ajouter un filtre sur l'interface enp1s0 du protocole ip 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 majeur ffff: pour le parent qdisc.
      • u32 match u32 0 0 le filtre u32 est défini pour match les en-têtes IP du modèle u32. Le premier 0 représente le deuxième octet de l'en-tête IP et le second 0 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 destination ifb4eth0.
    5. Ajouter un classful qdisc à l'interface ifb4eth0:

      # tc qdisc add dev ifb4eth0 root handle 1: htb default 1000

      Cette commande définit le numéro majeur 1 à la racine qdisc et utilise le jeton de hiérarchie bucket htb classful qdisc of minor-id 1000.

    6. 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éfinit parent avec classid en tant que 1 et root en tant que 1.
      • classid 1:100 le site classid est nommé 1:1001 est le numéro du parent qdisc et 100 est le numéro des classes du parent qdisc.
      • htb ceil 2mbit la classe htb qdisc autorise la limite supérieure de la bande passante de 2 Mbit/s en tant que limite de débit de ceil.
    7. Appliquer le Stochastic Fairness Queuing (sfq) de l'interface sans classe qdisc à l'interface ifb4eth0 avec un intervalle de temps de 60 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
    8. Ajouter le filtre Firewall mark (fw) à l'appareil ifb4eth0:

      # tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
    9. 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 table mangle avec la spécification de la règle de chaîne PREROUTING qui modifie les paquets entrants avant le routage pour remplacer la marque du paquet par CONNMARK.

    10. 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 \;}
    11. Définir la marque méta sur les paquets tcp qui sont reçus à l'adresse de destination spécifiée 192.0.2.3:

      # nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
    12. Enregistrer la marque de paquet dans la marque de connexion :

      # nft add rule ip mangle PREROUTING counter ct mark set mark
    13. 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
  2. Exécutez iperf3 sur un autre système en tant que client et connectez-vous au serveur qui écoute l'adresse IP 192.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
  3. Sur le serveur, appuyez sur Ctrl+C.
  4. 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
  5. 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

  1. Affichez les statistiques sur le nombre de paquets des classes htb et sfq sur l'interface ifb4eth0:

    # 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)
    ....
  2. Affichez les statistiques du nombre de paquets pour les actions mirred et ctinfo:

    # 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
  3. 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
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.