9.7. Le périphérique de file d'attente intermédiaire (The Intermediate queueing device (IMQ))

Le périphérique IMQ n'est pas un gestionnaire de mise en file d'attente mais son utilisation est fortement liée à ceux-ci. Au coeur de Linux, les gestionnaires de mise en file d'attente sont attachés aux périphériques réseaux et tout ce qui est mis en file d'attente dans ce périphérique l'est d'abord dans le gestionnaire. Avec ce concept, il existe deux limitations :

1. Seule la mise en forme du trafic sortant est possible (un gestionnaire d'entrée existe, mais ses possibilités sont très limitées en comparaison des gestionnaires de mise en file basés sur les classes).

2. Un gestionnaire de mise en file d'attente ne voit le trafic que d'une interface, et des limitations globales ne peuvent pas être mises en place.

IMQ est ici pour aider à résoudre ces deux limitations. En résumé, vous pouvez mettre tout ce que vous voulez dans un gestionnaire de mise en file d'attente. Les paquets spécialement marqués sont interceptés par les points d'accroche netfilter NF_IP_PRE_ROUTING et NF_IP_POST_ROUTING et sont transférés vers le gestionnaire attaché au périphérique imq. Une cible iptables est utilisée pour le marquage des paquets.

Ceci vous permet de réaliser de la mise en forme d'entrée étant donné que vous pouvez marquer les paquets entrant par un périphérique quelconque et/ou traiter les interfaces comme des classes pour configurer des limites globales. Vous pouvez également réaliser de nombreuses autres choses comme simplement mettre votre trafic http dans un gestionnaire, mettre les requêtes de nouvelles connexions dans un gestionnaire, ...

9.7.1. Configuration simple

La première chose qui devrait vous venir à l'esprit est d'utiliser la mise en forme du trafic entrant pour vous garantir une grande passante. ;) La configuration se fait comme avec n'importe quelle autre interface :

tc qdisc add dev imq0 root handle 1: htb default 20

tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k

tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit

tc qdisc add dev imq0 parent 1:10 handle 10: pfifo
tc qdisc add dev imq0 parent 1:20 handle 20: sfq

tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match \
                ip dst 10.0.0.230/32 flowid 1:10

Dans cet exemple, u32 est utilisé pour la classification. Les autres classificateurs devraient marcher tout aussi bien. Le trafic doit ensuite être sélectionné et marqué pour être mis en file d'attente vers imq0.

iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0

ip link set imq0 up

Les cibles iptables IMQ sont valides dans les chaînes PREROUTING et POSTROUTING de la table mangle. La syntaxe est la suivante :

IMQ [ --todev n ]        n : numéro du périphérique imq

Il existe aussi une cible ip6tables.

Notez que le trafic n'est pas mis en file d'attente quand la cible est activée, mais après. La localisation exacte de l'entrée du trafic dans le périphérique imq dépend de la direction de ce trafic (entrant/sortant). Ces entrées sont les points d'accroche prédéfinis de netfilter et utilisés par iptables :

enum nf_ip_hook_priorities {
        NF_IP_PRI_FIRST = INT_MIN,
        NF_IP_PRI_CONNTRACK = -200,
        NF_IP_PRI_MANGLE = -150,
        NF_IP_PRI_NAT_DST = -100,
        NF_IP_PRI_FILTER = 0,
        NF_IP_PRI_NAT_SRC = 100,
        NF_IP_PRI_LAST = INT_MAX,
};

Pour le trafic entrant, imq se déclare avec la priorité NF_IP_PRI_MANGLE + 1, ce qui signifie que les paquets entrent dans le périphérique imq juste après la chaine PREROUTING de la table mangle.

Pour le trafic sortant, imq utilise NF_IP_PRI_LAST qui honore le fait que les paquets rejetés par la table filter n'occuperont pas de bande passante.

Les mises à jour et de plus amples informations peuvent être trouvées sur le site imq.