Simuler une connection lente entre deux machines server Ubuntu

Je souhaite simuler le scénario suivant: étant donné que j'ai 4 machines server Ubuntu A, B, C et D. Je souhaite réduire de 20% la bande passante réseau entre la machine A et la machine C et 10% entre A et B. Comment faire pour faire cela en utilisant des outils de simulation de réseau / étranglement?

4 Solutions collect form web for “Simuler une connection lente entre deux machines server Ubuntu”

Pour ce faire, vous pouvez utiliser tc seul avec les filters u32 ou combiné avec le marquage iptables (peut-être plus simple si vous ne voulez pas apprendre la syntaxe des filters complexes). Je vais dans le détail suivant détailler l'ancienne solution.

Simulation de votre configuration

À titre d'exemple, considérons que A, B, C et D exécutent des interfaces virtuelles de 10 Mbit / s .

Vous voulez essentiellement:

  • A <==> B: 9 Mbit / s en forme pour la sortie
  • A <==> C: 8 Mbit / s en forme pour la sortie

Afin de simuler cela, je créerai 4 namespaces de réseau et des interfaces Ethernet virtuelles branchées sur un pont.

Bien sûr, dans votre cas, vous travaillerez avec de vraies NIC 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:

  10.0.0.254 +-------+ | | | br0 | | | +---+---+ | | veth{A..D}.peer | +------------+------+-----+------------+ | | | | vethA | vethB | vethC | vethD | +---+---+ +---+---+ +---+---+ +---+---+ | | | | | | | | | A | | B | | C | | D | | | | | | | | | +-------+ +-------+ +-------+ +-------+ 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 

Tout d'abord, l'installation de phasis afin que vous puissiez comprendre ce qu'il est fait, sautez-le si vous n'en êtes pas familier, pas grave. Ce que vous devez cependant savoir, c'est que la command ip netns exec <namespace> <command> permet d'exécuter une command dans un espace de noms de réseau (c'est-à-dire dans l'une des cases du tirage précédent). Cela sera également utilisé dans la section suivante.

 # Create the bridge ip link add br0 type bridge # Create network namespaces and veth interfaces and plug them into the bridge for host in {A..D} ; do ip link netns add ${host} ip link add veth${host} type veth peer name veth${host}.peer ip link set dev veth${host}.peer master br0 ip link set dev veth${host} netns ${host} ip netns exec ${host} ip link set veth${host} up done # Assign IPs ip addr add 10.0.0.254/24 dev br0 ip netns exec A ip addr add 10.0.0.1/24 dev vethA ip netns exec B ip addr add 10.0.0.2/24 dev vethB ip netns exec C ip addr add 10.0.0.3/24 dev vethC ip netns exec D ip addr add 10.0.0.4/24 dev vethD 

Donc, à ce stade, nous avons la configuration décrite précédemment.

Transformer le trafic

Il est time d'entrer dans le contrôle de la circulation afin d'get ce que vous voulez. L'outil tc vous permet d'append des disciplines de files d'attente:

  • En cas de sortie: une fois que le kernel doit envoyer des packages et avant d'accéder au pilote NIC.
  • Pour entrer: après avoir accédé au pilote NIC et avant que les routines du kernel soient exécutées sur les packages reçus.

Il comporte 3 notions: qdisc , classs et filters . Ces notions peuvent être utilisées pour configurer une gestion complexe des stream de packages et prioriser le trafic en fonction des critères / critères que vous souhaitez.

En un mot :

  • Les Qdisc sont des structures où les packages seront finalement enfilés / décollés.
  • Les classs sont des conteneurs pour qdisc agissant avec des comportements spécifiques.
  • Les filters sont des moyens d'apather les packages entre les classs, plusieurs d'entre eux peuvent être définis sur le même point d'input avec les priorités pendant le traitement.

Tout cela fonctionne généralement comme un tree où les feuilles sont des qdiscs et les classs sont des nœuds. La racine d'un tree ou sous-tree 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'tree que vous souhaitez configurer avec tc :

  1: | | | 1:1 / | \ / | \ / | \ 1:10 1:20 1:30 | | | | | | :10 :20 :30 

