Vsiml jsem si, ze tady nikde neni sepsany navod pro tento shaper a jelikoz jsem ho ted potreboval pro proeho z fora sepsat, tak ho sem hodim a necham ho na posouzeni, urcite se v nem najdou chyby, tak budu rad za kazdou pripominku. Hlavne co se tyce priorit a burstu, o tom nemam moc velke potuchy. Ja sam jsem zrovna moc podrobnejsi dokumentace k HTB nenasel.

Proto take prosim nejakeho moderatora at da tento thread jako sticky(dulezity)

Co uz vim dopredu, ze bych mel nechavat nejakou rezervu a nevyuzivat dostupnou rychlost do posledniho kbitu.

Je to psane pro nekoho, a nechce se me to prepisovat, ale srozumitelne to je snad dobre

HTB funguje na principu stromu, kdy vytvaris koren, uzly a jednotlive listy a prirazujes mezi ne rychlost. Kazdemu listu muzes priradit minimalni a maximalni rychlost. Pod minimalni nikdy neklesne, a na maximalni se dostanes pokud je rychlost volna. Volnou rychlost si pujcuje od sousedniho listu pres spolecny uzel.

Graficky to vypada takto

(cislo pred lomitkem je minimalni rychlost, za lomitkem maximalni)
Kód:
                                       -koren- (rychlost 1024kbit)
                                          |
                             _____________/\_____________ 
                            /                            \
                        -uzel 1- (400kbit, max 600)   -uzel 2- (624kbit, max 800)
       ___________________|___________          __________|______                      
      |                   |          |         |                 |   
  klient1(100/200) kl2(100/150) kl3(200/250)  kl4(500/600)   -uzel 3-(124/200)
                                                         ________/\________
                                                        |                  |
                                                    kl5(62/100)         kl6(62/100)
Vytvoris koren kteremu priradis rychlost 1024kbit/s. Ten ma dva nasledniky (uzly), kterym mezi ktere rozdelis tech 1024kbit, ale kazdy si muze "pujcit" od vedlejsiho rychlost, pokud mu zbyva, tj. zadny z klientu ji momentalne nepotrebuje. Takze mas sice konektivu 1024kbit, ale "prodavas" dale 1400kbit.
Dale na uzlu 1 rozdelis rychlost mezi 3 klienty a ti si mohou "pujcovat" rychlost mezi sebou. Na uzlu 2 mas jednoho klienta a dalsi uzel, pujcovani probiha mezi klientem 4 a uzlem 3 a na uzlu 3 si rychlost mezi sebou pujcuji klienti 5 a 6.
Pokud vsichni klienti na uzlu zrovna nestahuji neustale plnou rychlosti z DC++, emule apod, tak nemaji sanci poznat ze rozdelujes vetsi rychlost nez jakou ve skutecnosti mas. Vetsina klientu stejne jen brouzda po netu, takze svou konektivu vyuzivaji malo a jen procitaji web. Take se daji nastavovat priority a veci jako burst, ze i kdybys tam mel nejakeho stahovace, tak se pozadavky pro web (narazovy pozadavek) uprednostni a klient na webu nepozna, ze jeho rychlost vyuzivat stahovac. Tuto vec jsem ale jeste neresil, takze burst a priority nevim jak tam presne funguji.

Tady to vysvetlim na konfiguraku, k tomu potrebujes mit zprovoznene jadro s podporou iptables a htb a nainstalovane iptables a iproute2

Ted koren a kazdy uzel a list(klienta) musis oznacit unikatnim cislem. Ja osobne abych se v tom vyznal, tak prvni uroven me zacina 1, druha 2, treti 3 apod. Uzly maji cislo vetsi nez 254 a klienti maji cislo podle sve IP adresy.

