Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja Ostatnia wersja Both sides next revision | ||
sk2:tc [2021/10/04 20:40] jkonczak [Proste przykłady] |
sk2:tc [2023/01/10 10:33] jkonczak [htb] |
||
---|---|---|---|
Linia 7: | Linia 7: | ||
"Kolejka" domyślnie jest kolejką – system wyciąga pakiety z kolejki w kolejności w jakiej zostały dodane. | "Kolejka" domyślnie jest kolejką – system wyciąga pakiety z kolejki w kolejności w jakiej zostały dodane. | ||
- | Można jednak zastąpić to zachowanie (dyscyplinę kolejkowania – Queueing DISCipline, qdisc) innym. | + | Można jednak zastąpić to zachowanie (dyscyplinę kolejkowania – Queueing DISCipline, qdisc) innym [[https://en.wikipedia.org/wiki/Network_scheduler|[2]]]. |
Pozwala to kształtować ruch – ograniczać prędkość i priorytetyzować wybrane pakiety ([[https://en.wikipedia.org/wiki/Traffic_shaping|Traffic shaping]]). | Pozwala to kształtować ruch – ograniczać prędkość i priorytetyzować wybrane pakiety ([[https://en.wikipedia.org/wiki/Traffic_shaping|Traffic shaping]]). | ||
Linia 82: | Linia 82: | ||
dd if=/dev/zero | nc 10.0.0.10 9 & dd if=/dev/zero | nc 10.0.1.1 9 & sleep 10 ; pkill -INT -f 'dd if' | dd if=/dev/zero | nc 10.0.0.10 9 & dd if=/dev/zero | nc 10.0.1.1 9 & sleep 10 ; pkill -INT -f 'dd if' | ||
--></html> | --></html> | ||
+ | |||
+ | <html><small></html> | ||
+ | |||
Testowanie prędkości ([[https://iperf.fr/|iperf3]]): | Testowanie prędkości ([[https://iperf.fr/|iperf3]]): | ||
* ''iperf3 -s'' – włącza działający w tle serwer oczekujący na klientów | * ''iperf3 -s'' – włącza działający w tle serwer oczekujący na klientów | ||
Linia 90: | Linia 93: | ||
* odbiorca: ''nc -l 3000 | pv > /dev/null'' | * odbiorca: ''nc -l 3000 | pv > /dev/null'' | ||
* nadawca: ''pv /dev/zero | nc lab-net-1 3000'' | * nadawca: ''pv /dev/zero | nc lab-net-1 3000'' | ||
+ | |||
+ | <html></small></html> | ||
+ | |||
Monitorowanie prędkości na wybranej dyscyplinie / klasie: | Monitorowanie prędkości na wybranej dyscyplinie / klasie: | ||
* ''bmon'' [[https://github.com/tgraf/bmon]] | * ''bmon'' [[https://github.com/tgraf/bmon]] | ||
Linia 130: | Linia 136: | ||
===== prio + filtry ===== | ===== prio + filtry ===== | ||
+ | |||
+ | ==== prio ==== | ||
**[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#prio]]** | **[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#prio]]** | ||
- | ''tc qdisc add dev eth0 handle 1 root prio'' – ustawienie klasowego qdisc, kolejki priorytetowej | + | ''tc qdisc add dev //eth0// handle //1// root prio'' – ustawienie klasowego qdisc, kolejki priorytetowej |
+ | |||
+ | ''tc class show dev //eth0//'' – wyświetlenie klas (prio automatycznie tworzy 3 klasy) \\ | ||
+ | ''tc -s class show dev //eth0//'' – wyświetlenie statystyk klas | ||
+ | |||
+ | //Zadanie 3. // Zmień dyscyplinę kolejkową na ''p4p1'' na ''prio''. Wyświetl listę klas i ich statystyki. Zbadaj gdzie domyślnie trafia ruch (patrząc na statystyki lub używając ''bmon''). | ||
+ | |||
+ | ==== Filtry ==== | ||
+ | |||
+ | Pakiet który trafia do "kolejki" pakietów czekających na wysłanie trafia wpierw do root qdisc. \\ Ten decyduje co z nim zrobić: przegląda filtry i jeśli któryś pasuje – stosuje go. Jeśli żaden nie pasuje – wykonuje domyślną akcję. | ||
+ | \\ | ||
+ | Np. dla ''prio'' domyślna akcja to wybór jednej z 3 kolejek bazując na polu TOS w nagłówku IP (''man tc-prio''). | ||
+ | |||
+ | Polecenie ''tc filter show dev //eth0//'' listuje filtry. \\ //Uwaga:// samo <html><span style="text-decoration: line-through;"></html>''tc filter show''<html></span></html> zwróci pusty wynik nawet jeśli dodano filtry. | ||
- | ''tc class show dev eth0'' – wyświetlenie klas (prio automatycznie tworzy 3 klasy) \\ | + | <html><small></html> |
- | ''tc -s class show dev eth0'' – wyświetlenie statystyk klas | + | |
- | //Zadanie 3. // Zmień dyscyplinę kolejkową na ''p4p1'' na ''prio''. Wyświetl listę klas i ich statystyki. Zbadaj gdzie domyślnie trafia ruch. | + | Więcej informacji o filtrach: http://www.lartc.org/howto/lartc.qdisc.filters.html |
- | Filtry: | + | === Filtr ''u32'' === |
- | * Podstawa działania: pakiet który trafia do "kolejki" pakietów czekających na wysłanie trafia wpierw do root qdisc. Ten decyduje co z nim zrobić: przegląda filtry i jeśli któryś pasuje – stosuje go. Jeśli żaden nie pasuje – wykonuje domyślną akcję. Dla ''prio'' domyślna akcja to wybór jednej z 3 kolejek bazując na polu TOS w nagłówku IP (''man tc-prio'') | + | ++++ Filtr u32 | |
- | * ''tc filter show dev eth0'' – listuje filtry | + | * Przykładowy filtr: \\ ''tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dst 150.254.32.130/32 flowid 1:3'' <code> |
- | * Filtr ** ''u32'' ** | + | |
- | * Przykładowy filtr: \\ ''tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dst 150.254.32.130/32 flowid 1:3'' <code> | + | |
dodaj na klasie/dycyplinie | dodaj na klasie/dycyplinie | ||
/-\ /-------\ | /-\ /-------\ | ||
Linia 150: | Linia 168: | ||
\_____/ \____/ \_______/ \______________________________________________/ | \_____/ \____/ \_______/ \______________________________________________/ | ||
filtry na urządzeniu filtr ma dotyczyć IP filtr 'u32' dopasowujący się do IP wymuszający przydzielenie do klasy 1:3</code> | filtry na urządzeniu filtr ma dotyczyć IP filtr 'u32' dopasowujący się do IP wymuszający przydzielenie do klasy 1:3</code> | ||
- | * Przetestuj działanie filtra komendą \\ ''netperf -H 150.254.32.130 & netperf -H 150.254.32.131 ; wait'' | + | * Przetestuj działanie filtra komendą \\ ''netperf -H 150.254.32.130 & netperf -H 150.254.32.131 ; wait'' |
- | * Przetestuj działanie filtra komendą \\ ''netperf -t UDP_STREAM -H 150.254.32.130 & netperf -t UDP_STREAM -H 150.254.32.131 ; wait'' | + | * Przetestuj działanie filtra komendą \\ ''netperf -t UDP_STREAM -H 150.254.32.130 & netperf -t UDP_STREAM -H 150.254.32.131 ; wait'' |
- | * Wypisz statystyki dla klas, wygeneruj ruch, wypisz ponownie statystyki i porównaj \\ ''tc -s class show dev eth0'' \\ <html><small></html>Możesz też skorzystać z programu ''bmon'' do monitorowania na bieżąco przepustowości dla klas \\ (żeby zainstalować ''bmon'', użyj polecenia ''zypper install bmon'')<html></small></html> | + | * Wypisz statystyki dla klas, wygeneruj ruch, wypisz ponownie statystyki i porównaj \\ ''tc -s class show dev eth0'' \\ <html><small></html>Możesz też skorzystać z programu ''bmon'' do monitorowania na bieżąco przepustowości dla klas \\ (żeby zainstalować ''bmon'', użyj polecenia ''zypper install bmon'')<html></small></html> |
- | * Filtr ''u32'' w ''tc'' pozwalają filtrować: | + | * Filtr ''u32'' w ''tc'' pozwalają filtrować: |
- | * adresy IP, źródłowe i docelowe | + | * adresy IP, źródłowe i docelowe |
- | * protokoły warstwy transportowej (icmp, tcp, udp) ++ przykład|: \\ ''tc filter add dev eth0 parent 1:0 u32 match ip protocol 1 0xff flowid 1:1''++ | + | * protokoły warstwy transportowej (icmp, tcp, udp) ++ przykład|: \\ ''tc filter add dev eth0 parent 1:0 u32 match ip protocol 1 0xff flowid 1:1''++ |
- | * pole TOS w nagłówku IP (https://en.wikipedia.org/wiki/Differentiated_services) | + | * pole TOS w nagłówku IP (https://en.wikipedia.org/wiki/Differentiated_services) |
- | * <html><small></html>porty protokołów warstwy transportowej (ssh, dns, http, openvpn, xmpp) ++ przykład | (nie do końca poprawny): \\ ''tc filter add dev eth0 parent 1:0 u32 match ip sport 443 0xffff match ip protocol 6 0xff flowid 1:1''++<html></small></html> | + | * <html><small></html>porty protokołów warstwy transportowej (ssh, dns, http, openvpn, xmpp) ++ przykład | (nie do końca poprawny): \\ ''tc filter add dev eth0 parent 1:0 u32 match ip sport 443 0xffff match ip protocol 6 0xff flowid 1:1''++<html></small></html> |
- | * Filtr ** ''fw'' ** | + | |
- | * Do bardziej złożonego filtrowania można użyć filtru ''fw'', który pozwala odpowiednio oznaczony ruch (np. przez iptables) wrzucać do wybranej klasy | + | |
- | * Dodawanie filtrów z wykorzystaniem iptables: \\ ''iptables -A OUTPUT -d 150.254.32.130 -j MARK --set-mark 130'' – nakazuje iptables zaznaczać pakiety \\ ''tc filter add dev eth0 parent 1:0 handle 130 fw flowid 1:3'' – nakazuje pakiety zaznaczone jako 130 wrzucać do klasy 1:3 | + | |
- | * http://www.lartc.org/howto/lartc.qdisc.filters.html | + | |
- | //Zadanie 4. // Dodaj filtr typu ''u32'' który pakiety do wybranego komputera będzie umieszczał w klasie o niższym priorytecie. Korzystając ze statystyk klas sprawdź czy filtr działa. Sprawdź (np. netperfem) jakie są prędkości wysyłania danych jeśli jednocześnie dane są wysyłane tego komputera i do dowolnego innego. | + | //Zadanie 4a. // Dodaj filtr typu ''u32'' który pakiety do wybranego komputera będzie umieszczał w klasie o niższym priorytecie. Korzystając ze statystyk klas sprawdź czy filtr działa. Sprawdź (np. netperfem) jakie są prędkości wysyłania danych jeśli jednocześnie dane są wysyłane tego komputera i do dowolnego innego. |
+ | ++++ | ||
+ | |||
+ | <html></small></html> | ||
+ | === Filtr ''fw'' === | ||
+ | * W jądrze Linuksa z każdym pakietem jest powiązanych kilka znaczników (MARK, CONNMARK, SECMARK). | ||
+ | * Wartość znaczników można ustawiać (i sprawdzać) w filtrach iptables / nft, np: \\ ''iptables -A OUTPUT -d 150.254.32.130 -j MARK --set-mark 0x130'' \\ – dodaje znacznik 0x130 do pakietów idących do adresu 150.254.32.130 | ||
+ | * Filtr ''fw'' dodany do qdisc kieruje do wybranej klasy pakiety ze znacznikiem MARK pasującym do podanego ''handle'', np: \\ ''tc filter add dev eth0 parent 1:0 handle 0x130 fw flowid 1:3'' \\ – nakazuje pakiety zaznaczone jako 0x130 wrzucać do klasy 1:3 \\ <html><small><pre> | ||
+ | dodaj na qdisc/klasie wybór filtra fw | ||
+ | \---/ \----------/ \--/ | ||
+ | <b>tc filter add dev eth0 parent 1:0 handle 0x130 fw flowid 1:3</b> | ||
+ | \______/ /________\ /____________\ /__________\ | ||
+ | filtry na urządzeniu identyfikator używany umieszcza pasujące | ||
+ | jednocześnie jako pakiety w klasie 1:3 | ||
+ | szukana wartość MARK</pre></small></html> | ||
+ | * <html><small></html>Wartość ''handle'' może być też podana jako wartość z maską, np: \\ ''tc filter add dev eth0 parent 1:0 handle 0x30/0xf0 fw flowid 1:3'' \\ pozwala to na wykorzystywanie jedynie części znacznika MARK w tc (i umożliwia wykorzystanie reszty np. w filtrowaniu)<html></small></html> | ||
+ | |||
+ | //Zadanie 4b. // Dodaj filtr typu ''fw'' i regułę iptables tak żeby pakiety idące wybranego komputera były umieszczane w klasie o niższym priorytecie. Korzystając ze statystyk klas sprawdź czy ustawienia działają. Sprawdź (np. netperfem) jakie są prędkości wysyłania danych jeśli jednocześnie dane są wysyłane tego komputera i do dowolnego innego. | ||
//Zadanie 5. // Dodaj filtr typu ''fw'' i regułę iptables które pakiety protokołu icmp będą umieszczały w kolejce o najwyższym priorytecie. Korzystając ze statystyk klas sprawdź czy filtr działa. | //Zadanie 5. // Dodaj filtr typu ''fw'' i regułę iptables które pakiety protokołu icmp będą umieszczały w kolejce o najwyższym priorytecie. Korzystając ze statystyk klas sprawdź czy filtr działa. | ||
Linia 170: | Linia 201: | ||
**[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#hierarchical-token-bucket]]** | **[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#hierarchical-token-bucket]]** | ||
+ | |||
+ | ++++ Gotowa konfiguracja htb (do użycia na laboratoriach w przypadku braku czasu)| | ||
+ | <code>tc qdisc del dev em1 root | ||
+ | |||
+ | tc qdisc add dev em1 root handle 1 htb default 32 | ||
+ | |||
+ | tc class add dev em1 parent 1:0 classid 1:1 htb rate 100mbit | ||
+ | tc class add dev em1 parent 1:1 classid 1:2 htb rate 60mbit | ||
+ | tc class add dev em1 parent 1:2 classid 1:21 htb rate 20mbit ceil 60mbit | ||
+ | tc class add dev em1 parent 1:2 classid 1:22 htb rate 40mbit ceil 60mbit | ||
+ | tc class add dev em1 parent 1:1 classid 1:3 htb rate 40mbit ceil 100mbit | ||
+ | tc class add dev em1 parent 1:3 classid 1:31 htb rate 30mbit ceil 100mbit | ||
+ | tc class add dev em1 parent 1:3 classid 1:32 htb rate 10mbit ceil 50mbit | ||
+ | |||
+ | tc filter add dev em1 parent 1:0 handle 0x21 fw flowid 1:21 | ||
+ | tc filter add dev em1 parent 1:0 handle 0x22 fw flowid 1:22 | ||
+ | tc filter add dev em1 parent 1:0 handle 0x31 fw flowid 1:31 | ||
+ | tc filter add dev em1 parent 1:0 handle 0x32 fw flowid 1:32 | ||
+ | |||
+ | iptables -F | ||
+ | iptables -A OUTPUT -d 10.0.0.0/30 -j MARK --set-mark 0x21 | ||
+ | iptables -A OUTPUT -d 10.0.0.4/30 -j MARK --set-mark 0x22 | ||
+ | iptables -A OUTPUT -d 10.0.0.8/30 -j MARK --set-mark 0x31 | ||
+ | iptables -A OUTPUT -d 10.0.0.12/30 -j MARK --set-mark 0x32 | ||
+ | </code> | ||
+ | ++++ | ||
Dodanie dyscypliny kolejkowej htb realizuje się przykładowo komendą: | Dodanie dyscypliny kolejkowej htb realizuje się przykładowo komendą: | ||
Linia 185: | Linia 242: | ||
W HTB zwykle tworzy się klasy tak, by bezpośrednio do qdisc była podpięta jedna klasa, definiująca tylko rate (maksymalny dla łącza), a pod nią były podpięte kolejne, definiujące rate i ceil (których sumaryczny rate ani pojedynczy ceil jest nie większy niż możliwości łącza). | W HTB zwykle tworzy się klasy tak, by bezpośrednio do qdisc była podpięta jedna klasa, definiująca tylko rate (maksymalny dla łącza), a pod nią były podpięte kolejne, definiujące rate i ceil (których sumaryczny rate ani pojedynczy ceil jest nie większy niż możliwości łącza). | ||
- | Dodaj regułę wrzucającą wybrany ruch do klasy 1:3, sprawdź pożyczanie | ||
Klasy w HTB mogą tworzyć dowolną hierarchię (drzewo) – można wpinać klasy do klas, np: | Klasy w HTB mogą tworzyć dowolną hierarchię (drzewo) – można wpinać klasy do klas, np: | ||
Linia 200: | Linia 256: | ||
* na pakiety idące do drugiego wybranego komputera było zagwarantowane 20mbit ruchu z możliwością pożyczania do 100mbit | * na pakiety idące do drugiego wybranego komputera było zagwarantowane 20mbit ruchu z możliwością pożyczania do 100mbit | ||
* na pozostałe pakiety było zagwarantowane 70mbit ruchu z możliwością pożyczania do 100mbit | * na pozostałe pakiety było zagwarantowane 70mbit ruchu z możliwością pożyczania do 100mbit | ||
+ | |||
//Zadanie 6b. // Dodaj odpowiednie filtry i przetestuj czy działają korzystając ze statystyk klas. | //Zadanie 6b. // Dodaj odpowiednie filtry i przetestuj czy działają korzystając ze statystyk klas. | ||
- | //Zadanie 6c. // Sprawdź przestrzeganie limitów i działanie pożyczania używając programu netperf. | + | |
+ | //Zadanie 6c. // Sprawdź przestrzeganie limitów i działanie pożyczania używając programu netperf / iperf / nc+pv | ||
===== Dodawanie qdisc do klas ===== | ===== Dodawanie qdisc do klas ===== |