LINUX @ JEZGRA.NET

Linux experts @ work

QOS that Worqs (HTB)
Zadnje modificirano na: 15/10/2010 @ 5:57 pm

AUTOR: DARKMAN

QoS mi je uvjek bila velika zagonetka. Procitao sam toliko literature i uvjek su neke stvari pre-komplicirane i ne-dorecene. Probao sam masu skripta da odgonetnem kako bi se moglo sto izvesti i napokon sam dosao do jedne jednostavne skripte koja radi.

Sad jos samo stoji da vama objasnim tu skriptu pa da je dodatno zakompliciram jer u trenutnoj formi je ona najednostavnija.

HTB se bazira na principu FIFO (first-in — first-out).
Potrebno ga je imati u linux kernelu ili patchirati kernel ako je verzija ispod 2.4.20

U ovom tutorijalu pokusat cu objasniti svaki dio u liniji koda ukljucujuci iptables (netfilter) pravila igre.

Evo moja jedna osnovna skripta koja trenutno radi na mojoj mrezi i koja je u nekom malom djelu uzeta iz jednog primjera pa je skroz promjenjena jer nije imao veze sa HTB nacinom.

#!/bin/bash
#
# Download Maximiser (Outbound Traffic Shaper for Asymmetric Broadband)
#
# Copyright DARKMAN (denis@denis.in)
# For linux.jezgra.net

## Konfiguracija (Obavezno promjeniti u ono sto vas sistem koristi)
IPT=”/usr/local/sbin/iptables”;     #Put do iptables
tc=”/usr/sbin/tc”;                  #Put do tc
ppp=”ppp0″;                         #ppp0? nekima je eth0 ako se ruter spaja na net ili eth+
##

## Ukloni prijasnji QoS ako postoji (jer ako samo pokrenete (a izmjenili ste fajl) nove postavke nece prekopirati stare)
$tc qdisc del dev $ppp root
##

## Odredimo “plafon” – maximum sto nasa konekcija (odlazna) moze dati
## UPOZORENJE: tc ima izvrnuti sistem naziva tako da je kbps = kilobytes a kbit znaci kilobits !
ceil=700kbit;
##

$tc qdisc add dev $ppp root handle 1: htb default 50
$tc class add dev $ppp parent 1: classid 1:1 htb rate $ceil
$tc class add dev $ppp parent 1:1 classid 1:10 htb rate $ceil ceil $ceil prio 0
$tc class add dev $ppp parent 1:1 classid 1:20 htb rate $ceil ceil $ceil prio 1
$tc class add dev $ppp parent 1:1 classid 1:30 htb rate 300kbit ceil $ceil prio 2
$tc class add dev $ppp parent 1:1 classid 1:40 htb rate 200kbit ceil 400kbit prio 3
$tc class add dev $ppp parent 1:1 classid 1:50 htb rate 100kbit ceil 500kbit prio 4

$IPT -t mangle -F POSTROUTING
$IPT -t mangle -F FORWARD
$IPT -t mangle -F OUTPUT

# Klasa 1:10 – MAX PRIO
class=”1:10″
$IPT -t mangle -A POSTROUTING -p tcp –syn -m length –length 40:68 -j CLASSIFY –set-class $class
$IPT -t mangle -A POSTROUTING -p tcp –tcp-flags ALL SYN,ACK -m length –length 40:68  -j CLASSIFY –set-class $class
$IPT -t mangle -A POSTROUTING -p tcp –tcp-flags ALL ACK -m length –length 40:100  -j CLASSIFY –set-class $class
$IPT -t mangle -A POSTROUTING -p tcp –tcp-flags ALL RST -j CLASSIFY –set-class $class
$IPT -t mangle -A POSTROUTING -p tcp –tcp-flags ALL ACK,RST -j CLASSIFY –set-class $class
$IPT -t mangle -A POSTROUTING -p tcp –tcp-flags ALL ACK,FIN -j CLASSIFY  –set-class $class

