Narzędzia użytkownika

Narzędzia witryny


sk2:tc

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
sk2:tc [2021/03/21 22:43]
jkonczak [prio + filtry]
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 71: Linia 71:
  
  
-Testowanie prędkości (netperf):​ +Testowanie prędkości ([[https://​hewlettpackard.github.io/​netperf/​|netperf]]): 
-  * instalacja netperf w opensuse: ''​zypper install netperf''​ +  * <​html><​small></​html>​instalacja netperf w opensuse: ''​zypper install netperf''​<​html></​small></​html>​ 
-  * ''​netserver''​ – włącza działający w tle serwer oczekujący na klientów ​\\ +  * ''​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 -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 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]]):​
 +  * ''​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''​
 +
 +<​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 2a. // Zmień kolejkę na urządzeniu ''​p4p1''​ na podany wyżej przykładu z ''​sfq''​. Sprawdź maksymalną prędkość przesyłania danych.
Linia 102: 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]]
Linia 123: 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 class show dev //eth0//''​ – wyświetlenie klas (prio automatycznie tworzy 3 klasy) \\ 
-''​tc -s class show dev eth0''​ – wyświetlenie statystyk klas+''​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.+//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: +==== Filtry ​==== 
-  * 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''​) + 
-  ​* ​''​tc filter show dev eth0'' ​– listuje 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ę. 
-  ​* ​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>​+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. 
 + 
 +<​html><​small></​html>​ 
 + 
 +Więcej informacji o filtrach: http://​www.lartc.org/​howto/​lartc.qdisc.filters.html 
 + 
 +=== Filtr ''​u32'' ​=== 
 +++++ 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 143: 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 iptableswrzucać do wybranej klasy +//Zadanie 4a. // Dodaj filtr typu ''​u32'' ​który pakiety do wybranego komputera będzie umieszczał w klasie ​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. 
-    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+ 
 +<​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 npw filtrowaniu)<​html></​small></​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 ​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 163: 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 178: 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 193: 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 =====
sk2/tc.1616362980.txt.gz · ostatnio zmienione: 2021/03/21 22:43 (edycja zewnętrzna)