Takze uzel 1 ma cislo 1301, uzel 2 1302, klient 1 ma cislo 2011, kl2 2012, kl3 2013, kl4 2014, uzel3 2303, kl5 3015, kl6 3016
#Vytvarim koren
Kód:
tc qdisc add dev eth1 root handle 1:0 htb default 14
#Priradim korenu rychlost
Kód:
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 1024kbit
#Vytvarim uzel 1
Kód:
tc class add dev eth1 parent 1:1 classid 1:1301 htb rate 400kbit ceil 600kbit (uzel 1)
#Vytvarim uzel 2
Kód:
tc class add dev eth1 parent 1:1 classid 1:1302 htb rate 624kbit ceil 800kbit (uzel 2)
#Vytvarim klienty na uzlu 1
Kód:
tc class add dev eth1 parent 1:1301 classid 1:2011 htb rate 100kbit ceil 200kbit (IP .11)
tc class add dev eth1 parent 1:1301 classid 1:2012 htb rate 100kbit ceil 150kbit (IP .12)
tc class add dev eth1 parent 1:1301 classid 1:2013 htb rate 200kbit ceil 250kbit (IP .13)
#Vytvarim klienta a uzel 3 na uzlu 2
Kód:
tc class add dev eth1 parent 1:1302 classid 1:2014 htb rate 500kbit ceil 600kbit (IP .14)
tc class add dev eth1 parent 1:1302 classid 1:2303 htb rate 124kbit ceil 200kbit (uzel 3)
#Vytvarim klienty na uzlu 3
Kód:
tc class add dev eth1 parent 1:2303 classid 1:3015 htb rate 62kbit ceil 100kbit (IP .15)
tc class add dev eth1 parent 1:2303 classid 1:3016 htb rate 62kbit ceil 100kbit (IP .16)
Kdyz se na to ted podivas, tak jeste stale neni poznat co je vlastne klientem a co je uzlem. Uzel i klient vypadaji stejne.
V nasledujich prikazech to priradis.

#Specifikace klientu
Kód:
tc qdisc add dev eth1 parent 1:2011 handle 2011:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:2012 handle 2012:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:2013 handle 2013:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:2014 handle 2014:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:3015 handle 3015:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:3016 handle 3016:0 sfq perturb 10
sfq je algoritmus podle ktereho se prepocitava rychlost a perturb 10 je ze se prepocita jednou za 10 sekund, aspon takto jsem to nekde nasel, ale ruku do ohne za to nedam

A ted jeste musis priradit jednotlive listy jednotlivym IP adresam
#Prirazeni IP adres listum
Kód:
tc filter add dev eth1 parent 1:0 protocol ip handle 11 fw flowid 1:2011
tc filter add dev eth1 parent 1:0 protocol ip handle 12 fw flowid 1:2012
tc filter add dev eth1 parent 1:0 protocol ip handle 13 fw flowid 1:2013
tc filter add dev eth1 parent 1:0 protocol ip handle 14 fw flowid 1:2014
tc filter add dev eth1 parent 1:0 protocol ip handle 15 fw flowid 1:3015
tc filter add dev eth1 parent 1:0 protocol ip handle 16 fw flowid 1:3016
A ted uplne posledni vec, abys to mohl priradit tak musis v iptables kazdemu paketu priradit "znacku" (mark) a podle teto znacky htb rozpozna komu ten paket patri.
Kód:
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.11 -s ! 192.168.1.0/24 -j MARK --set-mark 11
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.12 -s ! 192.168.1.0/24 -j MARK --set-mark 12
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.13 -s ! 192.168.1.0/24 -j MARK --set-mark 13
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.14 -s ! 192.168.1.0/24 -j MARK --set-mark 14
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.15 -s ! 192.168.1.0/24 -j MARK --set-mark 15
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.16 -s ! 192.168.1.0/24 -j MARK --set-mark 16
Neznackuju pakety urcene pro vnitrni sit, tam nemam potrebu omezovat rychlost.

No a pak toto same nastavis pro upload na druhe sitovce, coz je to same jen za eth1 napises eth0 a v iptables misto POSTROUTING bude PREROUTING
Kód:
$IPTABLES -t mangle -A PREROUTING -s 192.168.1.11 -d ! 192.168.1.0/24 -j MARK --set-mark 11
Podle osobnich zkusenosti pokud ma uzel vic nez 4 nasledovniky na dalsi urovni, tak shaper funguje nepredvidatelne. Jednou jsem tam mel asi 10 klientu a rychlost rozdeloval dost nahodne....

No snad jsem to sepsal srozumitelne.