HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 1 of 8
HOGYAN Packet Shaping A Gentoo Linux Wiki wikibıl HOGYAN Telepítési módok -- Portage -- Kernel és rendszerindítás -- Hálózat -- X-szel kapcsolatos -- Egyéb
Informatikai rendszerek, rendszergazdai szolgáltatások, adatmentés, adatbiztonság. digisoft.hu
Ez a leírás az angol nyelvő Gentoo Wiki-bıl lett átemelve.
Tartalomjegyzék
1 Bemutatkozás 2 A Megoldás 3 Elıfeltételek 4 Kernel 5 Szabályzási stratégia 6 Priorizálás 7 Iptables 8 A HTB megértése 8.1 Qdisc-ek 8.2 Classes (Osztályok) 8.3 Rates (Ráták) 8.4 Ceil 8.5 Bursts 8.6 Quantum 8.7 r2q 8.8 Prio 9 Az SFQ megértése 10 Iproute2 10.1 l7-filter 11 Tesztelés 11.1 Grafikonok 11.2 Feltöltési ráta beállítása 12 Hivatkozások
Válts ADSL szolgáltatót. Korlátlan ADSL 2990 Ft/hó+áfa Jelentkezz 2008. június 30.-ig. www.nordtelekom.hu
Usenet for Providers Usenet for Resellers and Providers. 160 days retention. Only Wholesale. News-Service.com/Usenet
Linux oktatás, tanfolyam Felhasználói és rendszergazdai szintő Linux tanfolyamok www.iqjb.hu
Windows Hotspot Software FirstSpot Wi-Fi Hotspot Management Software for Windows - Free Trial patronsoft.com/firstspot
Bemutatkozás Ahogy errıl beszélünk a peer-to-peer programok egyre népszerőbbek lesznek. Ezek a programok telítik az internet kapcsolatokat, és megnehezítik más forgalmakat átjutását a kapcsolaton keresztül. Ha egy felhasználó lefoglalja az egész sávszélességet, akkor az internet böngészés is könnyen kínszenvedéssé válhat. Olyan programok mint a bittorrent és más P2P kliensek többnyire a kapcsolatunk feltöltési részét telítik és bár a kliensek képesek limitálni a feltöltési sebességet, mégsem teszik mindig. A megoldás a forgalom szabályzás.
A Megoldás Mielıtt nekiállnánk elıbb megkell értenünk mi az a sorbanállás (queueing). Ez a magyarázat erısen leegyszerősített, de megérthetı benne az egész lényege. Felállásunk most egy 2048/128 sebességő internet kapcsolat, egy linuxos gép két ethernet kártyával, valamint egy hálózat néhány klienssel.
A DSL-modem belsı ip címe: 192.168.2.1 A linuxos gép ip címei: eth0 192.168.1.1, eth1 192.168.2.2 és 192.168.2.1 az átjáró A kliensek a következı címekkel rendelkeznek: 192.168.1.16, 192.168.1.17, 192.168.1.18 és 192.168.1.1 az átjárójuk (tehát a linuxos gép)
A következı folyamat játszódik le amikor egy kliens egy csomagot küld az internet felé:
A csomag elhagyja a klienst (192.168.1.16) A csomag megérkezik az átjáró eth0 interfészére (192.168.1.1) Az átjáró a csomagot átereszti és berakja a kimenı sorba (output queue) A csomag elhagyja az átjárót az eth1-en keresztül (192.168.2.2) A csomag megérkezik a DSL-modemre (192.168.2.1) A csomag belép a DSL-modem kimenı sorába A csomag elhagyja a DSL-modemet
Fontos, hogy megértsük ennél a lépésnél, hogy mi a különbség a sávszélesség és a késleltetés között. A késleltetés az az idıtartam amennyire szüksége van egy csomagnak ahhoz, hogy A pontból B pontba jusson. A szávszélesség pedig az az adatmennyiség amely A pontból érkezik B-be adott idı alatt. Tehát ha egy szótárat átvinnék a város másik végén lakó barátomhoz a sávszélességem jó lenne, de a késleltetésem elég rossz lenne (hogy pontosak legyünk, az utazással töltött idı). Azonban ha felhívnám a barátom telefonon és elkezdeném felolvasni neki a szótárt, a késleltetésem jó lenne, de a sávsélességem az elsı példánál is kevesebb lenne. Továbbá fontos megjegyezni, hogy a sávszélesség és a késleltetés nem kapcsolódnak közvetlenül. Ha ugyanannyi idıbe kerülne nekem felolvasni a szótárt, mint átutazni vele a városon, akkor a sávszélességem mindkét esetben ugyanannyi lenne. Azonban a késleltetés nem változna meg! Vissza a DSL-modem példához. Ahogy már tudjuk a DSL-modem feltöltési sebessége csak 128kbit. Ez azt jelenti, hogy a modem másodpercenként csak 128kbits adatot képes küldeni (sávszélesség). Ha az átjáró ennél több adatot küld, akkor azok egy vonalban a kimenı sorba kerülnek és kivárják a sorukat míg elküldésre kerülnek, létrehozva egy várólistát. Ekkor az történik, hogy a DSL modem kimenı sora megtelik. Ha egy csomagnak 5 másodpercre van szüksége, hogy a sor legaljáról a legtetejére kerüljön, akkor a késleltetésünk 5 másodperc lesz. Ez rosz az interaktivitásnak. Mivel nincs befolyásunk a DSL-modem mőködésére ezért a sort a DSL-modemrıl elıre kell hoznunk a linuxos gépre. A linuxos gépen az eth1 kimenı sebességét lecsökkentve a DSL-modem feltöltési sebességénél kicsivel alacsonyabbra, elérhetjük, hogy a csomagok a linuxos gépen kerülnek a várakozósorba mielıtt átkerülnének a DSL-modemre, amelynek így üres lesz a kimenı sora, tehát a beesı csomagokat remélhetıleg rögvest kézbesíteni tudja az Internet felé. Amint a várólista sor átkerül a linuxos gépre, képesek leszünk beavatkozni, képesek leszünk szabályozni.
Elıfeltételek Nos sokmindenre nem lesz szükségünk. Egy számítógép amelyen fut gentoo/linux, és kettı hálózati csatolóval rendelkezik. A szerzınek sikerült gond nélkül futtatnia egy 200 MHz-es gépen és úgy gondolja ennél lassabb is képes megbírkózni a feladattal.
Kernel Figyelem: (Nem optimális) A legtöbb említett elıfeltétel nem biztos, hogy mindenféleképpen szükséges, mert a beállításoktól és az egyedi igényektıl függenek.
Elıször is szerezd be a legutóbbi 2.4-es vagy 2.6-os kernelt és rakd a /usr/src könyvtárba, majd készíts egy szimbolikus linket róla /usr/src/linux néven.
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 2 of 8
Ha 2.4-es kernelt használsz, szükséged lesz a POM patchekre a http://netfilter.org/ oldalról, amivel meg kell foltozni a kernelt. A jelszó: cvs. (cvs-en keresztüli hozzáférés jelen pillanatban nem mőködik...) cvs -d :pserver:
[email protected]:/cvspublic login cvs -d :pserver:
[email protected]:/cvspublic co netfilter/userspace netfilter/patch-o-matic ./netfilter/patch-o-magic/runme extra
Ha kész vagy a patcheléssel, akkor még néhány módosítást kell eszközölnöd a kernelben. Ha az alábbi opció nem létezik, akkor alkalmazd a POM patchet mégegyszer. Linux Kernel Beállítás: Kernel 2.4 Networking options ---> QoS and/or fair queueing ---> [*] QoS and/or fair queueing <M> HTB packet scheduler <M> SFQ queue [*] QoS support [*] Rate estimator [*] Packet classifier API <M> Firewall based classifier [*] Traffic policing (needed for in/egress) IP: Netfilter Configuration ---> <M> Connection tracking (required for masq/NAT) <M> IP tables support (required for filtering/masq/NAT) <M> limit match support <M> MAC address match support <M> Packet type match support <M> netfilter MARK match support <M> Multiple port match support <M> TOS match support <M> random match support <M> recent match support <M> ECN match support <M> DSCP match support <M> AH/ESP match support <M> LENGTH match support <M> TTL match support <M> tcpmss match support <M> Helper match support <M> Connection state match support <M> Connection mark match support <M> Connection tracking match support <M> Unclean match support (EXPERIMENTAL) <M> Owner match support (EXPERIMENTAL) <M> Packet filtering <M> REJECT target support <M> MIRROR target support (EXPERIMENTAL) <M> Full NAT <M> MASQUERADE target support <M> REDIRECT target support <M> Basic SNMP-ALG support (EXPERIMENTAL) <M> Packet mangling <M> TOS target support <M> ECN target support <M> DSCP target support <M> MARK target support <M> LOG target support <M> CONNMARK target support <M> ULOG target support <M> TCPMSS target support <M> ARP tables support <M> ARP packet filtering <M> ARP payload mangling
Linux Kernel Beállítás: Kernel 2.6 (Ex. gentoo-sources 2.6.11-gentoo-r6) Device Drivers ---> Networking support ---> Networking options ---> QoS and/or fair queueing ---> <M> HTB packet scheduler <M> SFQ queue [*] QoS support [*] Rate estimator [*] Packet classifier API <M> Firewall based classifier [*] Traffic policing (needed for in/egress) [*] Network packet filtering (replaces ipchains) ---> IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) <*> Userspace queueing via NETLINK <*> IP tables support (required for filtering/masq/NAT) <*> limit match support <*> IP range match support <*> MAC address match support <*> Packet type match support <*> netfilter MARK match support <*> Multiple port match support <*> TOS match support <*> recent match support <*> ECN match support <*> DSCP match support <*> AH/ESP match support <*> LENGTH match support <*> TTL match support <*> tcpmss match support <*> Helper match support <*> Connection state match support <*> Connection tracking match support <*> Owner match support <*> Packet filtering <*> REJECT target support <*> LOG target support <*> ULOG target support <*> TCPMSS target support <*> Full NAT <*> MASQUERADE target support <*> REDIRECT target support <*> NETMAP target support <*> SAME target support <*> Packet mangling <*> TOS target support <*> ECN target support <*> DSCP target support <*> MARK target support <*> CLASSIFY target support <M> raw table support (required for NOTRACK/TRACE) <M> NOTRACK target support <*> ARP tables support <*> ARP packet filtering <*> ARP payload mangling
A beállítások kicsit máshova kerültek. Itt van, hogy engedélyezd. Linux Kernel Beállítás: Kernel 2.6.14 (és újabb)
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 3 of 8
Networking ---> Networking options ---> [*] Network packet filtering (replaces ipchains) ---> IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) <*> Userspace queueing via NETLINK <*> IP tables support (required for filtering/masq/NAT) <*> limit match support <*> IP range match support <*> MAC address match support <*> Packet type match support <*> netfilter MARK match support <*> Multiple port match support <*> TOS match support <*> recent match support <*> ECN match support <*> DSCP match support <*> AH/ESP match support <*> LENGTH match support <*> TTL match support <*> tcpmss match support <*> Helper match support <*> Connection state match support <*> Connection tracking match support <*> Owner match support <*> Packet filtering <*> REJECT target support <*> LOG target support <*> ULOG target support <*> TCPMSS target support <*> Full NAT <*> MASQUERADE target support <*> REDIRECT target support <*> NETMAP target support <*> SAME target support <*> Packet mangling <*> TOS target support <*> ECN target support <*> DSCP target support <*> MARK target support <*> CLASSIFY target support <M> raw table support (required for NOTRACK/TRACE) <M> NOTRACK target support <*> ARP tables support <*> ARP packet filtering <*> ARP payload mangling QoS and/or fair queueing ---> <M> HTB packet scheduler <M> SFQ queue [*] QoS support [*] Rate estimator [*] Packet classifier API <M> Firewall based classifier [*] Traffic policing (needed for in/egress)
Fordítsd le a kernel, telepítsd és bootold be.
Szabályzási stratégia Ha egy csomag beérkezik, az iptables segítségével több dolgot is tudsz csinálni vele. Álljon itt néhány példa, hogy mi alapján tudsz szabályozni:
Port Csomag méret Forgalom típusa
Mondjuk szeretnél a bittorrentnek alacsonyabb prioritást adni. Tudjuk, hogy a 6881-tól 6889-ig terjedı portokat használja. Iptables-szel könnyen nyomonkövethetjük ezt, de amint a felhasználó rájön, hogy ezeknek a portoknak alacsonyabb prioritásuk van, egyszerően átállítja a bittorrentet, hogy más portokat használjon. Nincs SEMMILYEN LEHETİSÉG arra, hogy megtudjuk a P2P programok milyen portokat használnak. A csomag méret alapján történı szabályzásnak is vannak elınyei. A kisebb csomagoknak magasabb prioritást tudsz adni, mint a nagyobb csomagoknak. Mivel sok adatot küldeni célszerő nagymérető csomagok formájában küldeni, nem meglepı, hogy a P2P programok is így tesznek. De ismét, a kliens megváltoztathatja az MTU értékét a kimenı interfészen, így kisebb csomagokat küldve megkerülheti a szabályzást. Amit igazából szeretnénk, az hogy felismerjük a csomagokat tartalmuk alapján. Szükségünk van arra, hogy az iptables belenézzen minden egyes csomagba és analizálja a tartalmát, hogy kiderítse vajon P2P programtól származik vagy sem. Jelenlegi állás szerint két projektrıl tudok, amely képes erre.
ipp2p http://www.ipp2p.org l7-filter http://l7-filter.sourceforge.net/
Mindkettı jó projekt, én csak a ipp2p-t használom. Eddig csak bittorrenten alkalmaztam és remekül mőködik. Lesd meg az utolsó részt bıvebb infókért vagy kövesd a linkeket.
Priorizálás Ebben a hogyanban négy prioritási szintet fogunk létrehozni: 1. 2. 3. 4.
Interaktív Egyéb Böngészés P2P
Interaktívat a kismérető csomagokhoz használjuk, amelyeknek nagyon alacsony késleltetésre van szükségük. Ilyen csomagok lehetnek például az icmp vagy ssh csomagjai. (ez magában foglalja a ACK-s TCP csomagokat is)
Egyebet azoknak a csomagoknak, amelyek egyik kategóriába se fértek be.
Böngészést azoknak a csomagoknak, amelyeknek alacsonyabb késleltetés szükséges a P2P csomagokénál, de nem igazán szabadna nagyobb prioritást élvezniük az ssh-nál. Ez lehet például http vagy smtp.
P2P-t a P2P programoknak illetve olyan programoknak, amelyek sok adatot akarnak feltölteni. Ezek a lehetı legkisebb prioritást kapják.
Jegyezzük meg, hogy például ha a P2P-nek alacsonyabb prioritást adunk mint a Böngészésnek, az nem jelenti azt, hogy a P2P kevesebb sávszélességet is kapna. Annyit jelent, hogy a rendszer elınyben részesíti a Böngészı csomagjait a P2P csomagjainál. Csak ha kitöltötted a feltöltési streamet, akkor rughat labdába a P2P a rendelkezésre álló sávszélességgel. Átgondolhatod, hogyan használod a hálózatodat és a prioritásokat annak megfelelıen definiálhatod, vagy megváltoztathatod a sorrendet, de ez a példa mindenféleképpen egy jó kiindulási alapot jelent.
Iptables Gondolom már nem okozok meglepetést, hogy iptables-re lesz szükségünk:
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 4 of 8
emerge net-firewall/iptables
Arra fogjuk használni az iptables-t, hogy megjelöljük a csomagokat a késıbbi szabályzás érdekében. Azonban elıbb egy alap NAT-os routert kell beállítanunk. Ez a beállítás egyátalán NEM biztonságos, ez csupán csak egy példa, amely bemutatja, hogyan állítsunk be NAT-ot: File: insecure_firewall.sh # Konstansok LOCALNET="192.168.1.0/255.255.255.0" # Policy beállítása (az alapértelmezett policy az ACCEPT, így nem igazán # van szükséged erre a részre, hacsak nem állítottad az alap policyt DROP-ra; # utóbbi NEM ajánlott más láncra kivéve az INPUT és FORWARD láncokra # a filter táblában és ESETENKÉNT az OUTPUT láncon) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P PREROUTING ACCEPT # Összes iptables iptables iptables iptables
tábla kiürítése -t filter -F -t mangle -F -t nat -F -t raw -F # (opcionális)
# Maszkolás iptables -t nat -A POSTROUTING -s $LOCALNET -o eth1 -j MASQUERADE iptables -A FORWARD -m state --state ESTABLISHED,RELATED -d $LOCALNET -j ACCEPT # Kernel forward engedélyezése echo 1 > /proc/sys/net/ipv4/ip_forward
Mégegyszer, nem igazán ajánlom, hogy a fenti scriptet használd. Csak a teljesség érdekében raktam be. Jobban teszed ha elolvasod a "Linux 2.4 alapos tőzfal tervezés"(jó a 2.6-os kernelhez is) leírást a gentoo.org-on, amely végigvezet egy megfelelıen biztosított tőzfal létrehozási folyamatán. Megjegyzés: A tőzfal tervezéses linket blokkolta a wiki spamfiltere, az eredeti oldalon megtaláljátok. A Shorewall pedig egy olyan csomag amely bekonfigurálja az iptables-t neked. Ajánlott ezt használni (vagy valami hasonlót) ha nem szeretnél könyékig turkálni az iptables szintakszisában. Következı lépés a csomagok megjelölése a prioritásokkal: File: marking_packets.sh MARKPRIO1="1" MARKPRIO2="2" MARKPRIO3="3" MARKPRIO4="4" # Prioritás jelek beállítása # Prio 1 # icmp iptables -t iptables -t # ssh iptables -t iptables -t # nem tcp iptables -t iptables -t
mangle -A FORWARD -p icmp -j MARK --set-mark $MARKPRIO1 mangle -A OUTPUT -p icmp -j MARK --set-mark $MARKPRIO1 mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1 mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1 mangle -A FORWARD -p ! tcp -j MARK --set-mark $MARKPRIO1 mangle -A OUTPUT -p ! tcp -j MARK --set-mark $MARKPRIO1
# Prio 2 # Prio 3 # http iptables iptables # https iptables iptables # smtp iptables iptables
-t mangle -A FORWARD -p tcp --dport 80 -j MARK --set-mark $MARKPRIO3 -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark $MARKPRIO3 -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark $MARKPRIO3 -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark $MARKPRIO3 -t mangle -A FORWARD -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3 -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3
# Prio 4 # packets > 1024 bytes iptables -t mangle -A FORWARD -p tcp -m length --length 1024: -j MARK --set-mark $MARKPRIO4 # bittorrent iptables -t mangle -A FORWARD -i eth0 -p tcp --sport 6881:6889 -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A FORWARD -i eth0 -p tcp --dport 6881:6889 -j MARK --set-mark $MARKPRIO4 # A kimaradt csomagokat pedig iptables -t mangle -A FORWARD iptables -t mangle -A FORWARD iptables -t mangle -A FORWARD
megjelöljük a -p tcp -m tos -p tcp -m tos -p tcp -m tos
TOS-nek megfelelıen ('''T'''ype '''O'''f '''S'''ervice) --tos Minimize-Delay -m mark --mark 0 -j MARK --set-mark $MARKPRIO1 --tos Maximize-Throughput -m mark --mark 0 -j MARK --set-mark $MARKPRIO2 --tos Minimize-Cost -m mark --mark 0 -j MARK --set-mark $MARKPRIO4
Magyarázatok és megjegyzések:
-t mangle: Szeretnénk módosítani (mangle) a csomagokat, azzal, hogy megjelöljük ıket. -A FORWARD/OUTPUT: A szabály láncok, amelyen a csomagok átutaznak. Az OUTPUT ahol a csomagok kilépnek ebbıl a gépbıl, míg a FORWARD amin keresztül más gépeknek küldünk csomagokat -p icmp: csak icmp csomagok (ugyanez tcp-re stb.) -p ! tcp: csomagok amelyek nem csak tcp-k. Jegyezzük meg, hogy az icmp sem tcp, most mégis külön kezeljük. Ez valójában szükségtelen, de növeli az olvashatóságot -dport 22: Egyezés (tcp, nyílvánvalóan) azokra a csomagokra amelyek a 22 portra mennek (cél port) -j MARK --set-mark $MARKPRIO1: -j jelöli azt a mőveletet amelyet alkalmazni akarunk, és a --set-mark jelzi az iptables-nek mivel jelöljön -m tos --tos ... : Egyezés a csomag tos-se szerint Megjegyzés: a TOS-rıl bıvebben olvashatsz itt: Type of Service
-m mark --mark 0: Egyezik azokra a csomagokra, amelyek még nem lettek megjelölve A mellékelt bittorrent példa valószínőleg nem fog úgy mőködni, ahogy kellene. Ezenkívül fixen bedrótozzuk az eth0 interfészt, hogy a DSL modem felıl 6881-6889 portokon érkezı átmenı forgalmat megjelöljük, azonban fontos megjegyezni, hogy a bittorrent nem mindig a 6881-6889 portokat használja. Nézd meg a layer7 és ipp2p programokat, velük könyebben megoldhatod ezt a problémát.
Alternatív módszer: CLASSIFY target Ahelyett, hogy a MARK célt használnánk a FORWARD vagy OUTPUT láncokon, használhatjuk helyette a CLASSIFY célt is a POSTROUTING láncban. A következı egy példa a kimenı ssh forgalom osztályozására (22-es port) a HTB 1:101 osztályba (magas prioritást jelent, ahogy késıbbiekben is láthatod ebben a hogyanban): iptables -t mangle -A POSTROUTING -p tcp --sport 22 -j CLASSIFY --set-class 1:101
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 5 of 8
Bıvebb információkat a CLASSIFY célról az alábbi hivatkozáson találhatsz: Iptables Tutorial: CLASSIFY Target
A HTB megértése Valójában mit is csinál a HTB? HTB egy rendszer, amely szétosztja a sávszélességet különálló sorokra. Fontos emlékezni arra, hogy a HTB azért készítették, hogy garantálja a sávszélességet, és NEM arra, hogy garantálja az interaktivitást. A HTB nem számolja a csomagokat, hanem byteokat számol! Ezért szükséges némi okoskodás, hogy kicsikarjuk belıle az interaktivitást. Álljon itt egy rövid magyarázat a belsı mőködésérıl.
Qdisc-ek Qdisc a Queue Discipline rövidítése, amely egy speciális stratégiát takar, amellyel a várósorokat lehet menedzselni. Egy sor a postán és egy sor a kórházban ugyanúgy sorok abban az értelemben, hogy "elemek" sorát alkotják, de a stratégia (vagy qdisc) amelyet a menedzselésükhöz használnak teljesen különbözıek. A legegyszerőbb qdisc a pfifo, amely egy sima FIFO tároló, amely nem végez feldolgozást, csak tárolást, amikor a hálózati csatoló leterhelt. Megjegyzés: r2q 1 Finally I understood the r2q value. I defined 'r2q 2'. And for the classes that gave me the warning I bound out that rate / r2q was < 1500. For this case I use 'quantum 1500'. In the other classes that had warning; rate / r2q was > 60000, so I use 'quantum 60000'.
Classes (Osztályok) Egy HTB Qdisc a csomagokat osztályokba rendezi szőrık segítségével. A mi példánkban szőrıként a megjelöléseket fogjuk használni. Minden osztály egy várólista, amely egy saját menedzsert használ (SFQ a példánkban). Úgy gondolhasz az osztályokra mint ajtókra, amin keresztől halad a sávszélesség. Be kell "terelned" a forgalmat a megfelelı ajtóba, amely limitálja majd azt a fajta forgalmat.
Rates (Ráták) A ráta az a sávszélesség mennyiség, amelyet egy qdisc garantál. Például egy ideális világban a 128kbit/s feltöltési ráta azt jelentené, hogy az internet szolgáltató (ISP) mindig legalább ennnyi sávszélességet ad nekünk, vagy többet ha elérhetı
Ceil "Ceil" (Bandwidth Ceiling) az a maximum sávszélesség mennyiség amivel egy qdisc rendelkezhet. Az elızı példa folytatásaként, egy valós világban, a 128kbit/s "feltöltési ráta" valójában azt jelenti, hogy az ISP beállított egy limitet, a maximum szávszélességet amelyet használhatunk, még ha több is elérhetı lenne.
Bursts Megjegyzés: A "burst" afféle kitörést jelent az angol nyelvben. Talán úgy fordítanám, hogy "megszalad, túlszalad", azonban a fordításban az eredeti kifejezést fogom használni. Két féle burst létezik - burst, és cburst. A "burst" olyan bájtban megadott mennyiség, amennyivel egy qdisc túlléppheti a rátáját, míg a "cburst" ugyanezt jelöli, csak a ceil túllépésekor. A http://lartc.org/manpages/tc-htb.html oldalon eléggé szőkszavúan magyarázzák. Azt mondják, hogy a burst az, hogy hány bájt küldhetı azután, hogy egy osztály elérte a ceil-t, túllépve a beállított rátát. Megjegyzés: Hogy lehet ez? Hiszen a ceil magasabb érték a rátánál, tehát már alapból gyorsabban küldünk adatokat a rátánál. Vagy tévedek? A burst az a bájt mennyiség, amelyet az osztály számára engedélyezünk, hogy a ceil sebességén küldjön. Fontos emlékezni arra, hogy a ceil egy "ráta" tehát bytes/sec-ben mérik, míg a burst egy bájtban mért mennyiség. Úgy is tekinthetsz a burstre mint egy kosár méretre, ekkor a ceil az a maximum amennyivel kivehetsz tokeneket a kosárból, a ráta pedig az a sebesség amennyivel a kosár újratöltıdik. Tehát ha van egy 5000-es burst értékünk, a rátánk 1000, a ceil értékünk pedig 2500, akkor képesek leszünk fenntartani egy 1000 bytes/sec kapcsolatot, így amikor valamely ponton hirtelen "megszaladt" adat érhetı el, képesek leszünk azt 2500-tel elküldeni (5000/2500=) 2 másodpercen keresztül. Miután a "kosár" kiürült, elkezd újratöltıdni 1000 bytes/sec sebességgel. Megjegyzés: also in the comments you posted, you say you do ok with bursts below half a k. you re the only one, that sais that. a lot of ppl are using htb-tools, and there the use a minimum burst of 2k. they recomend 30% of ceil now.
Quantum A quantum az a bájt mennyiség, amennyit egy osztály még elküldhet, ha már elérte az elıre bekonfigutált rátáját. Ennek az értéknek nagyobbnak kell lennie 1500-nél (MTU) és kisebbnek 60000-nél. Ez az érték felülbírálható, ha egy htb osztályt hozzáadunk. A Quantum lényegében leírja azt, hogy a sávszélesség hogyan oszlik el a qdisc-ek között. Körülbelül így mőködik: Tételezzük fel, hogy van két osztályunk azonos szülıvel:
Szülı : ceil = rate = 100 osztály 1 : rate = 40 és ceil = 100 osztály 2 : rate = 20 és ceil = 100
(a megadott számok csak tájékoztató jellegőek, a megértést segítik) Mindkét osztály annyi adatot küld, amennyit csak bír. Elıször engedélyezve van nekik, hogy elég csomagot küldjenek ahhoz, hogy kitöltsék a beállított rátát, függetlenül az esetleg különbözı beállított prio-knak. De a szülınek van még maradék sávszélessége : 100 - 40 - 20 = 40. A maradék sávszélesség a quantumoknak megfelelıen oszlik szét. Mindegyik osztály "quantum" mennyiségő bájtot küldhet felváltva. A quantumokat ekkor rátaként számítják ki.
Az összes qdisc összes quantumja összeadódik és az összeget jegyzik meg Mindegyik qdisc a prioritását az következı képlet alapján kapja <math>\frac{quantum}{sum} Megjegyzés: A képlet: (quantum / (összes quantum))
Ezt akkor használjuk amikor két qdisc-ed van ugyanakkora rátával és ceil értékkel, de különbözı prioritást akarsz adni nekik. SFQ használatakor, az adatmennyiséget bájtokban mérik, nem csomagokban, ezért a quantum érték megegyezik azzal a bájt mennyiséggel, amennyit az adott qdisc engedélyezett elküldeni egy körben.
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 6 of 8
r2q Az r2q értéket használják a quantumok kiszámításához. Az alapértelmezett értéke: 10. A quantum rate-ként kerül kiszámításra (bájtban) / r2q. Ez felülbírálható, ha hozzáadunk egy htb qdisc-et. Példa: A szülı rate értéke 30 és 3 gyerek osztálya van, c1, c2 és c3. A három osztály rate értéke 10. Az osztályok quantumjai: class2-nek 1 és class3-nak 2. A class1 quantumja nem ismert, de 4 egységet küld. C2 és c3 annyit küldenek, amennyit csak tudnak, esetünkben 10-et, 10-et (a ráta limit mindig teljesül). A szülınek ekkor még mindig lesz 6 egysége, amit szétoszthat c2 és c3 között. Ekkor a quantumoknak megfelelıen fogja szétosztani a megmaradt egységeit, így c2 kap 2 egységet, c3 pedig 4 egységet. Lásd 1. ábrát! 1. ábra class c1 c2 c3
rate traffic quantum bandwidth 10 4 ? 4 10 +++ 1 10+2=12 10 +++ 2 10+4=14
Prio Pont azt jelenti, ahogy hangzik. Rendeljünk prioritásokat az osztályokhoz. Ez határozza meg azt a sorrendet, ahogy az osztályok több sávszélsséget kérhetnek a szülıtıl miután már az elıre beállított rátán forgalmaztak. Minél kisebb a szám, annál nagyobb a prioritás. A legalacsonyabb prio érték kapja a legkisebb késleltetést. De ha az alacson prio-val rendelkezı osztály több adatot küld a beállított rátánál, akkor a késleltetés növekedni fog. Prio értéke 0 és 7 között változhat.
Az SFQ megértése Egy megjegyzendı dolog, hogy az SFQ önmagában is remek munkát végez azzal, hogy eloszt "mindent" mindenféle konfigurálás nélkül. A legjobb ha az SFQ qdisc-eket ugyanolyan adattípusú osztályokhoz csatoljuk, pl. HTTP forgalmat, hogy elkerüljük a különbözı típusú adatfolyamok közötti elosztást. "Csomagok átvitelét ütemezi, 'folyamokon' alapján." "A cél az, hogy biztosítsák a korrektséget, így mindegyik folyam képes adatokat küldeni felváltva, ezáltal meggátolva, hogy egyetlen folyam leszívja az egész sávszélességet." http://lartc.org/manpages/tc-sfq.html
Iproute2 A HTB beállításához szükséged lesz az iproute2-re. emerge sys-apps/iproute2
Valójában a tc nevő programra van szükséged, az viszont az iproute2 csomagban található meg. Futtasd ezt a szkriptet, hogy létrehozd a 4 qdisc-et és beállítsad ıket: File: iptables_quotas.sh #Konstansok # Interfész, amelyiken szabályozni akarsz: # eth2, eth1 a közvetlen kapcsolatokhoz; ppp0 vagy hasonló a DSL-hez # és más betárcsázós kapcsolathoz (lásd ifconfig kimenetét) IFACE=eth2 # Prioritás jelzık MARKPRIO1="1" MARKPRIO2="2" MARKPRIO3="3" MARKPRIO4="4" # Ráták (a qdics-ek számára elérhetı maximális sávszélesség) UPRATE="152kbit" #P2PRATE=$UPRATE P2PRATE="128kbit" PRIORATE1="65kbit" PRIORATE2="46kbit" PRIORATE3="27kbit" PRIORATE4="8kbit" # Quantum (adott qdisc által egy körben elküldhetı adatok mennyisége) QUANTUM1="12187" QUANTUM2="8625" QUANTUM3="5062" QUANTUM4="1500" # Burst BURST1="6k" BURST2="4k" BURST3="2k" BURST4="0k" CBURST1="3k" CBURST2="2k" CBURST3="1k" CBURST4="0k" #reset (töröljük a meglévı qdisc-te) tc qdisc del dev $IFACE root htb # Várólista hosszának beállítása IFACE számára # (ezzel veszi át a belsı interfész a várósort, ezáltal kicsit lassabb lesz az áteresztıképessége az eth0-nál) ifconfig $IFACE txqueuelen 16 # queue discipline specifikálása (lásd r2q megjegyzést) tc qdisc add dev $IFACE root handle 1:0 htb default 103 r2q 1 # Osztályok deklarálása # root osztály megadása (ez rendelkezik a net kapcsolat maximumával) tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1 # alosztályok megadása (1:1 osztály ID szülıosztálynak az alosztályai -> fa szerkezetet képzeljünk el) tc class add dev $IFACE parent 1:1 classid 1:101 htb rate $PRIORATE1 ceil $UPRATE quantum $QUANTUM1 burst $BURST1 cburst $CBURST1 prio 0 tc class add dev $IFACE parent 1:1 classid 1:102 htb rate $PRIORATE2 ceil $UPRATE quantum $QUANTUM2 burst $BURST2 cburst $CBURST2 prio 1 tc class add dev $IFACE parent 1:1 classid 1:103 htb rate $PRIORATE3 ceil $UPRATE quantum $QUANTUM3 burst $BURST3 cburst $CBURST3 prio 2 tc class add dev $IFACE parent 1:1 classid 1:104 htb rate $PRIORATE4 ceil $P2PRATE quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3 # Csomagok szőrése tc filter add dev $IFACE tc filter add dev $IFACE tc filter add dev $IFACE tc filter add dev $IFACE # queuing discipline-ek tc qdisc add dev $IFACE tc qdisc add dev $IFACE tc qdisc add dev $IFACE tc qdisc add dev $IFACE
parent parent parent parent
1:0 1:0 1:0 1:0
hozzáadása parent 1:101 parent 1:102 parent 1:103 parent 1:104
protocol protocol protocol protocol
sfq sfq sfq sfq
ip ip ip ip
perturb perturb perturb perturb
prio prio prio prio
16 16 16 16
0 1 2 3
handle handle handle handle
quantum quantum quantum quantum
$MARKPRIO1 $MARKPRIO2 $MARKPRIO3 $MARKPRIO4
fw fw fw fw
classid classid classid classid
1:101 1:102 1:103 1:104
$QUANTUM1 $QUANTUM2 $QUANTUM3 $QUANTUM4
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 7 of 8
l7-filter A L7-filter sokkal általánosabb osztályozó próbál lenni mint a ipp2p. A minta definíciók user space-ben tárolódnak, szóval kernel újrafordítás nélkül lehet ıket módosítani. Ahogy feljebb is említettem, nem próbáltam a l7-filter-t. Ettıl függetlenül telepítheted ıket: emerge l7-protocols emerge l7-filter
Amint telepítve van, megkell tanulnod, hogyan állítsd be ıket és írd meg a tapasztalataidat ebbe a hogyanba ;-) Miután telepítetted a l7-filter-t, tedd a következıt echo "net-firewall/iptables extensions" >> /etc/portage/package.use emerge --newuse iptables
A megosztott objektumok eléréséhez szükséges használni a l7-filter-t. Továbbá aktiválni kell a l7 egyezést a kerneledben (pl. modulként) Linux Kernel Beállítás: Device Drivers --> [*] Network support Network options --> [*] Network packet filtering --> IP: Netfilter configuration --> [*] Connection tracking flow accounting <M> FTP protocol support <M> Userspace queueing via NETLINKa <M> Layer 7 match support (EXPERIMANTAL)
Utána újra kell fordítanod a kernelt (pl. genkernellel): genkernel --no-clean --no-mrproper all
Ezekután hozzá kell adni a szabályokat. De légy óvatos, úgy kell a szabályokat hozzáadni, hogy a csomagok mindkét irányban áthaladjanak a l7-filter szabályon. Ez azt jelenti, hogy benne kell lennie az INPUT-ban és az OUTPUT-ban is. Ez az egyik legtrükkösebb dolog amit megkell oldanod ;-) Itt egy példa aminek mőködnie kell. iptables -t filter -A INPUT -m layer7 --l7proto edonkey -j ACCEPT iptables -t filter -A OUTPUT -m layer7 --l7proto edonkey -j ACCEPT
Vagy azoknak a rendszergazdáknak, akik egyátalán nem akarnak p2p-t engedélyezni: iptables -t filter -A FORWARD -m layer7 --l7proto edonkey -j DROP
Ez veszélyes, mert van esély fals pozitív esetre, amikor hasznos forgalmat dobunk el. Olvasd el a l7-filter oldalán a protokollok részt, hogy képben legyél arról, hogy vállalod-e a rizikót vagy sem. Biztonságosabb a sávszélességet limitálni helyette. Elıször jelöljük meg a csomagokat: iptables -t mangle -A FORWARD -m layer7 --l7proto edonkey -j MARK --set-mark 123
Aztán használjuk a tc-t hogy elkapjuk az egyezéseket. Bıvebb információkért http://l7-filter.sourceforge.net Jó szórakozást. Emlékeztetı: l7-filter nem mőködik a hardened-sources 2.6.11-r15-val.
Tesztelés Grafikonok Mostanra készek vagyunk, azonban vajon mőködik is? Ez valóban jó kérdés. Hogy megválaszoljam, készítettem egy perl szkriptet, amely néhány grafikont rajzol ki. Ezt mindig futtatom a szerveremen, ahol meg is nézheted a saját szemeddel a grafikonokat és le is töltheted a szkriptet script A szkriptnek szüksége van a gnuplot-ra a grafikonok rajzolásához emerge media-gfx/gnuplot
Szerkesztheted is a szkriptet, beállíthatod hogy mekkora idıközönként rajzolja ki a grafikonokat és azt is, hogy hány grafikont rajzoljon meg. Valójában nem igényel webszervert, de a legjobban úgy mőködik ha van webszerver is.
Feltöltési ráta beállítása Egyik legfontosabb dolog, hogy a feltöltési rátánkat megfelelıen állítsuk be. Ha túl magasra állítod, akkor a várósor a linuxos géprıl a DSL modemre megy át. Ha túl alacsonyra állítod, akkor nem használod ki a sávszélességed. Pontosan megfelelınek kell lenni. Így teszteld:
Izzíts be egy bittorrent-et Kezdj el pingelni egy szervert Ssh-val lépj be egy szerverre
Most figyeld meg a ping idıket miközben állítod a feltöltési rátádat bittorretben. Próbálj beírni valamit közben az ssh sessionba. Ígérem rögtön látni fogod, ha a feltöltési rátád túl magas. Végül tesztként futtass le egy játékot, pl. Enemy Territory. A játékok az interaktivitás érdekében rengeteg kismérető csomagot kell elküldenie rendkívül rövid idı alatt. Tartsd lenyomva a Tab billentyőt, hogy lásd a késleltetésed.
Hivatkozások
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008
HOGYAN Packet Shaping - Gentoo Linux Wiki
Page 8 of 8
Össze vagy kavarodva, vagy csak szeretnél többet megtudni a témáról? Teljesen érthetı. A QOS dokumentációja teljesen szétvan szórva az interneten és több helyen is elavult. Miközben a QOS-t saját magam tanultam (eredeti szerzı), a következı linkeket győjtöttem össze:
iptables Linux Advanced Routing & Traffic Control l7-filter ipp2p QOS graphs combined with Munin combined with Nagios QOS graphs HTB Linux queuing discipline manual http://www.docum.org/docum.org/ ADSL Bandwidth Management HOWTO Jim diGriz's QoS Script Fair NAT for Linux Routers http://www.ssi.bg/~ja/ The WRR scheduler http://www.adsl-optimizer.dk/ Traffic Control HOWTO
Thinking of traffic shaping multiple interfaces as one in kernel 2.6? Or want to packet shape ingress? IMQ could be the answer, but it might not be stable. Or is it? There is next to no online documentation.
IMQ ported to 2.6 discusion http://groups.google.com/group/linux.kernel/browse_thread/thread/31ba3f19dc66c4ef/2e755f4dc73da1c5? lnk=st&q=Intermediate+queueing+device+Patrick+McHardy&rnum=1&hl=en#2e755f4dc73da1c5 IMQ usage example http://www.lartc.org/howto/lartc.imq.html
A lap eredeti címe: „http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping” Gyere a Vodefone-hoz Internetezz akár 3 hónapig féláron! Fizess elı július 8-ig www.vodafone.hu/internet
Free SMTP Redirection Run your own mail server on any ISP blocking port 25! rollernet.us
A lap utolsó módosítása 13:55, 2008. január 18..
http://hu.gentoo-wiki.com/HOGYAN_Packet_Shaping
7/1/2008