Symuluj opóźnione i upuszczane pakiety w systemie Linux

Odpowiedzi:

323

netem wykorzystuje funkcje wbudowane w Linuksa i narzędzia przestrzeni użytkownika do symulacji sieci. Właśnie do tego odnosi się odpowiedź Marka pod innym imieniem.

Przykłady na ich stronie głównej pokazują już, jak możesz osiągnąć to, o co prosiłeś:

Przykłady

Emulowanie opóźnień sieci rozległej

Jest to najprostszy przykład, po prostu dodaje stałą ilość opóźnienia do wszystkich pakietów wychodzących z lokalnej sieci Ethernet.

# tc qdisc add dev eth0 root netem delay 100ms

Teraz prosty test ping do hosta w sieci lokalnej powinien wykazać wzrost o 100 milisekund. Opóźnienie jest ograniczone rozdzielczością zegara jądra (Hz). W większości systemów 2.4 zegar systemowy pracuje z częstotliwością 100 Hz, co pozwala na opóźnienia w odstępach co 10 ms. W wersji 2.6 wartością jest parametr konfiguracyjny od 1000 do 100 Hz.

Późniejsze przykłady zmieniają parametry bez ponownego ładowania qdisc

Rzeczywiste sieci rozległe wykazują zmienność, więc można dodawać zmienność losową.

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

To powoduje, że dodane opóźnienie wynosi 100 ± 10 ms. Zmienność opóźnienia sieci nie jest czysto losowa, więc aby naśladować, że istnieje również wartość korelacji.

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

To powoduje, że dodane opóźnienie wynosi 100 ± 10 ms, a następny losowy element zależy od 25% od ostatniego. To nie jest prawdziwa korelacja statystyczna, ale przybliżenie.

Opóźniona dystrybucja

Zazwyczaj opóźnienie w sieci nie jest jednolite. Bardziej powszechne jest użycie czegoś w rodzaju rozkładu normalnego do opisania zmiany opóźnienia. Dyscyplina netem może przyjąć tabelę, aby określić nierównomierny rozkład.

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

Rzeczywiste tabele (normal, pareto, paretonormal) są generowane jako część kompilacji iproute2 i umieszczane w / usr / lib / tc; więc możliwe jest z pewnym wysiłkiem stworzenie własnej dystrybucji w oparciu o dane eksperymentalne.

Utrata pakietu

Losowa utrata pakietów jest określona w komendzie „tc” w procentach. Najmniejszą możliwą wartością niezerową jest:

2 −32 = 0,0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Powoduje to losowe upuszczenie 1/10 procent (tj. 1 na 1000) pakietów.

Można również dodać opcjonalną korelację. Powoduje to, że generator liczb losowych jest mniej losowy i może być używany do emulacji strat pakietów.

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

Spowoduje to utratę 0,3% pakietów, a każde kolejne prawdopodobieństwo zależy o jedną czwartą od ostatniego.

Prob n = 0,25 × Prob n-1 + 0,75 × Losowo

Pamiętaj , że powinieneś używać, tc qdisc addjeśli nie masz reguł dla tego interfejsu lub tc qdisc changejeśli masz już reguły dla tego interfejsu. Próba użycia tc qdisc changeinterfejsu bez reguł spowoduje błąd RTNETLINK answers: No such file or directory.

efemeryczny
źródło
2
Oryginalna witryna ma ten błąd, właśnie skopiowałem ten tekst bezpośrednio. Ale tak, 2 ^ (- 32) = 2,33e-10
ephemient
34
Pamiętaj, że tc -p qdisc ls dev eth0wyświetli listę aktualnie zdefiniowanych reguł i tc qdisc del dev eth0 rootje usunie
Quamis
1
głosowano za wskazanie błędu przy próbie zmiany nieistniejącego wpisu
Neo
Czy wiesz, dlaczego dostaję te błędy? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RESULTS $ sudo tc qdisc add dev eth0 root netem delay 100ms RTNETLINK odpowiedzi: Plik istnieje ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / WYNIKI $ sudo tc qdisc zmień dev eth0 root netem delay 100ms RTNETLINK odpowiedzi: Niepoprawny argument serverfault.com/questions/743885/…
Mona Jalal
Dobrym pomysłem byłoby podanie szczegółowych informacji na temat ograniczenia przepustowości całych interfejsów w celu symulacji połączeń o niskiej prędkości
Pavel P
91

