Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:tc [2020/12/08 10:58] jkonczak [Proste przykłady] |
sk2:tc [2023/01/10 10:35] (aktualna) 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 57: | Linia 57: | ||
* ''tc -s qdisc show dev eth0'' – pokazuje statystyki | * ''tc -s qdisc show dev eth0'' – pokazuje statystyki | ||
| | ||
- | //Zadanie 1. // Wyświetl jakie dyscypliny kolejkowe są używane. Sprawdź ile bajtów wysłał twój komputer przez kartę ''em1''. | + | //Zadanie 1. // Wyświetl jakie dyscypliny kolejkowe są używane. Sprawdź ile bajtów wysłał twój komputer przez kartę ''p4p1''. |
| | ||
Usunięcie bieżącej dyscypliny kolejkowania: \\ | Usunięcie bieżącej dyscypliny kolejkowania: \\ | ||
Linia 66: | Linia 66: | ||
* ''tc qdisc add dev eth0 handle 1 root sfq'' | * ''tc qdisc add dev eth0 handle 1 root sfq'' | ||
* ''tc qdisc add dev eth0 handle 1 root tbf rate 10mbit burst 64k latency 50ms'' | * ''tc qdisc add dev eth0 handle 1 root tbf rate 10mbit burst 64k latency 50ms'' | ||
+ | * ''tc qdisc add dev eth0 handle 1 root cake bandwidth 10mbit'' | ||
Zawsze interfejs musi mieć jedną główną (root) dyscyplinę. | Zawsze interfejs musi mieć jedną główną (root) dyscyplinę. | ||
- | Testowanie prędkości (netperf): | + | Testowanie prędkości ([[https://hewlettpackard.github.io/netperf/|netperf]]): |
- | * ''netserver'' – włącza działający w tle serwer oczekujący na klientów \\ | + | * <html><small></html>instalacja netperf w opensuse: ''zypper install netperf''<html></small></html> |
- | * ''netperf -H //host-docelowy//'' – nawiązuje połączenie z netserverem, uruchamia domyślny test (TCP_STREAM) \\ | + | * ''netserver -N'' – włącza działający w tle serwer oczekujący na klientów |
+ | * ''netperf -H //host-docelowy//'' – nawiązuje połączenie z netserverem, uruchamia domyślny test (TCP_STREAM) | ||
* ''netperf -t UDP_STREAM -H //host-docelowy//'' – nawiązuje połączenie z netserverem, uruchamia test UDP_STREAM | * ''netperf -t UDP_STREAM -H //host-docelowy//'' – nawiązuje połączenie z netserverem, uruchamia test UDP_STREAM | ||
<html><!-- | <html><!-- | ||
Linia 80: | 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]]): | ||
+ | * ''iperf3 -s'' – włącza działający w tle serwer oczekujący na klientów | ||
+ | * ''iperf3 -c //host-docelowy//'' – nawiązuje połączenie z serwerem iperf3, uruchamia domyślny test (TCP) | ||
+ | * ''iperf3 -ub0 -c //host-docelowy//'' – nawiązuje połączenie z serwerem iperf3, uruchamia test po UDP | ||
Testowanie prędkości - netcat i [[http://www.ivarch.com/programs/pv.shtml|pv]]: | Testowanie prędkości - netcat i [[http://www.ivarch.com/programs/pv.shtml|pv]]: | ||
- | * instalacja pv w opensuse: ''zypper install pv'' | + | * <html><small></html>instalacja pv w opensuse: ''zypper install pv''<html></small></html> |
* 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'' | ||
- | //Zadanie 2a. // Zmień kolejkę na urządzeniu ''em1'' na podany wyżej przykładu z ''sfq''. Sprawdź maksymalną prędkość przesyłania danych. | + | <html></small></html> |
+ | |||
+ | Monitorowanie prędkości na wybranej dyscyplinie / klasie: | ||
+ | * ''bmon'' [[https://github.com/tgraf/bmon]] | ||
+ | |||
+ | //Zadanie 2a. // Zmień kolejkę na urządzeniu ''p4p1'' na podany wyżej przykładu z ''sfq''. Sprawdź maksymalną prędkość przesyłania danych. | ||
- | //Zadanie 2b. // Zmień kolejkę na urządzeniu ''em1'' na podany wyżej przykładu z ''tbf''. Sprawdź maksymalną prędkość przesyłania danych. | + | //Zadanie 2b. // Zmień kolejkę na urządzeniu ''p4p1'' na podany wyżej przykładu z ''tbf''. Sprawdź maksymalną prędkość przesyłania danych. |
Przepełnienie kolejki. | Przepełnienie kolejki. | ||
Linia 100: | Linia 114: | ||
=== Bezklasowe === | === Bezklasowe === | ||
Przykładowe: | Przykładowe: | ||
- | * ''pfifo'' i ''bfifo'' – proste kolejki; zbierają statystyki ile (p)akietów / (b)ajtów wysłały. | + | * ''pfifo'' i ''bfifo'' – proste kolejki o rozmiarze określonym w pakietach / bajtach |
* ''pfifo_fast'' – kolejki priorytetowe dające pierwszeństwo na podstawie pola ToS protokołu IP [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#pfifo-fast]] | * ''pfifo_fast'' – kolejki priorytetowe dające pierwszeństwo na podstawie pola ToS protokołu IP [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#pfifo-fast]] | ||
+ | * ''red'' – zmusza połączenia do spowolnienia zanim zapchają kolejkę, odrzucając losowo pakiety kiedy w kolejce jest ich odpowiednio dużo [[https://www.ciscopress.com/articles/article.asp?p=352991&seqNum=8]] | ||
* ''sfq'' – zapewnia fairness [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#stochastic-fair-queueing-sfq]] | * ''sfq'' – zapewnia fairness [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#stochastic-fair-queueing-sfq]] | ||
* ''tbf'' – ogranicza prędkość [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#token-bucket-filter]] | * ''tbf'' – ogranicza prędkość [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#token-bucket-filter]] | ||
- | * ''fq_codel'', <html><small></html>''codel''<html></small></html>, ''cake'' – dobiera rozmiar kolejki tak żeby nie ograniczać prędkości i utrzymywać małe opóźnienie [[http://www.bufferbloat.net/projects/codel/wiki]] | + | * ''fq_codel'', <html><small></html>''codel''<html></small></html> – dobiera rozmiar kolejki tak żeby nie ograniczać prędkości i utrzymywać małe opóźnienie [[http://www.bufferbloat.net/projects/codel/wiki]] |
+ | * ''cake'' – łączy wiele pomysłów tak, by działać sensownie w typowych zastosowaniach, m. inn. priorytety, wydzielanie połączeń (flows) i inna obsługa flows o różnej charakterystyce, fairness, możliwość ograniczenia przepustowości [[https://www.bufferbloat.net/projects/codel/wiki/CakeTechnical/]] | ||
=== Klasowe === | === Klasowe === | ||
Linia 120: | 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 ''em1'' 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 140: | 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'' | + | * 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 160: | 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 | ||
+ | |||
+ | iptables -F | ||
+ | iptables -A OUTPUT -d lab-net-X -j MARK --set-mark 0x21 | ||
+ | iptables -A OUTPUT -d lab-net-Y -j MARK --set-mark 0x22 | ||
+ | iptables -A OUTPUT -d lab-net-Z -j MARK --set-mark 0x31 | ||
+ | </code> | ||
+ | ++++ | ||
Dodanie dyscypliny kolejkowej htb realizuje się przykładowo komendą: | Dodanie dyscypliny kolejkowej htb realizuje się przykładowo komendą: | ||
Linia 175: | Linia 240: | ||
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 190: | Linia 254: | ||
* 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 ===== |