2 votes

La priorisation du trafic avec Linux htb ne fonctionne pas, pourquoi ?

Je suis un novice en matière de QoS sous Linux et j'essaie d'apprendre comment cela fonctionne en utilisant les documents de lartc.org comme référence.

Mon premier objectif est modeste : Je veux attribuer une priorité plus élevée au trafic sortant UDP, mais pour une raison quelconque, cela ne fonctionne pas.

Voici mes progrès actuels :

#!/bin/bash

IPTABLES=/usr/sbin/iptables
TC=/usr/sbin/tc

# All traffic is given an iptables MARK depending on its type:
#   * 10 for low latency traffic (all UDP traffic)
#   * 20 anything else

# all traffic
$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 20
# udp 
$IPTABLES -t mangle -A PREROUTING -i eth0 -p udp -j MARK --set-mark 10

# root qdisc
$TC qdisc add dev eth0 root handle 1: htb
# overall rate limits (1Mbps outgoing)
$TC class add dev eth0 parent 1: classid 1:1 htb rate 1Mbit
# UDP
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1Mbit prio 0
# everything else
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 512kbit ceil 1Mbit prio 1

# do fair shaping in each class
$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

# divert traffic marked by iptables into each class
$TC filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev eth0 parent 1:0 protocol ip handle 20 fw flowid 1:20 

Les règles iptables semblent correctes :

$ sudo /usr/sbin/iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  anywhere             anywhere            MARK set 0x14 
MARK       udp  --  anywhere             anywhere            MARK set 0xa 

Mais pour autant que je puisse dire, je n'obtiens pas le résultat escompté. Voici comment je vérifie :

$ sudo /usr/sbin/tc -s qdisc show     
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 0 direct_packets_stat 190646
 Sent 73059945 bytes 190646 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 10: dev eth0 parent 1:10 limit 127p quantum 1514b perturb 10sec 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 20: dev eth0 parent 1:20 limit 127p quantum 1514b perturb 10sec 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

Vérifiez que les compteurs d'octets envoyés sont à 0.

Donc soit mon script a des problèmes, soit il fonctionne, mais j'utilise une mauvaise façon d'afficher les statistiques.

Voici mes questions :

  1. Quel est le problème avec mon script ?
  2. Y a-t-il d'autres moyens de déboguer les règles htb que d'utiliser "tc show" pour afficher les statistiques ?

1voto

munaz Points 23

Dans quel sens vont vos interfaces ? Votre queue HTB est appliquée à eth0, ce qui est logique si eth0 est votre interface externe. Cependant, vous attachez le fwmark avec iptables aux paquets qui arrivent sur eth0, et non qui en sortent -- vous devez probablement échanger le -i contre un -o dans la ligne iptables. Sinon, vous appliquez une marque aux paquets allant dans un sens, et vous cherchez la marque pour filtrer les paquets allant dans l'autre sens. Il est évident que les paquets entrants n'atteindront jamais le filtre sortant, c'est pourquoi vos compteurs indiquent tous zéro.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X