Zdravim
Teda musim se priznat absolutne jsem to s tema tridama nepochopil. No mozna je problem mezi klavesnici a zidli.
Zitra si to prectu jeste jednou.
Uvital bych stejny clanek o ESFQ. Pro neznale, ta rozdeluje aktualni rychlost linky podle zadanych pomeru mezi jednotlive uzivatele a rozdeluje to podle jejich IP adres. Takze staci nastavit treba 1:1 a je zaruceno ze vsichni dostanou stejny dil z celkove kapacity jako ti ostatni.
Zdenek
je to pomerne easy. vytvoris root triedu. v tejto triede vytvoris podtriedy, ktore su obmedzovane cez HTB podla zadanych parametrov. Potom este priradis sposob ako zachadzat s traficom (fifo, sfq) a tym mas vybudovanu infrastrujturu. Nasleduje vytvorenie pravidiel znackovania paketov a pravidiel forwardovania paketov do jednotlivych tried na zaklade znacky. a treba dufat ze to bude fachat. viac hladaj na www.latrc.org
Urcite to jde. Staci v kernelu (ted mluvim o rade 2.6, ale jinde by to mohlo byt tez) zapnout CONFIG_IP_NF_MATCH_OWNER (v nastaveni Netfilteru) a pak to pomoci iptables filtrovat jako by se jednalo o jine bezne kriterium. Nikdy jsem to ale nezkousel... :-(
Jo, a samozrejme to funguje jen lokalne, protoze router (jiny pocitac) nemuze vedet, ktery proces nebo uzivatel packet vygeneroval...
Pěkný článek. Akorát se přiznám bez mučení, že jsem všechno nevstřebal.
Prosím o jeden názorný příklad - mějme dva klienty, kteří "odebírají" traffic 256 kibit. Dohodnou se, že si chtějí půjčovat nevyužitou kapacitu. Jak by se toto nastavilo - tedy aby měli oba zajištěnou rychlost 256 kibit, ale aby si mohli současně "půjčovat" kapacitu toho druhého pokud je zrovna volná ?
Podle článku na linuxzone si toto dokážu představit nastavené v CBQ. To mi ovšem všichni rozmlouvají, protože je CBQ údajně neschopné přesně dělit tak vysoké rychlosti a taky prý nespolehlivé.
Předem díky.
Mozna bych pro lepsi prehlednost doporucil script htb.init ( http://sourceforge.net/projects/htbinit ). Je to v nem celkem popsane a strom se vytvari pomoci jednotlivych souboru.
a k zadani: 2*256 = 512, takze radky pro tc budou vypadat uplne stejne jako v clanku, akorat se zmeni hodnoty.
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 512kbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 256kbit ceil 512kbit
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 256kbit ceil 512kbit
Dale uz je to uplne stejne (filtry, sfq)
S IMQ jsem si pohraval, kdyz jsem se snazil nejak vic primo shapovat ingress, ale problem byl v tom, ze tohle virtualni rozhrani existovalo (mam pocit) jeste nekde pred "routing decision" (tedy nekde tesne za PREROUTING) a proto neslo filtrovat packety podle cilove adresy, ale jen podle napr. portu nebo podobne.
Jsou to ale jen takovy mlhavy vzpominky, takze je klidne mozny, ze jsem se tehdy jen nekde poradne zkouril a cely se mi to zdalo... :-)))
Jen upresnim to filtrovani podle cilove adresy prichozich packetu - to samozrejme jde, problem, o kterem mluvite, zrejme spocival v tom, ze jste pouzival SNAT, a rozliseni neslo udelat, neb v dobe, kdy se udelat melo, jeste nebyla cilova adresa prichoziho packetu prepsana na puvodni zdrojovou dane konexe.
Toto lze obejit pomoci modulu iptables connmark, kterym lze konexim prirazovat identifikatory, nebo (primocareji) modulem conntrack, kterym lze matchovat kteroukoliv polozku v tabulce ip conntracku (jde o zobecneni znameho matche 'state', ktery umi rozhodovat pouze podle toho, zda zaznam je NEW, ESTABLISHED apod.)
Nejsem sice autor, ale tady neco je. Neco to dela, i kdyz ani sam velky autor (ja) negarantuje uplne presnou funkcnost, ale treba mi to nekdo pomuze vyladit. Je to pro firmu o dvou pobockach, na firewallu bezi samba server (nepodstatna data, hlavni server je samozrejme zvlast).
---
#!/bin/sh
#
# chkconfig: - 11 89
# description: Single -- purpose settings of tc to firewall
DEV=eth0
start () {
echo -n "Starting QoS tc.init: "
# Vytvorit hlavni disciplinu:
tc qdisc add dev $DEV root handle 1: htb default 2
# Internetovy provoz:
tc class add dev $DEV parent 1: classid 1:1 htb rate 128kbit ceil 128kbit
# Intranetovy traffic:
tc class add dev $DEV parent 1: classid 1:2 htb rate 100Mbit ceil 100Mbit
# Pro prodejce:
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 64kbit ceil 120kbit
# Druha pobocka:
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 48kbit ceil 128kbit
# Zbytek:
tc class add dev $DEV parent 1:1 classid 1:12 htb rate 16kbit ceil 96kbit
# Vyberu a oznacim provoz
# !!! Pozor, vicekrat oznaceny packet si pamatuje posledni cislo !!!
iptables -t mangle -N internet
# Cely internet
iptables -t mangle -A internet -s ! 192.168.1.0/24 -j MARK --set-mark 3
# Terminal services tunelovane pres ssh
iptables -t mangle -A internet -p tcp -d 192.168.1.0/24 -s 192.168.1.20 --sport 3389 -j MARK --set-mark 2
# WWW tunelovane pres ssh
iptables -t mangle -A internet -p tcp -d 192.168.1.0/24 -s 192.168.1.20 --sport www -j MARK --set-mark 2
# 2 prodejci:
iptables -t mangle -A internet -s ! 192.168.1.0/24 -d 192.168.1.108 -j MARK --set-mark 1
iptables -t mangle -A internet -s ! 192.168.1.0/24 -d 192.168.1.101 -j MARK --set-mark 1
# Toto nevim, co znamena :)
iptables -t mangle -A POSTROUTING -o eth0 -j internet
# No a tady si nastavim, ktere ze to toky maji kam tect:
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 2 fw classid 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
echo Ok.
}
stop () {
echo -n "Stopping QoS tc: "
# Smazat vse:
tc filter del dev $DEV prio 3
tc filter del dev $DEV prio 1
tc qdisc del dev $DEV root
iptables -t mangle -F
iptables -t mangle -X internet
echo Ok.
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: tc.init {start|stop}"
RETVAL=1
esac
exit $RETVAL
---
Treba to nekomu pomuze a treba mi to nekdo opravi. :)
Fakt skvelej clanek!!! GOOD WORK!!!
Kdybych cetl neco takovyho driv, usetrilo by mi to more casu!!! Jsou to sice jen zakladni veci, ale myslim ze to musi pochopit snad kazdej.
Thanx,
Phill
BTW kdyby nekdo chtel nakej priklad na htb, piste na phill@seznam.cz, nebo ICQ:69193789. Neco tu mam.
Před časem jsem u nás testoval HTB. Snažil jsem se na ethernetu nastavit 3 datové toky, které by se rovnoměrně dělily o 128kbit. Při testování ale docházelo k zajímavé věci. Při stahování (např. z ftp) rychlost oscilovala. Průběh připomínal pilu - v pravidelných intervalech cca. 5-10 vteřin se rychlost skokem snížila a pak pomalu rosla, zase snížila... Průměrná efektivní rychlost ale odpovídala stanoveným požadavkům. To se dělo, i když jsme to testovali při stahování jenom v jednom toku. Pak jsem zkusil udělat i konfiguraci, kdy jsem se snažil udělat omezení jenom jenom jednoho toku na určitou rychlot (klasický shaping). I tady se oscilace projevila. Zkoušel jsem si hrát s dalšími parametry HTB, ale nemělo to moc vliv. Jedině, když jsem změnil omezení rychlosti z 128kbit na 1Mbit, pak to fungovalo O.K. Z toho jsem vyvodil, že to funguje bez pilového efektu až na vyšších rychlostech. Vrátil jsem se tedy ke klasickému shaperu, který tímto neduhem netrpí, ale nelze tam nastavit spoustu věcí, kvůli kterým se mi líbilo právě HTB. Bohužel už nemám konfigurační soubory k HTB, které jsem používal. Takže mám dotaz, jestli má někdo s HTB podobné zkušenosti jako já. Pokud to máte někdo HTB uchozené na menší rychlosti (64kbit, 128...) bez pilového efektu, poslete mi prosím vaši konfiguraci HTB.
Zkuste zmenit hodnotu casovace jako zdroj pro
scheduler hodnotu PSCHED_CPU definuje se v souboru:
/usr/src/linux/include/net/pkt_sched.h
jako:
#define PSCHED_CLOCK_SOURCE PSCHED_CPU
ale pozor procesor musi podporovat registr
Time Stamp Counter Register (rtdsc)- vetsinou je na
Intel procesorech.
Vice na:
http://www.atm.tut.fi/list-archive/linux-diffserv/msg00441.html
Nebo
http://lugdunum2k.free.fr/shaped
Jestli vas procesor umi ten rtdsc registr muzete zjistit timhle programkem:
/**
** Read the tsc (time-stamp counter) register of the processor.
**
** @return the rtc register
*/
#include <linux/types.h>
static __inline u_int64_t rdtsc(void)
{
#ifdef __i386__
u_int64_t rv;
__asm __volatile(".byte 0x0f, 0x31" : "=A" (rv));
#endif
#ifdef __alpha__
int rv;
__asm __volatile("rpcc %0" : "=r" (rv));
#endif
return rv;
}
main ()
{
long long rc1;
rc1=rdtsc();
printf("CPU RDTSC register (CLOCK COUNTER): %u\n",rc1);
}
Ja do toho teda vubec nevidim, ale z fyzikalniho hlediska by tu pilu mohl zpusobovat vypocet rychlosti, ktery je pouzit v tom programu, kterym to merite. Pokud shaper funguje zruba "poustim dokud muzu a pak zahazuju", tak je to vlastne takovy impulzni provoz. A pokud ten programek prumeruje rychlost za nejaky interval (coz nepochybne dela), tak mu tam pak vznika ta pila. Je jasne, ze shaper nema periodu 5-10 vterin, ale to muze byt nejaka interference periody shaperu a toho vaseho programku.
Je to uplne normalny, jav, len velkost tych zubov sa da dost omedzit rozumnym nastavenim hodnot, ako casto a presne ma prepocitavat tu rychlost...
Ako uz bolo spomenute nizsie, PS_SCHED to dokaze vylepsit...
Odporucam si pozriet stranky: www.docum.org, tam su ukazkove konfuguracie aj testy s grafmy a rozbormi.
Zkuste nastavit HTB_HYSTERESIS v sch_htb.c na 0.
Normalne je zavedena mala hystereze kvuli snizeni poctu prechodu mezi stavy rozhodovaciho stromu a tudiz snizeni narocnosti na ukor mirneho zvlneni toku.
Druha moznost je, jak jiz nekdo napsal, pouziti PSCHED_CLOCK_CPU (zejmena pro vyssi rychlosti).
devik
Řešení problému s omezením kvality jen internetu vidím v oklasifikování na základě směrovací tabulky jak je možné nastudovat z originálu tady:
http://www.ds9a.nl/lartc
Uvádím zde volný překlad:
Oklasifikujeme na základě výsledku ze směrovací tabulky. Když paket projde směrovací tabulkou je označen směrovacím filtrem.
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 route
Zde je přidán směrovací filtr ke kořenu 1:0 s prioritou 100. Když se rozdoduje o zařazení paketu (a to je hned na začátku - kořen), je brána v úvahu směrovací tabulka routing table. Když je nalezeno směrovací pravidlo (Internet!!) tak je paket označen i správnou třídou a je mu dána i správná priorita.
Aby to fungovalo přidáme i směrovací záznamdo směrovací tabulky. Trik spočívá v definování "realm" kralovství dle cílové adresy:
# ip route add Host/Network via Gateway dev Device realm RealmNumber
Například můžeme definovat cílovou síť 192.168.10.0 s realm 10:
# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10
Když přidáváme smerovací filtry, tak můžeme použít království 'realm' jako siť a specifikovat jak směrování se napojí na filtry:
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 route to 10 classid 1:10
Toto pravodlo řiká že paket přicházející ze sítě 192.168.10.0 bude ve třídě class id 1:10.
Pak pěkně ořežeme dle již uvadených HTB tříd klienta a je to.
Pekny clanek. ALe mel bych dotaz na autora. Lze zajistit vypujcovani mezi jednotlivymi rozhranimi? Modelova situace: mam link 1Mb/s a chci ho rozdelit mezi dve podsite (eth0, eth1) tak, aby 512kb/s mela jedna a 512kbit/s druha, ale vzajemne si mohli pujcovat. Napada me pouze reseni pomoci IMQ. Pokud by se autor mohl zminit i o IMQ bylo by to fajn.
Zdar,
jeste ze me kolega upozornil na tento clanek o HTB jinak bych o nem snad ani nevedel. Pokusim se odpovedet na caste dotazy zde.
Shaping pres vice rozhrani - ano je treba IMQ, proto jsem ho puvodne napsal nez mi ho vyfouk Patrick ;-)
HTB vs. CBQ viz http://luxik.cdi.cz/~devik/qos/htb/htb3perf/cbqhtb3perf.htm . Kdyz jsem zadal o vlozeni do mainstream kernelu musel jsem dokazat ze to umi vse co CBQ ale lepe. Krom unbounded rezimu se to myslim podarilo.
SFQ a ESFQ - samo o sobe neresi fair queuing nebot je work-conserving, musi k tomu byt CBQ nebo HTB (ktere vytvori frontu). Navic je tam docela dost kolizi (pouze 1024 hash entries AFAIK) i kdyz perturn docela pomuze.
devik, HTB author
Pekny clanek, snad bych doplnil jen par nepodstatnych detailu:
TCP protokol je celkem slusny moloch, ktery je navrzen v prvni rade pro spolehlivy a az v druhe rade efektivni prenos. Rychlost prenosu je regulovana nekolika parametry jejichz hodnoty jsou odvozovany z rady ukazatelu o kvalite prenosove trasy, vypocitavanych periodicky behem prenosu.
Dnesni TCP protokoly nezacinaji posilat data nejvyssi moznou rychlosti, ale zhruba stejnou rychlosti, jakou dochazi potvrzeni od druhe strany. Funguje to tak, ze vysilajici strana neposila hned tolik dat, kolik se prijmajici strana vychlouba, ze muze prijmout, naopak, nasadi pomerni nizky limit, ktery ale postupne zvysuje az do velikosti okna udavaneho prijmajicim. Tomuto algoritmu se rika slow start. Limitu na strane vysilajiciho, ktery omezuje okno prijmajiciho se rika congestion window a predstavuje nastroj pro rizeni toku vysilanych dat na strane vysilace. Tento limit vyjadruje odhad zahlceni site vysilajicim. [RFC2001]
Vysledkem je, ze TCP postupne zrychluje dokud se zda linka kvalitni a pomerne drasticky zpomaluje kdyz dochazi ke ztrate paketu.
Traffic shaping, jak nazev napovida, je o tvarovani toku, tedy nedochazi k zahazovani paketu jak pise autor, ale k jejich ukladani do front, pricemz k zahazovani paketu dochazi az kdyz neni misto ve fronte. Timto zpusobem je mozne tvarovat libovolne toky, jde jen o to, jestli to pro ne dava smysl. S tim jak se prodluzuje delka fronty roste doba prenosu paketu a tedy fakt, ze TCP zpomali prenos je dan primarne tim, ze potvrzeni, ktera prichazeji od prijmajiciho potvrzuji data v mnozstvi zhruba odpovidajicimu nastavenemu limitu toku.
Jiny zpusob rizeni provozu se nazyva traffic policing, ktery byva spojen s prubeznym merenim velikosti toku a znackovanim paketu, ktere presahuji limity. Ty jsou pak prenosovou trasou zahazovany bud rovnou, pripadne prednostne :-)
Efekt pro TCP je trochu jiny, protoze dochazi ke ztrate paketu, coz v TCP protokolu vyvolava reakci na zahlceni site, pri kterem se pomerne drasticky zpomaluje a pomalu (linearne oproti exponencialnimu narustu u slow start) se zvysuje rychlost vysilani.
Tedy v kontextu "zahazovanim paketu prinutime TCP zbrzdit" je vhodne se zminit o obsluzne strategii RED (Random Early Drop), ktera jako by byla TCP sita na miru. Tato strategie nahodne zahazuje pakety s pravdepodobnosti, ktera roste s tim, jak se velikost toku blizi nastavenemu limitu.
Nicmene clanek byl samozrejme o HTB, takze nema smysl zbytecne odbihat o tematu :-)
K tomu bych jen dodal, ze DROP packetu je az ta nejzassi moznost. Naopak, podivam-li se na statistiku, pak vidim, ze:
class cbq 10:1 parent 10: leaf 8001: rate 128Kbit (bounded) prio no-transmit
Sent 5600201704 bytes 5499392 pkts (dropped 0, overlimits 13399024)
borrowed 0 overactions 1278383 avgidle 179877 undertime 0
A to je casto hodne skrceny (linka je nekolikanasobek teto tridy) - presto k zahazovani nedochazi, vyrovna se s tim TCP sam pomoci potvrzovaciho mechanismu...
HTB uz pouzivam dlhsiu dobu a funguje to fakt super. V pravidlach mam nahodenych okolo 70 tried a bezi to bez problemov :) Pouzivam htb.init skript (z par vlastnymi upravami). Jediny problem co som mal na zaciatku bol v nastaveni fronty fronty v SFQ (viz www.docum.org) co sposobovalo spatnu interaktivitu ...
Autor clanku naznacil problematiku oddelenia shapingu intranet a internet. Je to dost dolezita vec v nasadeni kedy je router puzivany aj ako mail server, www, proxy alebo router medzi segmentmi intranetu pretoze v uvedenom priklade je intranet trafic je klasifikovany ako internet ak ked sa 10 uzivatelov rozhodne stahovat maily atd. je ta prevadzka klasifikovana ako internet a napriek tomu ze mam prave prazdnu linku, stranky sa mi budu natahovat minuty ... Ale uz sa tesim na dalsi diel tohoto clanku :)
Nejak nemuzu rozchodit HTB v navaznosti na IPTABLES. Pekety (pravdepodobne) omarkuju a potom se jes nazim tridit pres tc. Nicmene nejak toto nefachci protoze vzdy se dostanu do defaultni tridy a to je na kocku. prikladam zde skriptik kteery sem vcera vnosi spachal a nechodi mi to podle nej.
Kdyz zmnenim tridici proavidlo v tc a tridim podle u32 dle cilove ip (ne dle znacky), tak to vypada ze to vsecko fachci alepson pro download. Nicmene ja potrebuju alepson UPLOAD do inetu znackovat bo sit bude za maskaradou.
Diky za kazdou pomoc , uz sem z toho upne off . Sedim nad tim asi 2 dny.
#!/bin/sh
# **************************** Definice parametru ****************************
TC=/sbin/tc
IPTABLES=/usr/local/sbin/iptables
INET_IFACE=eth0
LAN_IFACE=eth1
INET_SPEED_UPLOAD=500Kbit
INET_SPEED_DOWNLOAD=900Kbit
GARANCE1=32Kbit
GARANCE2=64Kbit
GARANCE3=128Kbit
GARANCE4=256Kbit
MAXIMUM1=32Kbit
MAXIMUM2=64Kbit
MAXIMUM3=128Kbit
MAXIMUM4=256Kbit
BURST=32k
USER1=10.154.83.2 #Uzivatel 1
USER2=172.20.20.70 #Uzivatel 2
USER3=10.154.83.4 #Uzivatel 3
USER4=10.154.83.5 #Uzivatel 4
USER5=10.154.83.6 #Uzivatel 5
USER6=10.154.83.7 #Uzivatel 6
USER7=10.154.83.8 #Uzivatel 7
USER8=10.154.83.9 #Uzivatel 8
USER9=10.154.83.10 #Uzivatel 8
USER10=10.154.83.11 #Uzivatel 10
# **************************** Definice parametru ****************************
############################## DOWNLOAD ############################
# Smazani vsech qdiscu na LAN interfacu
$TC qdisc del dev $LAN_IFACE root >/dev/null
# Pridani ROOT tridy na LAN interface
$TC qdisc add dev $LAN_IFACE root handle 1:0 htb default 20
#Nastaveni rychlosti tridy dle rychlosti pripojeno do internetu
$TC class add dev $LAN_IFACE parent 1:0 classid 1:1 htb rate $INET_SPEED_DOWNLOAD burst $BURST
#Nastaveni rychlosti trid na LAN rozhrani
$TC class add dev $LAN_IFACE parent 1:1 classid 1:11 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 1
$TC class add dev $LAN_IFACE parent 1:1 classid 1:12 htb rate $GARANCE1 ceil $MAXIMUM4 burst $BURST #Klient 2
$TC class add dev $LAN_IFACE parent 1:1 classid 1:13 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 3
$TC class add dev $LAN_IFACE parent 1:1 classid 1:14 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 4
$TC class add dev $LAN_IFACE parent 1:1 classid 1:15 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 5
$TC class add dev $LAN_IFACE parent 1:1 classid 1:16 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 6
$TC class add dev $LAN_IFACE parent 1:1 classid 1:17 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 7
$TC class add dev $LAN_IFACE parent 1:1 classid 1:18 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 8
$TC class add dev $LAN_IFACE parent 1:1 classid 1:19 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 9
$TC class add dev $LAN_IFACE parent 1:1 classid 1:20 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 10
# ******************** Markovani paketu **************************************
# Oznaceni paketu dle cilove IP adresy
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -j ACCEPT
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER1 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER2 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER3 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER4 -j MARK --set-mark 4
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER5 -j MARK --set-mark 5
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER6 -j MARK --set-mark 6
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER7 -j MARK --set-mark 7
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER8 -j MARK --set-mark 8
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER9 -j MARK --set-mark 9
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -d $USER10 -j MARK --set-mark 10
# Trizeni paketu do pridelenych trid
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 1 fw flowid 1:11
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 2 fw flowid 1:12
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 3 fw flowid 1:13
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 4 fw flowid 1:14
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 5 fw flowid 1:15
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 6 fw flowid 1:16
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 7 fw flowid 1:17
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 8 fw flowid 1:18
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 9 fw flowid 1:19
$TC filter add dev $LAN_IFACE parent 1:0 protocol ip handle 10 fw flowid 1:20
############################## UPLOAD ############################
# Smazani vsech qdiscu na INET interfacu
$TC qdisc del dev $INET_IFACE root >/dev/null
# Pridani ROOT tridy na LAN interface
$TC qdisc add dev $INET_IFACE root handle 1:0 htb default 20
#Nastaveni rychlosti tridy dle rychlosti pripojeno do internetu
$TC class add dev $INET_IFACE parent 1:0 classid 1:1 htb rate $INET_SPEED_UPLOAD burst $BURST
#Nastaveni rychlosti trid na INET rozhrani
$TC class add dev $INET_IFACE parent 1:1 classid 1:11 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 1
$TC class add dev $INET_IFACE parent 1:1 classid 1:12 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 2
$TC class add dev $INET_IFACE parent 1:1 classid 1:13 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 3
$TC class add dev $INET_IFACE parent 1:1 classid 1:14 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 4
$TC class add dev $INET_IFACE parent 1:1 classid 1:15 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 5
$TC class add dev $INET_IFACE parent 1:1 classid 1:16 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 6
$TC class add dev $INET_IFACE parent 1:1 classid 1:17 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 7
$TC class add dev $INET_IFACE parent 1:1 classid 1:18 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 8
$TC class add dev $INET_IFACE parent 1:1 classid 1:19 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 9
$TC class add dev $INET_IFACE parent 1:1 classid 1:20 htb rate $GARANCE1 ceil $MAXIMUM1 burst $BURST #Klient 10
# ******************** Markovani paketu **************************************
# Oznaceni paketu dle cilove IP adresy
$IPTABLES -t mangle -A POSTROUTING -o $LAN_IFACE -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER1 -j MARK --set-mark 11
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER2 -j MARK --set-mark 12
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER3 -j MARK --set-mark 13
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER4 -j MARK --set-mark 14
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER5 -j MARK --set-mark 15
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER6 -j MARK --set-mark 16
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER8 -j MARK --set-mark 18
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER9 -j MARK --set-mark 19
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $USER10 -j MARK --set-mark 20
# Trizeni paketu do pridelenych trid
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 11 fw flowid 1:11
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 12 fw flowid 1:12
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 13 fw flowid 1:13
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 14 fw flowid 1:14
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 15 fw flowid 1:15
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 16 fw flowid 1:16
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 17 fw flowid 1:17
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 18 fw flowid 1:18
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 19 fw flowid 1:19
$TC filter add dev $INET_IFACE parent 1:0 protocol ip handle 20 fw flowid 1:20
Nečetl jsem to celé, ale zdá se mi, že jeden jasný problém jsem zachytil: máte tam nejdřív iptables -j ACCEPT, a potom přidáváte pravidla s akcí iptables -j MARK. ACCEPT ale ukončí zpracovávání pravidel v daném chainu, takže na ta další pravidla s označováním paketu už vůbec nedojde.
Rád bych se zeptal na rozdělení rychlosti mezi dvěma třídami
$tc qdisc add dev eth0 root handle 1: htb default 30
$tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit
$tc class add dev eth0 parent 1:1 classid 1:20 htb rate 512kbit ceil 1024kbit prio 1
$tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 1000 fw classid 1:20
$iptables -A FORWARD -i eth2 -t mangle -p tcp -d 192.168.1.10 -j MARK --set-mark 1000
$tc class add dev eth0 parent 1:1 classid 1:30 htb rate 512kbit ceil 1024kbit prio 1
$tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 1001 fw classid 1:30
$iptables -A FORWARD -i eth2 -t mangle -p tcp -d 192.168.1.12 -j MARK --set-mark 1001
Když začne stahovat data počítač 192.168.1.12 tak se rychlost vyšplhá až na 110 KB/s. Což je v pořádku, ale když ještě přidám aby stahoval klient 192.168.1.10 tak jeho rychlost se vyšplhá jen asi na 10 KB/s (což už asi není dobře). Když klient 192.168.1.12 ukončí stahování tak u klientu 192.168.1.10 rychlost pomalu narůsta.
Může mi někdo vysvětlit proč?
Kamil
Napada me jenom, ze by to mozna mohlo byt tim, ze prichozi linka je 1024kbit, takze se fronta packetu tvori u providera, a ne na Vasem firewallu. Zkusil bych shapenout prichozi traffic treba na 1000kbit a tridy bych nechal po 500kbitech. (Ale ruku do ohne bych za to nedal.)
Mam taky problem, najprv som skusal skompilovat iproute2 balicek, ale ten vykazal problem hned pri prvom kompilovani. Kernel som pouzil 2.4.22
root@firewall:~/iproute2-old# make
make[1]: Entering directory `/root/iproute2-old/lib'
gcc -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g -I../include-glibc -I/usr/include/db3 -include ../include-glibc/glibc-bugs.h -I/usr/src/linux/include -I../include -DRESOLVE_HOSTNAMES -c -o ll_map.o ll_map.c
In file included from ../include-glibc/netinet/in.h:7,
from ll_map.c:19:
/usr/src/linux/include/linux/in.h:140: field `gr_group' has incomplete type
/usr/src/linux/include/linux/in.h:146: field `gsr_group' has incomplete type
/usr/src/linux/include/linux/in.h:147: field `gsr_source' has incomplete type
/usr/src/linux/include/linux/in.h:153: field `gf_group' has incomplete type
/usr/src/linux/include/linux/in.h:156: field `gf_slist' has incomplete type
make[1]: *** [ll_map.o] Error 1
make[1]: Leaving directory `/root/iproute2-old/lib'
make: *** [all] Error 2
root@firewall:~/iproute2-old#
tak som pouzil kernel 2.4.20 a tam uz tc slo skompilovat v pohode. Ked som vsak tc skompilovat vyhodilo to dalsiu chybu pri pokuse nahodit HTB na eth0 interface
root@firewall:~/iproute2-old/tc# ./tc qdisc add dev eth0 root handle 1:0 htb default 14
Unknown qdisc "htb", hence option "default" is unparsable
root@firewall:~/iproute2-old/tc#
dokaze mi niekto poradit, co som bud zrobil zle, alebo co by sa s tym dalo spravit???