W przypadku upuszczonych pakietów użyłbym po prostu iptables i modułu statystycznego .

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

Powyżej upuści pakiet przychodzący z prawdopodobieństwem 1%. Bądź ostrożny, wszystko powyżej 0,14 i większość z was połączeń TCP najprawdopodobniej całkowicie się zawiesi.

Spójrz na man iptables i wyszukaj „statystyki”, aby uzyskać więcej informacji.

Bjarke Freund-Hansen
źródło
6
Dlaczego połączenia TCP zatrzymują się na poziomie powyżej 14%?
David Wolever,
2
@DavidWolever: Ze względu na sposób regulacji rozmiaru okien przesuwnych tcp. Ale 14% jest wyłącznie z doświadczenia, spróbuj sam, a zobaczysz, że ssh staje się w większości bezużyteczny przy 14% i więcej, ale w rzeczywistości działa całkiem dobrze przy niższych poziomach upuszczania pakietów.
Bjarke Freund-Hansen
12
Ze względów bezpieczeństwa prawdopodobnie najlepiej jest ograniczyć regułę tylko do portów, które chcesz przetestować: iptables -A INPUT --port FOO -m statystyki .... W ten sposób twoje ssh i inne połączenia będą pozostań niewzruszony i możesz podnieść współczynnik upuszczania, aby usługa będąca przedmiotem zainteresowania mogła szybciej odtworzyć wszelkie problemy.
Mikhail T.,
5
Zauważ, że DROPna połączeniach wychodzących śmiesznie powoduje to, że send()operacje zwracają się EPERM, a nie po prostu odrzuca pakiety (tak jak powinno).
Fałszywe imię
2
Czy to wszystko, czego potrzeba, aby cofnąć to polecenie? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Jeden z moich kolegów używa do tego tc. Więcej informacji znajduje się na stronie podręcznika użytkownika. Przykład jego użycia można zobaczyć tutaj .

znak
źródło
Myślę, że jest łatwiejszy w użyciu iptables :)
c4f4t0r
jasne
5

iptables (8) ma moduł dopasowania statystycznego, którego można użyć do dopasowania każdego n-tego pakietu. Aby upuścić ten pakiet, po prostu dodaj -j DROP .

Hillu
źródło
1

Nie próbowałem tego sam, ale na tej stronie znajduje się lista modułów wtyczek, które działają w systemie Linux z wbudowanym systemem filtrowania IP iptables. Jeden z modułów nazywa się „n-ty” i pozwala ustawić regułę, która zrzuci konfigurowalną szybkość pakietów. Przynajmniej może być dobrym miejscem do rozpoczęcia.

rozwijać
źródło
1

Łatwym w użyciu narzędziem do wstrzykiwania uszkodzeń sieci jest Saboteur . Może symulować:

  • Całkowita partycja sieciowa
  • Usługa zdalna nie działa (nie nasłuchuje na oczekiwanym porcie)
  • Opóźnienia
  • Utrata pakietów - Limit czasu połączenia TCP (co często zdarza się, gdy dwa systemy są oddzielone zaporą stanową)
Alex Giotis
źródło
1
Niestety ostatnie zobowiązanie do tego projektu nastąpiło 28 sierpnia 2015 r., Czyli prawie 4 lata temu. Otwarte problemy mają teraz 5 lat.
Ali
1

Jednym z najczęściej używanych narzędzi w tym środowisku naukowym jest DummyNet . Po zainstalowaniu ipfwmodułu jądra, aby wprowadzić opóźnienie propagacji 50 ms między 2 maszynami, po prostu uruchom następujące polecenia:

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

Aby również wprowadzić 50% strat pakietów, musisz uruchomić:

./ipfw pipe 1 config plr 0.5

Tutaj więcej szczegółów.

gaetano
źródło