# Klasa 1:10 – MAX PRIO
class=”1:10″
$IPT -t mangle -A POSTROUTING -p udp –dport 53 -j CLASSIFY –set-class $class                  #DNS
$IPT -t mangle -A POSTROUTING -d xxxx.com -j CLASSIFY –set-class $class                            #bitno
$IPT -t mangle -A OUTPUT -p tcp –dport 8245 -j CLASSIFY –set-class $class                           #dyndns
$IPT -t mangle -A OUTPUT -d xxxx.com -j CLASSIFY –set-class $class                                        #bitno
$IPT -t mangle -A POSTROUTING -p icmp -j CLASSIFY –set-class $class                                     #ping
$IPT -t mangle -A POSTROUTING -p tcp –dport 22 -j CLASSIFY –set-class $class                  #SSH
$IPT -t mangle -A POSTROUTING -p tcp –sport 22 -j CLASSIFY –set-class $class                  #SSH
$IPT -t mangle -A FORWARD -m mark –mark 6 -j CLASSIFY –set-class $class                       #bitno

# Klasa 1:20 – IGRE
class=”1:20″
$IPT -t mangle -A POSTROUTING -p udp –sport 10000 -j CLASSIFY –set-class $class               #BF_BC2
$IPT -t mangle -A POSTROUTING -p tcp –dport 12000 -j CLASSIFY –set-class $class               #dizzy_sat
$IPT -t mangle -A POSTROUTING -p udp –dport 2302 -j CLASSIFY –set-class $class                #Look_Igra

# Klasa 1:30 – Bulk http, smtp
class=”1:30″
$IPT -t mangle -A POSTROUTING -p tcp –dport 80 -j CLASSIFY –set-class $class            #HTTP
$IPT -t mangle -A POSTROUTING -m mark –mark 2 -j CLASSIFY –set-class $class           #SMTP

# Klasa 1:40 – SKYPE
class=”1:40″
$IPT -t mangle -A POSTROUTING -m mark –mark 9 -j CLASSIFY –set-class $class           #SKYPE

$IPT -t mangle -F PREROUTING
$IPT -t mangle -A PREROUTING -j CONNMARK –restore-mark
$IPT -t mangle -A PREROUTING -s xxxx.com -j MARK –set-mark 6
$IPT -t mangle -A PREROUTING -p tcp –sport 3306 -j MARK –set-mark 6
$IPT -t mangle -A PREROUTING -m layer7 –l7proto skypeout -j MARK –set-mark 9          #SKYPE-MARK
$IPT -t mangle -A PREROUTING -m layer7 –l7proto skypetoskype -j MARK –set-mark 9              #SKYPE-SKYPE-MARK
$IPT -t mangle -A PREROUTING -m layer7 –l7proto socks -j MARK –set-mark 10            #SOCKS-KILL
$IPT -t mangle -A PREROUTING -p tcp –dport 25 -j MARK –set-mark 2                             #SMTP-MARK
$IPT -t mangle -A PREROUTING -j CONNMARK –save-mark

$IPT -I FORWARD -m mark –mark 10 -j DROP               #SOCKS ugasi kompletno

Znaci krenimo iz pocetka:

$tc qdisc add dev $ppp root handle 1: htb default 50

Znaci idemo objasniti klase gore ^:
1: je default klasa u koju cemo dodavati. U noj je specifirano da ce pod-klasa 50 imati default. To znaci da ce u tu klasu ici svi paketi koji nisu drugacije klasificirani! To je vazna stavka. Ako ovo krivo namjestite sve ostalo vam je za’vraga.
Takodjer se spomene i koji cemo “princip” koristiti a to je HTB nacin.

$tc class add dev $ppp parent 1: classid 1:1 htb rate $ceil

Dalje; Ovdje imamo prvu POD-klasu koja je default takodjer. Nju moramo oznaciti sa maximumom (tj 95% negdje od maximuma vaseg uploada na DSL-u). Ona ce nam biti “ceil” (=plafon=vrh).

$tc class add dev $ppp parent 1:1 classid 1:10 htb rate $ceil ceil $ceil prio 0

1:10 nam je prva sub klasa. E sad. Svi imamo drugacije prohtjeve ali najbolje je ovo ostaviti sa dva vrha. Znaci i rate i ceil da bude ma maximumu nase veze na internet. (Odlazne veze koja je specifirana u variabli $ceil negdje prije ovoga).
Ovdje zelite dodati DNS requestove, ACK/SYN pakete i slicno da maximalno iskoristite vas link. Nista drugo.

$tc class add dev $ppp parent 1:1 classid 1:20 htb rate $ceil ceil $ceil prio 1

