Ich möchte das folgende Szenario simulieren: Vorausgesetzt, ich habe 4 Ubuntu-Server-Computer A, B, C und D. Ich möchte die Netzwerkbandbreite zwischen Computer A und Computer C um 20% und zwischen A und B um 10% reduzieren Tun Sie dies mit Netzwerksimulations- / Drosselungswerkzeugen?
ubuntu
networking
tcp
linux-networking
bandwidth
Yehia Elshater
quelle
quelle
tc
funktioniert bei Verwendung mit iptables-Markierung.Antworten:
Zu diesem Zweck können Sie die Filterung
tc
allein mitu32
Filtern oder in Kombination mit der Markierung von iptables verwenden (möglicherweise einfacher, wenn Sie die komplexe Filtersyntax nicht lernen möchten). Ich werde im folgenden Beitrag die frühere Lösung detailliert beschreiben.Simulation Ihres Setups
Betrachten wir als Beispiel A, B, C und D mit virtuellen Schnittstellen mit 10 Mbit / s .
Sie wollen im Grunde:
Um dies zu simulieren, erstelle ich 4 Netzwerk-Namespaces und virtuelle Ethernet-Schnittstellen, die an eine Bridge angeschlossen sind.
In Ihrem Fall arbeiten Sie natürlich mit echten Netzwerkkarten, und die Bridge ist je nach Infrastruktur Ihr Gateway oder Switch.
In meiner Simulation haben wir also das folgende Setup in einem 10.0.0.0/24 Netzwerk:
Erstens, die Setup-Phase, damit Sie verstehen, woraus sie besteht, überspringen Sie sie, wenn Sie mit ihr nicht vertraut sind, keine große Sache. Was Sie jedoch wissen müssen, ist, dass der Befehl
ip netns exec <namespace> <command>
die Ausführung eines Befehls in einem Netzwerk-Namespace ermöglicht (dh in einem der Felder der vorherigen Zeichnung). Dies wird auch im nächsten Abschnitt verwendet.An diesem Punkt haben wir also das zuvor beschriebene Setup.
Verkehr gestalten
Es ist Zeit, in die Verkehrskontrolle einzusteigen, um das zu bekommen, was Sie wollen. Mit dem
tc
Tool können Sie Warteschlangendisziplinen hinzufügen:Es kommt mit 3 Begriffen: qdisc , Klassen und Filter . Diese Begriffe können verwendet werden, um ein komplexes Paketflussmanagement einzurichten und den Datenverkehr basierend auf den gewünschten Kriterien zu priorisieren.
In einer Nussschale :
All dies funktioniert normalerweise als Baum, in dem Blätter qdiscs und Klassen Knoten sind. Die Wurzel eines Baums oder Teilbaums wird als deklariert
<id>:
und untergeordnete Knoten werden als deklariert<parent_id>:<children_id>
. Beachten Sie diese Syntax.Nehmen wir für Ihren Fall A und rendern den Baum, mit dem Sie einrichten möchten
tc
:Erklärung:
1:
Ist die Root-Qdisc an das Gerät vethA angehängt, wird sie explizit wiehtb
für Hierarchy Token Bucket verwendet (die Standard-Qdisc eines Geräts istpfifo
oderpfifo_fast
hängt vom Betriebssystem ab). Es ist speziell für das Bandbreitenmanagement geeignet. Pakete, die nicht mit auf dieser Ebene definierten Filtern übereinstimmen, werden in die1:30
Klasse verschoben.1:1
wird einehtb
Klasse sein, die den gesamten Datenverkehr des Geräts auf 10 Mbit / s begrenzt.1:10
wird einehtb
Klasse sein, die den Ausgangsverkehr auf 9 Mbit / s (90% von 10 Mbit / s) begrenzt.1:20
wird einehtb
Klasse sein, die den Ausgangsverkehr auf 8 Mbit / s (80% von 10 Mbit / s) begrenzt.1:30
wird einehtb
Klasse sein, die den Verkehr auf 10 Mbit / s begrenzt (Fallback).:10, :20, :30
sindsfq
qdisc für Stochastic Fairness Queuing. Mit anderen Worten, diese qdiscs gewährleisten eine faire Übertragungsplanung auf der Grundlage von Datenströmen.Diese ganze Sache wird durch die folgenden Befehle eingerichtet:
Das Letzte, was wir brauchen, ist das Hinzufügen von Filtern, damit IP-Pakete mit Ziel-IP gleich B in die
1:10
Klasse und IP-Pakete mit Ziel-IP gleich C in die1:20
Klasse gehen :Nachdem Sie auf die Idee gekommen sind, müssen Sie
tc
B und C ähnliche Regeln hinzufügen, damit auch die Übertragungen von diesen Rigs in Richtung A geformt werden.Testen
Jetzt lass es uns testen. Dafür bin ich persönlich gewohnt zu spielen
iperf
, es besteht einfach aus einer einzelnen Binärdatei, die entweder als Client oder als Server ausgeführt werden kann und automatisch so viel Verkehr wie möglich zwischen beiden Hosts sendet.Zwischen A und B :
Wir erreichen unser Bandbreitenlimit von 9 Mbit / s .
Zwischen A und C:
Wir erreichen unser Bandbreitenlimit von 8 Mbit / s .
Zwischen A und D:
Hier haben wir die virtuelle Schnittstelle mit voller Geschwindigkeit von 10 Mbit / s erreicht.
Beachten Sie, dass der Burst des ersten Takts jedes Laufs in
htb
Klassen besser gehandhabt werden kann, indem der entsprechende Parameter angepasst wird.Aufräumen
Zu entfernen :
1:
:tc filter del dev vethA parent 1: prio 1 u32
.1:
:tc filter del dev vethA parent 1:
.1:20
und ihre Kinder :tc class del dev vethA parent 1:1 classid 1:20
.tc qdisc del dev vethA
.So bereinigen Sie das Simulationsset:
quelle
Ubuntu hat IPFW von FreeBSD portiert und IPFW hat DUMMYNET, mit dem verschiedene Netzwerkparameter verwaltet werden können - Bandbreite, Verzögerung, Rate des Paketverlusts usw.
quelle
Am besten verwenden Sie die TC-Tools mit dem jetzt integrierten Netem-Modul (zumindest in Ubuntu Server). Weitere Informationen finden Sie in diesem Artikel von Stackoverflow .
quelle
Trickle funktioniert gut.
Diese Diskussion zeigt einige Einschränkungen: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance
quelle