Chcę zasymulować następujący scenariusz: biorąc pod uwagę, że mam 4 maszyny serwerowe Ubuntu A, B, C i D. Chcę zmniejszyć przepustowość sieci o 20% między maszyną A i maszyną C oraz o 10% między maszyną A i B. zrobić to za pomocą narzędzi do symulacji sieciowej / ograniczania przepustowości?
ubuntu
networking
tcp
linux-networking
bandwidth
Yehia Elshater
źródło
źródło
tc
działa, gdy jest używany z oznaczeniem iptables.Odpowiedzi:
Aby to zrobić, możesz użyć
tc
samego zu32
filtrami lub w połączeniu ze znakowaniem iptables (być może bardziej proste, jeśli nie chcesz nauczyć się składni filtrów złożonych). W następnym poście szczegółowo opiszę poprzednie rozwiązanie.Symulowanie konfiguracji
Jako przykład rozważmy A, B, C i D z uruchomionymi wirtualnymi interfejsami 10 Mbit / s .
Zasadniczo chcesz:
Aby to zasymulować, utworzę 4 sieciowe przestrzenie nazw i wirtualne interfejsy Ethernet podłączone do mostka.
Oczywiście w twoim przypadku będziesz pracować z prawdziwymi kartami sieciowymi, a most będzie twoją bramą lub przełącznikiem w zależności od infrastruktury.
W mojej symulacji będziemy mieli następującą konfigurację w sieci 10.0.0.0/24:
Po pierwsze, fazę konfiguracji, abyś mógł zrozumieć, z czego jest wykonana, pomiń ją, jeśli nie jesteś z nią zaznajomiony, nic wielkiego. Musisz jednak wiedzieć, że polecenie
ip netns exec <namespace> <command>
pozwala wykonać polecenie w sieciowej przestrzeni nazw (tj. W jednym z pól poprzedniego losowania). Zostanie to wykorzystane również w następnej sekcji.W tym momencie mamy opisaną wcześniej konfigurację.
Kształtowanie ruchu
Czas przejść do kontroli ruchu, aby uzyskać to, czego chcesz.
tc
Narzędzie pozwala na dodanie dyscyplin kolejkowania:Zawiera 3 pojęcia: qdisc , klasy i filtry . Pojęć tych można używać do konfigurowania zarządzania złożonym przepływem pakietów i ustalania priorytetów ruchu na podstawie dowolnych kryteriów / kryteriów.
W skrócie :
Wszystko to zwykle działa jako drzewo, w którym liście są qdisc, a klasy są węzłami. Katalog główny drzewa lub poddrzewa zostanie zadeklarowany jako,
<id>:
a węzły podrzędne zostaną zadeklarowane jako<parent_id>:<children_id>
. Pamiętaj o tej składni.W twoim przypadku weźmy A i wyrenderuj drzewo, które chcesz skonfigurować
tc
:Objaśnienie:
1:
jest qdisc root dołączony do urządzenia vethA, zostanie on wzięty jawnie jak whtb
przypadku Hierarchy Token Bucket (domyślna qdisc urządzenia topfifo
lubpfifo_fast
zależy od systemu operacyjnego). Jest to szczególnie odpowiednie do zarządzania pasmem. Pakiety niepasujące do filtrów zdefiniowanych na tym poziomie trafią do1:30
klasy.1:1
będziehtb
klasą ograniczającą cały ruch urządzenia do 10 Mbit / s.1:10
będziehtb
klasą ograniczającą ruch wyjściowy do 9 Mbit / s (90% z 10 Mbit / s).1:20
będziehtb
klasą ograniczającą ruch wyjściowy do 8 Mbit / s (80% z 10 Mbit / s).1:30
będziehtb
klasą ograniczającą ruch do 10 Mbit / s (awaryjne).:10, :20, :30
sąsfq
qdisc dla Kolejkowania Stochastic Fairness. Innymi słowy, te qdisc zapewnią uczciwość w planowaniu transmisji w oparciu o przepływy.Całą tę konfigurację wykonują następujące polecenia:
Ostatnią rzeczą, której potrzebujemy, jest dodanie filtrów, aby pakiety IP z docelowym adresem IP równym B trafiły do
1:10
klasy, a pakiety IP z docelowym adresem IP równym C trafiły do1:20
klasy:Teraz, gdy wpadłeś na ten pomysł, musisz dodać podobne
tc
reguły do B i C, aby nadać kształt również transmisjom w kierunku A z tych platform.Testowanie
Teraz przetestujmy to. W tym celu jestem osobiście przyzwyczajony do gry
iperf
, po prostu składa się z pojedynczego pliku binarnego, który można uruchomić jako klient lub serwer i automatycznie wysyła jak najwięcej ruchu między dwoma hostami.Pomiędzy A i B :
Otrzymujemy nasz limit przepustowości 9 Mbit / s .
Pomiędzy A i C:
Otrzymujemy nasz limit przepustowości 8 Mbit / s .
Pomiędzy A i D:
Tutaj mamy osiągnięty wirtualny interfejs z pełną prędkością 10 Mbit / s .
Zauważ, że seria pierwszego pomiaru każdego przebiegu może być lepiej obsługiwana w
htb
klasach poprzez dostosowanie odpowiedniego parametru.Sprzątanie
Usuwać :
1:
:tc filter del dev vethA parent 1: prio 1 u32
.1:
:tc filter del dev vethA parent 1:
.1:20
i jej dzieci:tc class del dev vethA parent 1:1 classid 1:20
.tc qdisc del dev vethA
.Aby wyczyścić zestaw symulacji:
źródło
Ubuntu ma IPFW przeniesione z FreeBSD, a IPFW ma DUMMYNET, które pozwalają zarządzać różnymi parametrami sieci - przepustowością, opóźnieniem, szybkością utraty pakietów itp.
źródło
Najlepiej jest użyć narzędzi tc ze zintegrowanym teraz (przynajmniej na serwerze Ubuntu) modułem netem. Więcej informacji można znaleźć w tym artykule z Stackoverflow .
źródło
Trickle działa dobrze.
Ta dyskusja pokazuje pewne ograniczenia: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance
źródło