Simulieren Sie verzögerte und verworfene Pakete unter Linux

Antworten:

323

netem nutzt Funktionen, die bereits in Linux- und Userspace-Dienstprogrammen integriert sind, um Netzwerke zu simulieren. Darauf bezieht sich Marks Antwort mit einem anderen Namen.

Die Beispiele auf ihrer Homepage zeigen bereits, wie Sie das erreichen können, wonach Sie gefragt haben:

Beispiele

Emulieren von Verzögerungen im Weitverkehrsnetz

Dies ist das einfachste Beispiel. Es fügt lediglich allen Paketen, die aus dem lokalen Ethernet gesendet werden, eine feste Verzögerung hinzu.

# tc qdisc add dev eth0 root netem delay 100ms

Ein einfacher Ping-Test zum Hosten im lokalen Netzwerk sollte nun einen Anstieg von 100 Millisekunden anzeigen. Die Verzögerung wird durch die Taktauflösung des Kernels (Hz) begrenzt. Auf den meisten 2.4-Systemen läuft der Systemtakt mit 100 Hz, was Verzögerungen in Schritten von 10 ms ermöglicht. Bei 2.6 ist der Wert ein Konfigurationsparameter von 1000 bis 100 Hz.

Spätere Beispiele ändern nur die Parameter, ohne die qdisc neu zu laden

Reale Weitverkehrsnetze weisen Variabilität auf, sodass zufällige Variationen hinzugefügt werden können.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Dies bewirkt, dass die zusätzliche Verzögerung 100 ± 10 ms beträgt. Die Variation der Netzwerkverzögerung ist nicht rein zufällig, um zu emulieren, dass es auch einen Korrelationswert gibt.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Dies bewirkt, dass die hinzugefügte Verzögerung 100 ± 10 ms beträgt, wobei das nächste zufällige Element 25% vom letzten abhängt. Dies ist keine echte statistische Korrelation, sondern eine Annäherung.

Verzögerungsverteilung

Typischerweise ist die Verzögerung in einem Netzwerk nicht einheitlich. Es ist üblicher, eine Normalverteilung zu verwenden, um die Variation der Verzögerung zu beschreiben. Die Netem-Disziplin kann anhand einer Tabelle eine ungleichmäßige Verteilung angeben.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Die tatsächlichen Tabellen (normal, pareto, paretonormal) werden im Rahmen der iproute2-Kompilierung generiert und in / usr / lib / tc abgelegt. So ist es mit einigem Aufwand möglich, eine eigene Verteilung basierend auf experimentellen Daten zu erstellen.

Paketverlust

Der zufällige Paketverlust wird im Befehl 'tc' in Prozent angegeben. Der kleinstmögliche Wert ungleich Null ist:

2 - 32 = 0,0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Dies führt dazu, dass 1/10 Prozent (dh 1 von 1000) Paketen zufällig verworfen werden.

Eine optionale Korrelation kann ebenfalls hinzugefügt werden. Dies führt dazu, dass der Zufallszahlengenerator weniger zufällig ist und zum Emulieren von Paketburstverlusten verwendet werden kann.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Dadurch gehen 0,3% der Pakete verloren, und jede aufeinanderfolgende Wahrscheinlichkeit hängt um ein Viertel von der letzten ab.

Prob n = 0,25 × Prob n-1 + 0,75 × zufällig

Beachten Sie, dass Sie verwenden sollten, tc qdisc addwenn Sie keine Regeln für diese Schnittstelle haben oder tc qdisc changewenn Sie bereits Regeln für diese Schnittstelle haben. Der Versuch, tc qdisc changeauf einer Schnittstelle ohne Regeln zu verwenden, führt zu dem Fehler RTNETLINK answers: No such file or directory.

kurzlebig
quelle
2
Die ursprüngliche Website hat diesen Fehler, ich habe diesen Text nur direkt kopiert. Aber ja, 2 ^ (- 32) = 2.33e-10
ephemient
34
Beachten Sie, dass tc -p qdisc ls dev eth0die aktuell definierten Regeln tc qdisc del dev eth0 root
aufgelistet
1
Upvoted für den Hinweis auf Fehler beim Versuch, einen nicht vorhandenen Eintrag zu ändern
Neo
Wissen Sie, warum ich diese Fehler bekomme? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / ERGEBNISSE / ERGEBNISSE $ sudo tc qdisc Änderung dev eth0 root netem Verzögerung 100ms RTNETLINK Antworten: Ungültiges Argument serverfault.com/questions/743885/…
Mona Jalal
Es wäre wahrscheinlich eine gute Idee, Details anzugeben, wie der Durchsatz der gesamten Schnittstelle begrenzt werden kann, um langsame Verbindungen zu simulieren
Pavel P
91