Explication:

  • 1: est le qdisc de racine attaché au périphérique vethA, il sera pris explicitement comme htb pour Hierarchy Token Bucket (le qdisc par défaut d'un périphérique est pfifo ou pfifo_fast fonction du operating system). Il est spécifiquement approprié pour la gestion de la bande passante. Les packages non adaptés aux filters définis à ce niveau passeront à la class 1:30 .
  • 1:1 sera une class htb limitant toute la circulation de l'appareil à 10 Mbit / s.
  • 1:10 sera un trafic de sortie limitant la class htb à 9 Mbit / s (90% de 10 Mbit / s).
  • 1:20 sera un trafic de sortie limitant la class htb à 8 Mbit / s (80% de 10 Mbit / s).
  • 1:30 sera une class htb limitant le trafic à 10 Mbit / s (return).
  • :10, :20, :30 sfq 20 sfq :10, :20, :30 sont sfq qdisc pour Stochastic Fairness Queuing. En d'autres termes, ces qdiscs assureront l'équité dans le calendar de transmission basé sur les stream.

Tout cela est configuré par les commands suivantes:

 ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30 ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10 ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10 ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10 

La dernière chose dont nous avons besoin, c'est d'append des filters, de sorte que les packages IP avec IP de destination égaux B passeront à la class 1:10 et les packages IP avec IP de destination égaux C passeront à la class 1:20 :

 ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10 ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20 

Maintenant que vous avez l'idée, vous devrez append des règles tc similaires à B et C, de sorte que les transmissions vers A de ces plates-forms sont également façonnées.

Essai

Examinons maintenant. Pour cela, je suis personnellement utilisé pour jouer avec iperf , il consiste simplement en une seule binary qui peut être exécutée en tant que client ou server et envoie automatiquement autant de trafic que possible entre les deux hôtes.

Entre A et B:

  $ ip netns exec B iperf -s -p 8001 ... $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2 ------------------------------------------------------------ Client connecting to 10.0.0.2, TCP port 8001 TCP window size: 21.0 KByte (default) ------------------------------------------------------------ [ 5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001 [ ID] Interval Transfer Bandwidth [ 5] 0.0- 2.0 sec 2.38 MBytes 9.96 Mbits/sec [ 5] 2.0- 4.0 sec 2.12 MBytes 8.91 Mbits/sec [ 5] 4.0- 6.0 sec 2.00 MBytes 8.39 Mbits/sec [ 5] 6.0- 8.0 sec 2.12 MBytes 8.91 Mbits/sec [ 5] 8.0-10.0 sec 2.00 MBytes 8.39 Mbits/sec [ 5] 0.0-10.1 sec 10.8 MBytes 8.91 Mbits/sec 

Nous obtenons notre limite de bande passante de 9 Mbit / s .

Entre A et C:

 $ ip netns exec C iperf -s -p 8001 ... $ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2 ------------------------------------------------------------ Client connecting to 10.0.0.3, TCP port 8001 TCP window size: 21.0 KByte (default) ------------------------------------------------------------ [ 5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001 [ ID] Interval Transfer Bandwidth [ 5] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits/sec [ 5] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec [ 5] 4.0- 6.0 sec 1.88 MBytes 7.86 Mbits/sec [ 5] 6.0- 8.0 sec 1.88 MBytes 7.86 Mbits/sec [ 5] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec [ 5] 0.0-10.1 sec 9.62 MBytes 7.98 Mbits/sec 

Nous obtenons notre limite de bande passante de 8 Mbit / s .

Entre A et D:

 $ ip netns exec D iperf -s -p 8001 ... $ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2 ------------------------------------------------------------ Client connecting to 10.0.0.4, TCP port 8001 TCP window size: 21.0 KByte (default) ------------------------------------------------------------ [ 5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001 [ ID] Interval Transfer Bandwidth [ 5] 0.0- 2.0 sec 2.62 MBytes 11.0 Mbits/sec [ 5] 2.0- 4.0 sec 2.25 MBytes 9.44 Mbits/sec [ 5] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec [ 5] 6.0- 8.0 sec 2.25 MBytes 9.44 Mbits/sec [ 5] 8.0-10.0 sec 2.38 MBytes 9.96 Mbits/sec [ 5] 0.0-10.2 sec 12.0 MBytes 9.89 Mbits/sec 

Nous avons ici l'interface virtuelle pleine vitesse de 10 Mbit / s atteinte.

Notez que l'éclatement de la première mesure de chaque exécution peut être mieux traité dans les classs htb en ajustant le paramètre adéquat.

Nettoyer

Retirer :

  • Le filter de la priorité 1 sur 1: tc filter del dev vethA parent 1: prio 1 u32 .
  • Tous les filters sur 1: tc filter del dev vethA parent 1:
  • Classe 1:20 et ses enfants: tc class del dev vethA parent 1:1 classid 1:20 .
  • L'tree entier: tc qdisc del dev vethA .

Pour nettoyer le jeu de simulation:

 # Remove veth pairs and network namespaces for host in {A..D} ; do ip link del dev veth${host}.peer ip netns del ${host} done # Remove the bridge ip link del dev br0 

Ubuntu ont IPFW porté par FreeBSD et IPFW ont DUMMYNET qui permettent de gérer différents parameters de réseau – bande passante, retard, taux de perte de packages, etc.

Le meilleur est d'utiliser les outils tc avec le module maintenant embedded (dans le server Ubuntu au less). Vous pouvez find plus d'informations dans cet article de Stackoverflow .

Trickle fonctionne bien.

Cette discussion présente certaines limitations: https://unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-sortingckle-instance

  • Détecter le pilote USB branché et exécuter un certain file sur celui-ci
  • Pourquoi ne puis-je pas accéder à mon instance CouchDB à l'extérieur sur le server Ubuntu 9.04?
  • La meilleure façon d'avoir à la fois php 5.2 et php 5.3 en même time dans Ubuntu
  • Défaillance de démarrage avec root sur MD (RAID1) + LVM: timing de l'événement udev
  • Déboguer HAProxy
  • Ignorer l'étape InRelease lorsque apt-get update (et aller directement à Release)
  • Il montre "aucun file ou directory de ce genre"
  • Besoin d'aide pour le debugging: le server de files suspect fonctionne lentement à cause de la charge nfs
  • Délai de connection Mailslurper après 6 secondes
  • PhpMyAdmin sur Ubuntu Server 10.04: Problèmes de configuration étranges
  • Comment réparer mon server pour démarrer correctement après avoir supprimé / ajouté un lecteur sur mon logiciel RAID mdadm
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.