Příklad: HTB
Takže podrobněji. HTB je classfull qdisc (tedy s podporou tříd) shaper. S jeho pomocí je možné vytvářet stromovou strukturu tříd a pomocí ní jemně nastavit naše priority síťového provozu. Tedy omezování jednotlivých uživatelů nebo služeb, propůjčování nevyužitého pásma mezi nimi. Tedy to co bylo zmíněno v úvodu.
HTB se umísťuje na odchozí zařízení, neboť filtrovat už na příchozím rozhraní nejsme schopni. Chceme-li filtrovat příchozí i odchozí provoz, musíme HTB zavěsit na obě rozraní.
Abychom mohli HTB využívat musíme mít kernel alespoň verze 2.4.20 a sadu nástrojů iproute (především program 'tc').
Na každou koncovou třídu, tedy tu, která nemá další classfull potomky, můžeme navěsit jeden z přechozích qdisců, například SFQ. Nezavěsíme-li nic, předpokládá se použití qdiscu FIFO. Musíme si uvědomit, že pokud navěsíme více classfull qdisců na sebe stoupají nároky na hardware a může docházet ke zpomalování přenosu.
Nyní pár příkladů na nastavení HTB:
tc qdisc del root dev eth1
Nejprve odstraníme všechny qdiscy, které se na daném zařízení mohly vyskytovat.
tc qdisc add dev eth1 root handle 1: htb default 99
Tímto příkazem se nastaví na zařízení eth1 kořenový qdisc formátu htb s defaultním využíváním podtřídy 99.
tc class add dev eth1 parent 1: classid 1:1 htb rate 512kbit burst 5k quantum 1700
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 120kbit ceil 512kbit burst 1k quantum 1700 prio 1
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 50kbit ceil 320kbit burst 5k quantum 1700 prio 2
tc class add dev eth1 parent 1:1 classid 1:99 htb rate 320kbit burst 1k quantum 1700 prio 3
Přidá htb třídu 1:1 na zařízení eth1 zavěšenou na rodičovskou třídu 1: (root) s parametrem rate, který stanovuje rychlost jakou má třída zaručenu, v tomto případě 512 kbit. Parametr burst zde určuje, kolik se může odeslat maximálně (zde 5kb) dat aniž by se shaper snažil jakkoli omezit přenosovou rychlost a parametr quantum určuje kolik minimálně bytu bude obslouženo, než se předá slovo následující třídě.
Další dva příkazy vytvoří třídy 1:10 a 1:20 se zaručenou rychlostí 120 a 50 kbps a pujčováním pásma až do 512 kbps u třídy 1:10 a 320 kbps v případě třídy 1:20. Třídy jsou priorizované (parametr prio). Čím nižší číslo, tím vyšší priorita a nižší latence.
Třída 1:99 má zaručenou rychlost 320 kbps, ovšem bude obsloužena až jako poslední a nemůže si pujčovat pásmo ani v případě, že jej ostatní třídy nevyužijí!
Základní konfigurace je vysvětlena, ještě zbývá návod, jak paketům říci, do které třídy patří. To můžeme provést dvěma způsoby. Můžeme pakety označovat pomocí tabulky iptables mangle+tc filtrem a nebo čistě jen s použitím tc filtru.
Způsob první, iptables mangle+tc:
iptables -t mangle -A POSTROUTING -d 192.168.0.1 -j MARK --set-mark 1
tc filter add dev eth0 parent 1:0 protocol ip handle 1 fw flowid 1:10
Mangle označí paket jako paket třídy '1' a tc filtr si jej podle toho zařadí do určené třídy (zde 1:1).
Způsob druhý, označování bez použití iptables, pomocí tc filtru:
tc filter add dev eth1 protocol ip parent 1:0 u32 match ip sport 22 0xffff flowid 1:10
tc filter add dev eth1 protocol ip parent 1:0 u32 match ip dport 22 0xffff flowid 1:10
Pomocí těchto dvou pravidel jsme řekli, že pro všechny IP adresy patří port 22 do třídy 1:10.
Je zřejmé, že právě použití priorizovaných tříd se hodí pro všechny důležité služby, které chceme komfortně používat aniž by jejich komunikace byla rušena ostatním provozem (např. SSH, ale i UDP stream v případě on-line her, kde je důležitý nízký ping...).