Für verworfene Pakete würde ich einfach iptables und das Statistikmodul verwenden .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Oben wird ein eingehendes Paket mit einer Wahrscheinlichkeit von 1% verworfen. Seien Sie vorsichtig, alles über 0,14 und die meisten von Ihnen TCP-Verbindungen werden höchstwahrscheinlich vollständig blockieren.

Werfen Sie einen Blick auf man iptables und suchen Sie nach "Statistik" für weitere Informationen.

Bjarke Freund-Hansen
quelle
6
Warum sollten TCP-Verbindungen bei mehr als 14% stehen bleiben?
David Wolever
2
@ DavidWolever: Aufgrund der Art und Weise, wie die Größe der TCP-Schiebefenster angepasst wird. Aber die 14% sind rein aus Erfahrung, probieren Sie es selbst aus und Sie werden sehen, dass ssh bei 14% und mehr meistens unbrauchbar wird, aber bei niedrigeren Paket-Drop-Raten tatsächlich recht gut funktioniert.
Bjarke Freund-Hansen
12
Aus Sicherheitsgründen ist es wahrscheinlich am besten, die Regel so zu beschränken, dass sie nur für die Ports gilt, die getestet werden sollen: iptables -A INPUT --dport FOO -m statistics .... Auf diese Weise werden Ihre ssh- und andere Verbindungen Bleiben Sie unbehelligt und Sie können die Drop-Rate für den Dienst von Interesse erhöhen, um Probleme damit schneller reproduzieren zu können.
Mikhail T.
5
Beachten Sie, dass DROPbei ausgehenden Verbindungen auf lächerliche Weise send()Operationen zurückgegeben werden EPERM, anstatt nur Pakete zu verwerfen (wie es sollte).
Gefälschter Name
2
Ist das alles, was benötigt wird, um diesen Befehl rückgängig zu machen? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Einer meiner Kollegen benutzt dazu tc. Weitere Informationen finden Sie in der Manpage. Ein Beispiel für die Verwendung finden Sie hier .

Kennzeichen
quelle
Ich denke, es ist einfacher, iptables zu verwenden :)
c4f4t0r
sicher, aber tc ist viel schneller als iptables
teknoraver
5

iptables (8) verfügt über ein Statistik-Übereinstimmungsmodul, mit dem jedes n-te Paket abgeglichen werden kann. Um dieses Paket zu verwerfen, fügen Sie einfach -j DROP hinzu .

Hillu
quelle
1

Ich habe es nicht selbst ausprobiert, aber diese Seite enthält eine Liste der Plugin-Module, die unter Linux 'integriertem iptables IP-Filtersystem ausgeführt werden. Eines der Module heißt "n-te" und ermöglicht es Ihnen, eine Regel einzurichten, mit der eine konfigurierbare Rate der Pakete verworfen wird. Könnte zumindest ein guter Anfang sein.

entspannen
quelle
1

Ein einfach zu verwendendes Tool zur Injektion von Netzwerkfehlern ist Saboteur . Es kann simulieren:

  • Gesamtnetzwerkpartition
  • Remote-Service tot (der erwartete Port wird nicht abgehört)
  • Verzögerungen
  • Zeitverlust bei Paketverlust - TCP-Verbindung (wie es häufig vorkommt, wenn zwei Systeme durch eine zustandsbehaftete Firewall getrennt sind)
Alex Giotis
quelle
1
Leider war das letzte Engagement für dieses Projekt am 28. August 2015, also vor fast 4 Jahren. Die offenen Fragen sind jetzt 5 Jahre alt.
Ali
1

Eines der am häufigsten verwendeten Tools in der wissenschaftlichen Gemeinschaft zu diesem Zweck ist DummyNet . Nachdem Sie das ipfwKernelmodul installiert haben, führen Sie einfach die folgenden Befehle aus, um eine Laufzeitverzögerung von 50 ms zwischen zwei Computern einzuführen:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Um auch 50% der Paketverluste einzuführen, müssen Sie Folgendes ausführen:

./ipfw pipe 1 config plr 0.5

Hier mehr Details.

Gaetano
quelle