Iduca klasa 1:20 je cist proizvod moje neke potrebe. Vi bi tu TREBALI oznaciti rate i ceil ali da ceil ipak ostane vrh jer vam je to prva klasa sa iducim najvecim prioritetom. Ovo je super klasa. Znaci ima sve sto i 1:10 MEDJUTIM ima prioritet 1 sto ga ipak stavlja direktno iza prve 1:10 klase. Znaci ajmo to gledati kao najbrzu klasu u koju cete staviti sve sto vam treba expresno.. mozda irc 6667 port ili HTTP, skype mozda? kome treba neka stavi stogod. Ova klasa ima meni maximum upload i maximum je rezervirana (rate) znaci jednostavno ce biti tik iza 1:10 klase ali ce 1:10 ipak imati veci prioritet, znaci ici ce prije klase 1:20.

Objasnimo to ovako. U klasi 1:10 imate DNS zahtjev i on se rijetko koristi a u klasi 1:20 imate skype. Neka (imaginarno) skype “popije” cijeli upload. Ipak ce DNS zahtjevi ici prije, tj “krasti” ce brzinu od skype klase.

$tc class add dev $ppp parent 1:1 classid 1:30 htb rate 300kbit ceil $ceil prio 2

Iduca klasa je klasa koja ima rezervirani upload od 300kbit-a i ima “plafon” na max.
Jako zgodno mjesto za sve sto vam je vazno da ima brzinu ali i dostupnost. Znaci AKO klasa 1:10 i 1:20 imaju viska, oni ce ponuditi svoj visak ovoj klasi ali 300kbit ce uvjek biti rezervirano. Ovdje ja u gornjoj skripti stavljam http. Znaci tipicno surfanje. Nelos prioritet i moze “srknit” vezu do maximuma ako joj prve dvije klase to dozvole. SMTP takodjer. Rijetko se salju mailovi ali bilo bi ok da se to priotizira u neki srednji maximum.

$tc class add dev $ppp parent 1:1 classid 1:40 htb rate 200kbit ceil 400kbit prio 3

Iduca klasa je prakticki klasa gdje ja u primjeru iz skripte trpam sav skype promet i SVE sto je oznaceno sa –mark 9 u PREROUTING-u. Znaci sve sto je oznaceno ulazi u ovu klasu. Klasa ima 200kbit rezervirano od ukupnog bandwidtha (znaci nikad nece moci imati manje od toga) i plafon od 400kbit. Plafon sam specifirao jer nerijetko imam zagusenje uploada bas ovim skype-om i kojekakvim njegovim video prijenosima. 400kbit je plafon i zapinjat ce sve iznad toga ali to nije moj problem. Neralno je ocekivati da netko moze imati video-konferenciju (tj. da je malo nebi se znalo kako se kaze) na sheranom internetu kojeg koristi vise (u ovom slucaj 300+)  korisnika. Nebitno na koliko DSL izlaza.

$tc class add dev $ppp parent 1:1 classid 1:50 htb rate 100kbit ceil 500kbit prio 4

Zadnja klasa je ona klasa sto smo je specifirali kao default. Preferabilno je da stavite sto manje rezerviranog mjesta i sto manji plafon. Medjutim posto ima zadnji prioritet moguce da to nije ni bitno. U ovu klasu ce vam upasti svi torrenti, sve sto prije niste oznacili drugacijim prioritetom, znaci sve sto vam je manje bitno ili skroz nebitno. Ja sam u primjeru stavio 100/500 ali cisto jer jos neznam sto upada u tu klasu. Mozda nesto sto nisam predvidio. Inace kad bi znao da je gornje specifirano SVE sto mi treba ovu klasu bi stavio 50/100 i to je to. Torrent mi je zadnje u zivotu sto mi treba.

Bitne stvari

  1. Rate je rezervirani promet. Suma svih rezerviranih prometa mora biti jednaka $ceil (plafon konekcije) ili manje.
  2. Ceil je plafon konekcije ili klase. Ako klasa ima plafon na 100kbit onda … ma kuzite.
  3. Nemojte brkati PREROUTING, POSTROUTING i sve izmedju !! (dolje cu vam objasniti sto je sto i zasto).
  4. kbps = kilobytes a kbit znaci kilobits u tc … Neznam zasto je to tako ali je krivo.
  5. Sve ovo preuredite po vasim zahtjevima. S ovim se mogu postici impresivne stvari koje cu dolje isto objasniti.

