Simuler des réseaux WAN

Latence, débit, pertes de packets, corruptions de données, (dés)ordre des trames, les réseaux WAN ont toutes sortes de propriétés que ne rencontrent pas ou peu les réseaux locaux.

Simuler ce type de comportement est très utile pour vos tests. C’est évidemment le cas avec les technologies de reprise d’activité comme Streams, GoldenGate ou Data Guard. C’est encore plus essentiel avec des technologies synchrones comme certaines réplications ou mirroring. Enfin, c’est indispensable si vous voulez vous essayez aux stretched clusters…

La majorité des distributions Linux sont compilées avec des gestionnaires de files d’attentes qui permettent d’influer sur les propriétés vos flux réseaux. Pour tout savoir sur ces fonctionnalités, lisez le chapitre 9 du « Howto » intitulé « Linux Advanced Routing & Traffic Control » ou sa traduction francaise. Vous pourrez utiliser ces fonctionnalités directement avec vos serveurs Linux ou sur un routeur Linux entre vos serveurs.

Cet article présente plusieurs exemples d’utilisation des gestionnaires Netem et Token Bucket Filter (tbf) pour simuler un WAN.

  • Netem signifie NETwork EMulator. Il s’agit d’un gestionnaire de file d’attente qui permet de simuler la plupart des propriétés d’un WAN à savoir la latence, les pertes de packets, la corruption de données et désordre des trames
  • TBF signifie Tocket Bucket Filter. Il s’agit d’un gestionnaire de file d’attente qui permet de limiter la bande passante

Latence (et perte de packets)

Pour ajouter Netem et des propriétés associés comme gestionnaire de file d’attente à un device réseau vous utilisez la commande tc (Traffic Control) le gestionnaire des files d’attentes ou qdisc (queuing discipline). Vous l’attachez à la racine (root) du device réseau. Vous précisez un numéro de référence ainsi que sa position dans la chaîne des gestionnaires de file d’attente. Ici, il n’y a qu’un seul gestionnaire, vous le référencerez 1:. La commande pour forcer une latence est donc celle-ci :

tc qdisc add dev eth0 root handle 1: netem delay 250ms

Vous pouvez vérifier le paramétrage à l’aide de la commande tc qdisc show comme ci-dessous :

tc qdisc show dev eth0
qdisc netem 1: root refcnt 5 limit 1000 delay 250.0ms

Un simple ping sur l’adresse de votre serveur montre ainsi qu’une latence a été ajoutée. Vous pourrez avec Netem préciser des propriétés qui induiront : pertes de packets, duplication de packets, corruption de packet, réordonnancement de packets. Pour supprimer le gestionnaire de file d’attente, utilisez simplement la commande del ci-dessous :

tc qdisc del dev eth0 root
tc qdisc show dev eth0
qdisc mq 0: root

Bande passante

Pour limiter la bande passante, vous devrez utiliser un autre gestionnaire de file d’attente que Netem. Token Bucket Filter permet de limiter la bande passante de manière fixe. Son utilisation est similaire à celle de Netem ; seules ses propriétés diffèrent ; par exemple la commande ci-dessous passe la bande passante à 256Ko/s :

tc qdisc add dev eth0 root handle 1: 
   tbf limit 20kb rate 256kbps burst 20kb mtu 1514

Vous pouvez vérifier la configuration à l’aide de la commande tc qdisc show :

tc qdisc show dev eth0
qdisc tbf 1: root refcnt 5 rate 2048Kbit burst 20Kb lat 0us

Vous pouvez tester la limite de la bande passante en échangeant un fichier à l’aide de scp par exemple. Vous constaterez de manière évidente la limite du flux. Pour supprimer la règle ; utilisez la commande tc qdisc del :

tc qdisc del dev eth0 root
tc qdisc show dev eth0
qdisc mq 0: root

Combinaison de Latence et Bande passante

Il est possible de créer une chaîne de gestionnaire de file d’attente pour utiliser les gestionnaires Netem et TBF ensemble.

Pour prendre les 2 exemples précédents, vous ajouterez un gestionnaire Netem comme maillon root de votre réseau et un gestionnaire TBF avec comme parent le gestionnaire Netem comme maillon suivant de la chaine. Voici une syntaxe qui utilise la référence 1: pour le premier maillon et 2: pour le second :

tc qdisc add dev eth0 root handle 1: netem delay 250ms
tc qdisc add dev eth0 parent 1: handle 2:
tbf limit 20kb rate 256kbps burst 20kb mtu 1514

Les 2 gestionnaires étant configurés, vous pouvez vérifier les 2 maillons de la chaines à l’aide de la commande tc qdisc show :

tc qdisc show dev eth0
qdisc netem 1: root refcnt 5 limit 1000 delay 250.0ms
qdisc tbf 2: parent 1: rate 2048Kbit burst 20Kb lat 0us

Testez la chaîne en faisant un scp d’un fichiers, vous constaterez que la vitesse monte lentement ; c’est dû à l’effet combiné de la latence et du seuil sur la bande passante. Une fois vos tests réalisés, supprimez les 2 qdisc à l’aide de la commande ci-dessous :

tc qdisc del dev eth0 parent 1:
tc qdisc del dev eth0 root
tc qdisc show dev eth0
qdisc mq 0: root

Et aussi…

Les gestionnaires de file d’attente sont d’une extrême utilité ! Outre la simulation d’un WAN, vous serez également très intéressé par le gestionnaire dit « Class Based Queueing« . Celui-ci permet de mettre en place des priorités ou, entrement dit, de la QoS sur le réseau pour favoriser un flux plutôt qu’un autre.

Utilisé avec iptables, cela peut servir à favoriser une nature de flux à l’autre ou, dans le cas où vous utiliser des bridges sur le réseau, avec Xen ou Oracle VM par exemple, pour favoriser sur l’interface physique le trafic vers une VM plutôt qu’une autre. Enfin, cela est déjà une toute autre histoire…