Quality of Service APLIKAC NÍ PR ÍRUC KA
POUŽITÉ SYMBOLY Použité symboly Nebezpečí důležité upozornění, které může mít vliv na bezpečí osoby nebo funkčnost přístroje. Pozor upozornění na možné problémy, kterým může dojít ve specifických případech. Informace, poznámka informace, které obsahují užitečné rady, nebo zajímavé poznámky. Příklad ukázka použití daných funkcí, přikazů či skritpů. GPL licence Zdrojové kódy, na které se vztahuje GPL licence, jsou dostupné bez poplatku po zaslání žádosti na adresu: info@conel.cz. Conel s.r.o., Sokolská 71, 562 04 Ústi nad Orlicí, Česká Republika Příručka byla vydána v ČR, 15. května 2014 i
OBSAH Obsah 1 Úvod od QoS 1 1.1 Fronty paketů..................................... 1 1.2 Classless qdisc.................................... 1 1.3 Classful qdisc..................................... 2 2 Konfigurace 3 2.1 Shaping........................................ 3 ii
1. ÚVOD OD QOS 1. Úvod od QoS Quality of Service (QoS) je metoda, jejíž smyslem je rozdělit dostupnou přenosovou kapacitu do tříd tak, aby nedocházelo při zahlcení sítě ke snížení kvality sít ových služeb. V podstatě se jedná o schopnost zajistit různou prioritu různým aplikacím, uživatelům či datovým tokům tak, aby byly příslušné pakety z jednotlivých tříd odesílány v daném pořadí. To mimo jiné znamená, že díky QoS lze zaručit vlastnosti, jako je přenosová rychlost (bit rate), zpoždění (delay), rozptyl zpoždění (jitter) nebo ztrátovost paketů, což je velmi důležité, pokud sít nemá dostačující kapacitu. Taková situace může nastat především v případě realtime streamingových multimediálních aplikací jako je VOIP (Voice over IP) či IP-TV, nebot vyžadují stálou přenosovou rychlost a jsou citlivé na zpoždění. 1.1 Fronty paketů Fronta paketů je pořadí, v jakém budou pakety odeslány ze sít ového rozhraní. Pakety, které čekají ve frontě, lze ovlivňovat pomocí disciplín qdisc (queueing discipline). Jedná se o implementace různých QoS algoritmů. Jednotlivé pakety ve frontě je možné zahazovat, zpomalovat nebo měnit jejich pořadí. Rozlišujeme dva základní typy disciplín classless qdisc a classful qdisc. 1.2 Classless qdisc Disciplína tohoto typu nemůže obsahovat jiné qdisc. Určuje pouze, jakým způsobem bude naloženo s paketem (zda bude zařazen, zpomalen nebo zahozen). FIFO Výchozí fronta. Pakety jsou odesílány v pořadí, v jakém byly přijaty. Nejedná se tedy o příliš spravedlivou nebo nastavitelnou qdisc. TBF Vhodné pro jednoduché omezení rychlosti na sít ovém rozhraní. Funguje na bázi kapes, do které se ukládají pakety. Ty se postupně odesílají nastavenou rychlostí. Jakmile kapsa přeteče, jsou pakety zahazovány. Ve výsledném efektu je fronta díky kapse odolná vůči menším výpadkům. SFQ Zajišt uje rovnoměrné využití sítě všemi aktivními datovými proudy. Vytváří více front, do kterých rozděluje datové proudy podle hashovací funkce. Tato funkce se v čase mění, čímž jsou řešeny kolize (dva proudy ve stejné frontě dlouho nezůstanou). RED Je určen pro vytížené páteřní spoje. Při překročení určité meze vypočítané ze statistik, s rostoucí zátěží lineárně zvyšuje počet zahozených paketů a snaží se tak předejít zahlcení linky. WRED RED s podporou priorit. 1
1. ÚVOD OD QOS Jestliže není nadefinován žádný typ qdisc, používá se automaticky fronta FIFO. Jinou frontu je možné zvolit příkazem: tc qdisc add dev <zařízení> root <qdisc> <qdisc parametry> Odebrání fronty se pak provádí následovně: tc qdisc del dev <zařízení> root 1.3 Classful qdisc Classful qdisc jsou třídy, jež mohou obsahovat další qdisc (classless i classful). Tvoří tak strom tříd, jehož uzly obsahují další classful qdisc a listy právě jednu classless qdisc. Každá disciplína typu classful může mít filtry, pomocí nichž se určí další qdisc, do které budou pakety předány. Díky tomu pakety putují stromovou strukturou až k listům. PRIO Vytváří tři třídy s prioritami 0, 1 a 2. Třídy se zpracovávají postupně od nejnižší priority po nejvyší. CBQ Často používaný typ qdisc s velkým množstvím nastavení. Pakety rozřazuje do potříd, kde jsou dále zpracovávány. Podporuje priority. HTB Modernější a efektivnější obdoba CBQ. Má jednoduší nastavení a nepoužívá propočty nečinnosti linky. 2
2. KONFIGURACE 2. Konfigurace Provádí se pomocí utility tc (traffic control) z balíčku iproute. Jednotlivé disciplíny jsou označovány ve tvaru číslo:číslo, přičemž první číslo (před dvojtečkou) udává číslo qdiscu a to druhé (za dvojtečkou) číslo třídy. Hodnoty musí být voleny tak, aby byly jedinečné, nebot se jedná o identifikační údaje. V rámci vytváření stromové struktury je potřeba dodržovat určitá pravidla. Šířka pásma rodičovského uzlu nesmí být menší než součet průtoků dat listů. Zároveň není vhodné, aby byl strom tvořen velkým počtem listů s mnohonásobně nižší garantovanou propustností než je celková propustnost. 2.1 Shaping Shaping je označení pro omezování šířky pásma na výstupu. Realizace probíhá pomocí front, kde je možné pakety zahazovat, zpomalovat nebo měnit jejich pořadí. Mějme linku s downloadem 1 Mbps, kterou bychom rádi nasdíleli třem uživatelům tak, abychom prvnímu uživateli zaručili alespoň 512 kbps a zbylým dvěma 256 kbps. Jestliže některý z uživatelů přidělenou kapacitu nevyužije, rozdělí se volná část mezi ostatní. Tvar IP adres, které mají tito uživatelé je 10.0.0.10 10.0.0.12. Nejprve vytvoříme strukturu HTB tříd, přičemž kořenová bude obsahovat celou kapacitu linky a její podtřídy budou odpovídat třem uživatelům. tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1: htb default 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit tc class add dev eth0 parent 1:1 classid 1:11 htb rate 512Kbit ceil 1024kbit tc class add dev eth0 parent 1:1 classid 1:12 htb rate 256Kbit ceil 1024kbit tc class add dev eth0 parent 1:1 classid 1:13 htb rate 256Kbit ceil 1024kbit Třídy s vyšší prioritou se zpravidla uvádějí dříve. Parametr rate udává garantovanou propustnost (celkový součet hodnot rate potomků by neměl přesáhnout hodnotu rate rodiče). Parametr ceil udává maximální propustnost a platí, že ceil potomka by neměl být vetší nežli ceil rodiče. Výchozí frontou na classful qdisc je fronta typu FIFO. Ta však není příliš spravedlivá, a tak ji nahradíme SFQ. Parametr perturb používaný na konci příkazu udává, jak často má být měněna hashovací funkce. tc qdisc add dev eth0 parent 1:11 handle 11: sfq perturb 10 tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10 tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10 3
2. KONFIGURACE Zbývá nám roztřídit pakety do správných tříd, a proto zavedeme filtry. Identifikace paketů pro danou třídu lze provést několika způsoby. Filtr může číst značku v TOS oktetu hlavičky paketu, filtrovat pomocí zdrojové/cílové IP adresy, zdrojového/cílového portu nebo využít značky vytvořené přes mangle tabulku v iptables. Nejprve tedy identifikace na základě cílové IP adresy: tc filter add dev eth0 parent 1:1 protocol ip u32 match ip dst 10.0.0.10 flowid 1:11 tc filter add dev eth0 parent 1:1 protocol ip u32 match ip dst 10.0.0.11 flowid 1:12 tc filter add dev eth0 parent 1:1 protocol ip u32 match ip dst 10.0.0.12 flowid 1:13 Identifikace na základě označení přes iptables: iptables -t mangle -A FORWARD -d 10.0.0.10 -j MARK set-mark 10 iptables -t mangle -A FORWARD -d 10.0.0.11 -j MARK set-mark 11 iptables -t mangle -A FORWARD -d 10.0.0.12 -j MARK set-mark 12 tc filter add dev eth0 parent 1: protocol ip handle 10 fw flowid 1:11 tc filter add dev eth0 parent 1: protocol ip handle 11 fw flowid 1:12 tc filter add dev eth0 parent 1: protocol ip handle 12 fw flowid 1:13 Identifikace na základě cílové IP adresy se využívá především v situacích, kdy není zapotřebí složitějších pravidel. Výhody identifikace pomocí iptables se projeví například při klasifikaci na základě MAC adres. Nutno však dodat, že tato metoda je o něco pomalejší. 4