Malo mi je tesko objasniti sve odozgo iz skripte jer je namjenjena za moju mrezu (s tim da je xxxx.com zapravo moj drugi server koji je bitan jer tamo drzim bazu podataka koja mora biti instant dostupna). Ali objasnit cu gotovo sve sa daljnjim tekstom.

Impresivne stvari

$IPT -t mangle -A PREROUTING -s xxxx.com -j MARK –set-mark 6

U ovome (iz gorenje skripte) imamo neki server (domain name) koji mora imati MARK 6 sto po primjeru spada u klasu 1:20. Znaci iduca najbrza klasa. U ovom primjeru linije recimo to ovako; korisnik 1 vuce maximum download, korisnik 2 “dere” maximim upload. Znaci vasa veza je kompletno zakrcena, medjutim ipak ova stranica ce se otvoriti munjevito brzo! Uzet ce odlazni i dolazni (forward) prioritet od svih ostalih pod-klasa.

Razlika izmedju -t mangle PREROUTING, INPUT, OUTPUT, FORWARD te POSTROUTING tabela.

Vrlo je bitno znati u koju klasu ide koji promet!
Ukoliko neznate mozete napraviti gadne greske i misliti da ste napravili ispravno. Takodjer je bitno jeli vas server za internet (na kojemu ovo izvodite) ruta (ip_forward) promet ili NE. Ako ne, onda je to vase desktop racunalo, ako jest onda je to vas server. Razlika je ogromna. U primjeru DESKTOP racunala koristite POSTROUING, OUTPUT i INPUT. A u slucaju SERVER racunala koristite i PREROUTING i FORWARD pa i sve ostale!

Obrazlozenje:

Ja koristim FORWARD da bi korisnici (tj promet) koji prolazi/e kroz ovaj server ulazili u potrebne klase kad se radi o prioritiziranju prometa kojem je potrebno da ima i ODLAZNO i DOLAZNO. Znaci ako cete prioritizirati neku stranicu — (u primjeru navedeno kao xxxx.com) — onda to mora biti u FORWARD tabeli. Da se dobije maximum odlazno i maximum dolazno. Ako ste stavili samo u POSTROUTING onda je to samo odlazno. To ne znaci da cete staviti u FORWARD ista detaljnije .. Kao npr. neki port sa -p tcp –dport 80 jer je to beskorisno. Jer je vas odlazni port 80 a vas dolazni port nesto skroz random. Ukoliko je to desktop racunalo onda u INPUT i OUTPUT.

U kombinaciji sa L7 Filterom, mozete recimo napraviti slijedece impresivne stvari.

  • Staviti prioritet na vrstu dokumenta? .jpg? ili mozda .html? (html morat cete editirati default pattern u l7 jer ne radi)
  • Staviti prioritet na razne stranice koje su bitne. Gmail? Facebook? jezgra.net ? :)
  • U kombinaciji sa –rate-limit moguce da mozete zahvatiti cijelu konekciju te je “usporiti”
  • U kombinaciji sa –string mozete u gornjoj kombinaciji dodatno specifirati koje stranice ce biti brze.
  • U kombinaciji sa ipt_TIME mozete recimo odrediti koje ce stranice biti brze u koje vrijeme.
  • Mozete zapravo napraviti sve sto vam masta odredi.

Za svakog mreznog admina ovo je mozda najteza stvar za nauciti. Rad sa “tc” i “iptables” ali to TREBA znati!
Znanje vas ne kosta (ako citate ovo lol) a NEznanje vas moze kostati!

Ostavite se raznih komercijalnih smeca tipa “Mikrotik” i slicno. Nikad nista od vas ako se bavite time a neznate kako to radi! Nije tesko klikat po sucelju, a tesko je procitati komad literature…ccc..

Prihvacam sve izmjene ili dopune te ispravke svega navedenog. (yeah, kao da ce biti…ccc..).
Be good… i spalite svog admina.

Komentiraj
Share

One Response to “QOS that Worqs (HTB)”

  • r3ctor says:

    Pohvale za clanak!

  • Leave a Reply