dodaj na klasie/dycyplinie
/-\ /-------\
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dst 150.254.32.130/32 flowid 1:3
\_____/ \____/ \_______/ \______________________________________________/
filtry na urządzeniu filtr ma dotyczyć IP filtr 'u32' dopasowujący się do IP wymuszający przydzielenie do klasy 1:3
* 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''
* Wypisz statystyki dla klas, wygeneruj ruch, wypisz ponownie statystyki i porównaj \\ ''tc -s class show dev eth0'' \\ 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'')
* Filtr ''u32'' w ''tc'' pozwalają filtrować:
* 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''++
* pole TOS w nagłówku IP (https://en.wikipedia.org/wiki/Differentiated_services)
* 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''++
//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.
++++
=== 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 \\ dodaj na qdisc/klasie wybór filtra fw \---/ \----------/ \--/ tc filter add dev eth0 parent 1:0 handle 0x130 fw flowid 1:3 \______/ /________\ /____________\ /__________\ filtry na urządzeniu identyfikator używany umieszcza pasujące jednocześnie jako pakiety w klasie 1:3 szukana wartość MARK* 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) //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. ===== htb ===== **[[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)|
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
++++
Dodanie dyscypliny kolejkowej htb realizuje się przykładowo komendą:
tc qdisc add dev eth0 root handle 1 htb default 2
gdzie ''//default 2//'' oznacza, że domyślnie pakiety będą trafiać do klasy 1:2
HTB nie tworzy domyślnie żadnych klas. Tworzenie trzech klas:
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 50mbit
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 40mbit ceil 100mbit
Usunięcie klasy:
''tc class del dev eth0 classid 1:3''
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).
Klasy w HTB mogą tworzyć dowolną hierarchię (drzewo) – można wpinać klasy do klas, np:
tc class add dev eth0 parent 1:1 classid 1:4 htb rate 10mbit ceil 100mbit
tc class add dev eth0 parent 1:4 classid 1:41 htb rate 5mbit ceil 50mbit
tc class add dev eth0 parent 1:4 classid 1:42 htb rate 5mbit ceil 100mbit
[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#przyklad]]
//Zadanie 6a. // Zmień dyscyplinę kolejową na ''htb''. Następnie narysuj i stwórz odpowiednimi poleceniami drzewo klas potrzebne do podzielenia ruchu tak, by:
* na pakiety idące do jednego wybranego komputera było zagwarantowane 10mbit bez możliwości pożyczania ruchu
* 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
//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 / iperf / nc+pv
===== Dodawanie qdisc do klas =====
Każda klasa która nie ma żadnej klasy pod sobą ma swój domyślny qdisc. \\ Można go zmienić na dowolny wybrany, np: \\ ''tc qdisc add dev eth0 handle 2 parent 1:2 fq_codel'' \\ ''tc qdisc add dev eth0 handle 3 parent 1:42 sfq''
Usunięcie qdisc: \\ ''tc qdisc del dev eth0 handle 2:0 parent 1:2''
[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/ts.html#koleki-klasowe-zlozone]]
Można w ten sposób dowolnie zagnieżdżać w sobie klasowe dyscypliny kolejkowania.
//Zadanie 7. // Dodaj pod wybraną klasę z utworzonej wcześniej dyscypliny kolejkowej kolejną dyscyplinę kolejkową dowolnego typu.
===== [Ekstra] IFB + ingress tc =====
Karta sieciowa nie ma kontroli nad tym co i w jakiej kolejności ktoś do niej wysyła, ale
używając TC można próbować kształtować ruch wejściowy opóźniając lub odrzucając to co już przyszło.
Ma to sens, bo protokół TCP dostosowuje prędkość nawiązanego już połączenia do możliwości sieci, więc
opóźnienie lub odrzucenie segmentów TCP które przyszły do systemu spowodują zmianę prędkości wsyłania przez nadawcę.
TC pozwala na bezpośrednie kształtowanie ruchu wchodzącego, ale jest ono zdecydowanie mniej rozbudowane niż kształtowanie ruchu wychodzącego.
Dlatego zwykle używa się urządzenia pośredniego, które pozwala traktować ruch wchodzący jako wychodzący.
++++ Przykład kształtowania na wejściu: |
# dodanie urządzenia 'pośredniego' (Intermediate Functional Block), które:
# * działa jako kolejka na wejściu
# * pozwala kształtować wysyłanie pakietów z kolejki do systemu
# (https://wiki.linuxfoundation.org/networking/ifb)
ip link add name ifb0 type ifb
ip link set ifb0 up
#
# alternatywnie można użyć komend:
#modprobe ifb numifbs=1
#ifconfig ifb0 up
# dodanie dyscypliny kolejkowej typu ingress - pakiety wchodzące
# (handle ffff jest domyślne dla qdisc ingress)
tc qdisc add dev enp0s3 handle ffff ingress
# dyscyplina ingress nie pozwala na rozbudowaną konfigurację, ale:
# można przekazać ruch do pośredniego urządzenia, które pozwoli ruchu wchodzący przetwarzać tak jak wychodzący
# dodanie flitra, który cały ruch wchodzący przekaże do urządzenia ifb:
#
# na urządzeniu enp0s3 sprawdza czy 0==0 jako ruch wychodzący na ifb0
# ___/\___ ___/\__________ _/\_ __/\__
# / \ / \ / \ / \
tc filter add dev enp0s3 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0
# \____ ____/ \____ _____/ \_ ___/
# \/ \/ \/
# na qdisc ffff: (ingres) przekierowuje ruch (man tc-mirred)
# efekt powyższej komendy widać po wpisaniu
tc filter show dev enp0s3 ingress
# lub:
#tc filter show dev enp0s3 parent ffff:
# dalsza konfiguracja odbywa się jak dla zwykłego ruchu wychodzącego dla urządzenia ifb
# przykład z HTB:
tc qdisc add dev ifb0 root handle 1 htb default 2
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 1Gbit
tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 100Mbit ceil 1Gbit
tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 100Mbit
tc filter add dev ifb0 parent 1:0 protocol ip u32 match ip src 10.0.1.3 flowid 1:3
++++
===== [Ekstra] netem =====
Netem to dyscyplina kolejkowa pozwalająca symulować opóźnienia, błędy, stratę i duplikację pakietów.
Dzięki netem można w łatwy sposób sprawdzać jak zachowałby się dany program w zadanych warunkach, np. przy dużych opóźnieniach (łącza satelitarne), czasowo pojawiającym się opóźnieniu kilku pakietów (internet po sieciach radiowych), zmianie kolejności pakietów (multipath routing w infrastrukturze ISP). \\
Dla przykładu: podczas zajęć z programowania netem [[sk2:sockets_caveats#kolejnosc_danych_i_nie_zawodnosc|był użyty]] do sprawdzenia jakie gwarancje daje TCP, a nie daje ich UDP.
Pomoc do netem można znaleźć:
* ''man tc-netem''
* [[https://wiki.linuxfoundation.org/networking/netem]]