Je veux simuler le scénario suivant: étant donné que j'ai 4 machines serveurs ubuntu A, B, C et D. Je veux réduire la bande passante du réseau de 20% entre la machine A et la machine C et de 10% entre A et B. faire cela en utilisant des outils de simulation / limitation de réseau?
ubuntu
networking
tcp
linux-networking
bandwidth
Yehia Elshater
la source
la source
tc
fait lorsqu'il est utilisé avec le marquage iptables.Réponses:
Pour ce faire, vous pouvez utiliser
tc
seul avec desu32
filtres ou combiné avec le marquage iptables (peut-être plus simple si vous ne voulez pas apprendre la syntaxe des filtres complexes). Je vais dans le post suivant détailler l'ancienne solution.Simuler votre configuration
À titre d'exemple, considérons A, B, C et D exécutant des interfaces virtuelles à 10 Mbit / s .
Vous voulez essentiellement:
Afin de simuler cela, je vais créer 4 espaces de noms réseau et interfaces Ethernet virtuelles connectés à un pont.
Bien sûr, dans votre cas, vous travaillerez avec de vraies cartes réseau et le pont sera votre passerelle ou un commutateur en fonction de votre infrastructure.
Donc, dans ma simulation, nous aurons la configuration suivante, dans un réseau 10.0.0.0/24:
Tout d'abord, la phase de configuration afin que vous puissiez comprendre de quoi elle est faite, ignorez-la si vous ne la connaissez pas, ce n'est pas grave. Ce que vous devez cependant savoir, c'est que la commande
ip netns exec <namespace> <command>
permet d'exécuter une commande dans un espace de noms réseau (c'est-à-dire dans l'une des cases du dessin précédent). Cela sera également utilisé dans la section suivante.Donc, à ce stade, nous avons la configuration décrite précédemment.
Façonner le trafic
Il est temps d'entrer dans le contrôle du trafic afin d'obtenir ce que vous voulez. L'
tc
outil vous permet d'ajouter des disciplines de mise en file d'attente:Il est livré avec 3 notions: qdisc , classes et filtres . Ces notions peuvent être utilisées pour configurer une gestion complexe du flux de paquets et hiérarchiser le trafic en fonction du ou des critères que vous souhaitez.
En un mot :
Tout cela fonctionne généralement comme un arbre où les feuilles sont des disques qd et les classes sont des nœuds. La racine d'un arbre ou d'un sous-arbre sera déclarée comme
<id>:
et les nœuds enfants seront déclarés comme<parent_id>:<children_id>
. Gardez cette syntaxe à l'esprit.Pour votre cas, prenons A et rendons l'arbre avec lequel vous souhaitez configurer
tc
:Explication:
1:
est le qdisc racine attaché au périphérique vethA, il sera pris explicitement commehtb
pour le compartiment de jetons de hiérarchie (le qdisc par défaut d'un périphérique estpfifo
oupfifo_fast
dépend du système d'exploitation). Il est particulièrement approprié pour la gestion de la bande passante. Les paquets qui ne correspondent pas aux filtres définis à ce niveau iront en1:30
classe.1:1
sera unehtb
classe limitant l'ensemble du trafic de l'appareil à 10 Mbit / s.1:10
sera unehtb
classe limitant le trafic de sortie à 9 Mbit / s (90% de 10 Mbit / s).1:20
sera unehtb
classe limitant le trafic de sortie à 8 Mbit / s (80% de 10 Mbit / s).1:30
sera unehtb
classe limitant le trafic à 10 Mbit / s (repli).:10, :20, :30
sontsfq
qdisc pour la mise en file d'attente d'équité stochastique. En d'autres termes, ces qdiscs garantiront l'équité de la planification de la transmission en fonction des flux.Tout cela est configuré par les commandes suivantes:
La dernière chose dont nous avons besoin est d'ajouter des filtres pour que les paquets IP avec IP de destination égal à B iront en
1:10
classe et les paquets IP avec IP de destination égal à C iront en1:20
classe:Maintenant que vous avez l'idée, vous devrez ajouter des
tc
règles similaires à B et C afin que les transmissions vers A de ces plates-formes soient également façonnées.Essai
Maintenant, testons-le. Pour cela, je suis personnellement habitué à jouer avec
iperf
, il se compose simplement d'un seul binaire qui peut être exécuté en tant que client ou serveur et enverra automatiquement autant de trafic que possible entre les deux hôtes.Entre A et B :
Nous obtenons notre limite de bande passante de 9 Mbit / s .
Entre A et C:
Nous obtenons notre limite de bande passante de 8 Mbit / s .
Entre A et D:
Nous avons ici l'interface virtuelle pleine vitesse de 10 Mbit / s atteinte.
Notez que la rafale de la première mesure de chaque exécution peut être mieux gérée dans les
htb
classes en ajustant le paramètre adéquat.Nettoyer
Ôter :
1:
:tc filter del dev vethA parent 1: prio 1 u32
.1:
:tc filter del dev vethA parent 1:
.1:20
et ses enfants:tc class del dev vethA parent 1:1 classid 1:20
.tc qdisc del dev vethA
.Pour nettoyer l'ensemble de simulation:
la source
Ubuntu a IPFW porté depuis FreeBSD, et IPFW a DUMMYNET qui permet de gérer divers paramètres de réseau - bande passante, retard, taux de perte de paquets, etc.
la source
Le mieux est d'utiliser les outils tc avec le module netem maintenant intégré (dans le serveur Ubuntu au moins). Vous pouvez trouver plus d'informations dans cet article de Stackoverflow .
la source
Trickle fonctionne bien.
Cette discussion montre quelques limitations: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance
la source