[QOS]Qdiscs, classes en filters vraagjes

Pagina: 1
Acties:

  • Pastinakel
  • Registratie: December 2000
  • Laatst online: 14-02 12:29

Pastinakel

Zwammen en kwazoedels

Topicstarter
Naar aanleiding van een aantal oude topics op GoT ben ik mij eens gaan verdiepen in Traffic Control voor mijn Debian Woody routertje in het thuisnetwerk. Ik heb de volgende documentatie erop nageslagen:

Op GoT:
Interessant: QoS
netwerk balancing + accounting
[BC3]Iemand ervaring met shapen van Incoming Traffic?
Mxstream download weg als ik upload?
traffic shaping probleem
CBQ probleem, bandwidth management,voor de toppers

Op Doc & MAN sites:
Linux Advanced Routing & Traffic Control
LAR & TC HOWTO
LAR & TC Manpages

Allemaal zeer duidelijke docs (hoewel ik het niet overal even goed kan volgen) maar ik blijf met een aantal vragen zitten:

Vraag 1
Wat is het verschil tussen een qdisc en een class? Wanneer gebruik je nu wat?
Op http://lartc.org/manpages/tc.html staat een duidelijke definitie:
QDISCS
qdisc is short for 'queueing discipline' and it is elementary to understanding traffic control. Whenever the kernel needs to send a packet to an interface, it is enqueued to the qdisc configured for that interface. Immediately afterwards, the kernel tries to get as many packets as possible from the qdisc, for giving them to the network adaptor driver.

A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure First In, First Out queue. It does however store traffic when the network interface can't handle it momentarily.

CLASSES
Some qdiscs can contain classes, which contain further qdiscs - traffic may then be enqueued in any of the inner qdiscs, which are within the classes. When the kernel tries to dequeue a packet from such a classful qdisc it can come from any of the classes. A qdisc may for example prioritize certain kinds of traffic by trying to dequeue from certain classes before others.
Dus...niet elke qdisc kan classes bevatten, alleen 'classful qdiscs'. Dat snap ik. Maar moet dan elke class een qdisc bevatten of mogen er ook direct weer andere classes onder zitten?

Vraag 1b
Concreet wil ik (als begin) het volgende voor elkaar krijgen:
A Zorgen dat je bij druk downloaden nog fatsoenlijk kan SSH'en.
B Netwerkverkeer eerlijk verdelen over twee clients.
De interne interface op de router is $INTIF. De router heeft 192.168.0.1 en twee clients hebben 192.168.0.2 en 192.168.0.3.
Ik wil de HTB qdisc gebruiken (anders heb ik voor niets mijn kernel gepatched en gecompiled ;) ).
Mijn script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh
#set -x
INTIF=eth0
#oude instellingen weggooien
tc qdisc del dev $INTIF root 2> /dev/null > /dev/null

# root qdisc
tc qdisc add dev $INTIF root handle 1: htb default 10
tc class add dev $INTIF parent 1: classid 1:1 htb rate 10mbit burst 15k

#classes voor resp. gewoon verkeer en SSH verkeer
tc class add dev $INTIF parent 1:1 classid 1:10 htb rate 9216kbit ceil 10mbit burst 15k
tc class add dev $INTIF parent 1:1 classid 1:20 htb rate 512kbit ceil 10mbit burst 15k

#qdiscs voor bovenstaande classes
tc qdisc add dev $INTIF parent 1:10 handle 10: htb default 120
tc qdisc add dev $INTIF parent 1:20 handle 20: htb default 220

#classes voor normaal verkeer voor beide clients
tc class add dev $INTIF parent 10: classid 10:10 htb rate 4608kbit ceil 10mbit burst 15k
tc class add dev $INTIF parent 10: classid 10:20 htb rate 4608kbit ceil 10mbit burst 15k
#classes voor SSH verkeer voor beide clients
tc class add dev $INTIF parent 20: classid 20:10 htb rate 256kbit ceil 10mbit burst 15k
tc class add dev $INTIF parent 20: classid 20:20 htb rate 2568kbit ceil 10mbit burst 15k

#qdiscs voor bovenstaande classes
tc qdisc add dev $INTIF parent 10:10 handle 110: sfq perturb 10
tc qdisc add dev $INTIF parent 10:20 handle 120: sfq perturb 10
tc qdisc add dev $INTIF parent 20:10 handle 210: sfq perturb 10
tc qdisc add dev $INTIF parent 20:20 handle 220: sfq perturb 10

#filters
#filteren op protocol
tc filter add dev $INTIF protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:20
tc filter add dev $INTIF protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:10

#filteren op client
tc filter add dev $INTIF protocol ip parent 10: prio 1 u32 match ip dst 192.168.0.2 flowid 10:10
tc filter add dev $INTIF protocol ip parent 10: prio 1 u32 match ip dst 192.168.0.3 flowid 10:20
tc filter add dev $INTIF protocol ip parent 20: prio 1 u32 match ip dst 192.168.0.2 flowid 20:10
tc filter add dev $INTIF protocol ip parent 20: prio 1 u32 match ip dst 192.168.0.3 flowid 20:20

Dit script doet het zoals bedoeld. Maar ik vraag mij af of het de meest efficiente manier is: die eerste twee classes bijvoorbeeld, zijn die perse nodig?

Vraag 2
In de LAR & TC HOWTO staat (bijna onderaan op de gelinkte pagina) hoe je mbv iptables (of ipchains) pakketjes kan markeren zodat je ze er later met een filter kan uitpikken. Ik krijg dat echter niet voor elkaar. In de howto staat dat je ze als volgt kan markeren:
code:
1
# iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6

en dan pik je ze er zo weer uit:
code:
1
# tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1

Ik gebruik het ip-tables script uit de Linux IP Masquerade HOWTO, sectie 6.4.1. Stronger IP Firewall (IPTABLES) rulesets. Daarin gaat de laatste sectie over Forwarding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#######################################################################
# FORWARD: Enable Forwarding and thus IPMASQ
#

echo "     - FWD: Allow all connections OUT and only existing/related IN"
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED \
-j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

# Catch all rule, all other forwarding is denied and logged.
#
$IPTABLES -A FORWARD -j drop-and-log-it


echo "     - NAT: Enabling SNAT (MASQUERADE) functionality on $EXTIF"
#
#More liberal form
#$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
#
#Stricter form
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP


#######################################################################

Waar laat ik hier dan die markeer-regel? Ik heb het vlak voor de laatste regel geprobeerd maar dat werkt niet:
code:
1
2
3
4
...blablabla...
#Stricter form
$IPTABLES -A PREROUTING -t mangle -i $EXTIF -j MARK --set-mark 6
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP

Hmmm...logisch eigenlijk dat het niet werkt want SNAT staat voor Source NAT en gaat dus de kant van de buitenwereld op. Maar hoe moet het dan wel?

Vraag 3
Hoe kun je het beste een "catch all"- filter maken? Bijvoorbeeld:
code:
1
2
3
tc filter ... u32 match ip dst 192.168.0.2 ... #client 02
tc filter ... u32 match ip dst 192.168.0.3 ... #client 03
tc filter ... u32 match ip dst 0.0.0.0/0 ...   #de rest

Of is er een efficientere manier? (even afgezien van de mogelijkheid dat je bij een HTB qdisc een default qdisc kan opgeven)

Ik kan je niet helpen. De frutsel is warrig en niet knopig. Bovendien heb ik maar één kant | Scrobblernakel


Verwijderd

Op vrijdag 26 april 2002 15:18 schreef Niep het volgende:
Naar aanleiding van een aantal oude topics op GoT ben ik mij eens gaan verdiepen in Traffic Control voor mijn Debian Woody routertje in het thuisnetwerk. Ik heb de volgende documentatie erop nageslagen:

Op GoT:
Interessant: QoS
netwerk balancing + accounting
[BC3]Iemand ervaring met shapen van Incoming Traffic?
Mxstream download weg als ik upload?
traffic shaping probleem
CBQ probleem, bandwidth management,voor de toppers

Op Doc & MAN sites:
Linux Advanced Routing & Traffic Control
LAR & TC HOWTO
LAR & TC Manpages

Allemaal zeer duidelijke docs (hoewel ik het niet overal even goed kan volgen) maar ik blijf met een aantal vragen zitten:
Complimentje voor deze zeer goede uitgebreide post :)
Zouden meer mensen moeten doen :)
Vraag 1
Wat is het verschil tussen een qdisc en een class? Wanneer gebruik je nu wat?
Een queueing discipline houdt niets meer en niets minder in, dan de manier waarop packetten binnenkomen in de "wachtrij" en de manier waarop ze behandelt worden zodra ze daar binnen komen. Daar heb je dus verschillende algoritmes voor. De een is beter dan de andere.

Een class is een door de gebruiker gedefinieerde klasse. Als gebruiker stel je bepaalde regels op, waarin het verkeer ingedeeld wordt. Dit kan je o.a. op poorten doen, op ip-adressen (Zowel source alsook destination), op mac-adres, op QOS, op ttl etc. etc.

Voor zo'n klasse kan je dan vervolgens een zogenaamde qdisc gaan gebruiken zoals ik hierboven uitleg :)
Ik hoop dat het nu iets duidelijker is?
Vraag 1b

Dit script doet het zoals bedoeld. Maar ik vraag mij af of het de meest efficiente manier is: die eerste twee classes bijvoorbeeld, zijn die perse nodig?
Ja hoor, dit is absoluut een efficiente oplossing :)

De 2 bovenste classes zijn ook persee nodig. Zij vormen als het ware de basisklasse van je netwerkinterface. Je zult ook zien, dat als je verkeer zou hebben dat aan geen van je filters zou voldoen, dat het automatisch in de basisklasse terecht komt.
Vraag 2
Waar laat ik hier dan die markeer-regel? Ik heb het vlak voor de laatste regel geprobeerd maar dat werkt niet:
code:
1
2
3
4
...blablabla...
#Stricter form
$IPTABLES -A PREROUTING -t mangle -i $EXTIF -j MARK --set-mark 6
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP

Hmmm...logisch eigenlijk dat het niet werkt want SNAT staat voor Source NAT en gaat dus de kant van de buitenwereld op. Maar hoe moet het dan wel?
Hmzz, het antwoord op deze vraag moet ik je even schuldig blijven aangezien het al weer even geleden is dat ik ermee gespeeld heb. Ik ben echter op het moment van tikken, bezig met het installeren van een nieuw router aan het begin van mijn netwerk. Daarop ga ik ook QOS/TC gebruiken en zal ik er ongetwijfeld wel weer mee aan de gang gaan.

Ik weet nog wel uit de tijd dat ik er mee bezig was, dat je iets dergelijks meen ik niet kon doen met gemasqueraded verkeer, aangezien dat niet de mangle table doorloopt. Ik kom toen ook keurig zien, dat het binnen m'n eigen netwerk perfect werkte (geen masquerading), maar zodra er verkeer naar buiten mijn netwerk ging, dat het niet meer werkte helaas.

Aan bovenstaande zul je misschien niet veel hebben ;) Als ik morgen/overmorgen m'n geheugen weer opgefrist heb, kan ik je misschien betere/meer info geven.
Vraag 3
Hoe kun je het beste een "catch all"- filter maken? Bijvoorbeeld:
code:
1
2
3
tc filter ... u32 match ip dst 192.168.0.2 ... #client 02
tc filter ... u32 match ip dst 192.168.0.3 ... #client 03
tc filter ... u32 match ip dst 0.0.0.0/0 ...   #de rest

Of is er een efficientere manier? (even afgezien van de mogelijkheid dat je bij een HTB qdisc een default qdisc kan opgeven)
Dit is absoluut gewoon een efficiente oplossing :)

Verwijderd

Zou het kunnen dat je voor vraag 2 nog iets moet doen met match extensions ? Staan beschreven in de iptables manual. Verder heb ik een voorbeeld uitgewerkt voor fwmark in [topic=425669/1] . Wellicht dat het van nut is .

  • Pastinakel
  • Registratie: December 2000
  • Laatst online: 14-02 12:29

Pastinakel

Zwammen en kwazoedels

Topicstarter
[..]
Complimentje voor deze zeer goede uitgebreide post :)
Zouden meer mensen moeten doen :)
[..]
*bloos* Dank je :)
Een queueing discipline houdt niets meer en niets minder in, dan de manier waarop packetten binnenkomen in de "wachtrij" en de manier waarop ze behandelt worden zodra ze daar binnen komen. Daar heb je dus verschillende algoritmes voor. De een is beter dan de andere.

Een class is een door de gebruiker gedefinieerde klasse. Als gebruiker stel je bepaalde regels op, waarin het verkeer ingedeeld wordt. Dit kan je o.a. op poorten doen, op ip-adressen (Zowel source alsook destination), op mac-adres, op QOS, op ttl etc. etc.

Voor zo'n klasse kan je dan vervolgens een zogenaamde qdisc gaan gebruiken zoals ik hierboven uitleg :)
Ik hoop dat het nu iets duidelijker is?
Het is idd weer een stuk duidelijker geworden.
Ja hoor, dit is absoluut een efficiente oplossing :)

De 2 bovenste classes zijn ook persee nodig. Zij vormen als het ware de basisklasse van je netwerkinterface. Je zult ook zien, dat als je verkeer zou hebben dat aan geen van je filters zou voldoen, dat het automatisch in de basisklasse terecht komt.
Hmmm...wel een beetje omslachtig als je voor 100 clients dergelijke classes wilt aanmaken. Aan de andere kant: waar heb je anders shellscripts voor? Met een for-loop gaat dat natuurlijk prima ;-).
Hmzz, het antwoord op deze vraag moet ik je even schuldig blijven aangezien het al weer even geleden is dat ik ermee gespeeld heb. Ik ben echter op het moment van tikken, bezig met het installeren van een nieuw router aan het begin van mijn netwerk. Daarop ga ik ook QOS/TC gebruiken en zal ik er ongetwijfeld wel weer mee aan de gang gaan.

Ik weet nog wel uit de tijd dat ik er mee bezig was, dat je iets dergelijks meen ik niet kon doen met gemasqueraded verkeer, aangezien dat niet de mangle table doorloopt. Ik kom toen ook keurig zien, dat het binnen m'n eigen netwerk perfect werkte (geen masquerading), maar zodra er verkeer naar buiten mijn netwerk ging, dat het niet meer werkte helaas.

Aan bovenstaande zul je misschien niet veel hebben ;) Als ik morgen/overmorgen m'n geheugen weer opgefrist heb, kan ik je misschien betere/meer info geven.
Het zou wel makkelijk zijn om dit aan de gang te krijgen. Ik wil het script namelijk nog aanpassen zodat lokaal verkeer over mijn 10mbit NIC geen invloed heeft op downloads die binnenkomen op het kabelmoden dat op 512kbit geknepen wordt. Maar misschien is dat nog op een andere manier op te lossen.
Dit is absoluut gewoon een efficiente oplossing :)
Zo'n vermoeden had ik al. Ik vroeg me het af omdat je op deze manier wel zorgt voor onnodige CPU-belasting omdat elke packet wel gematched moet worden.

edit: typo's

Ik kan je niet helpen. De frutsel is warrig en niet knopig. Bovendien heb ik maar één kant | Scrobblernakel


  • Pastinakel
  • Registratie: December 2000
  • Laatst online: 14-02 12:29

Pastinakel

Zwammen en kwazoedels

Topicstarter
Op zaterdag 27 april 2002 00:01 schreef janjanjansen het volgende:
Zou het kunnen dat je voor vraag 2 nog iets moet doen met match extensions ? Staan beschreven in de iptables manual. Verder heb ik een voorbeeld uitgewerkt voor fwmark in [topic=425669/1] . Wellicht dat het van nut is .
Ik zal er nog eens naar kijken. Het ging erom hoe je die markering in je tc filters kunt gebruiken. In dat voorbeeld gebruik je ze weer voor iets anders (wat ik weer niet begrijp doordat ik dat deel van de Howto alweer vergeten ben :D ).
Senks anyway.

Ik kan je niet helpen. De frutsel is warrig en niet knopig. Bovendien heb ik maar één kant | Scrobblernakel


  • Pastinakel
  • Registratie: December 2000
  • Laatst online: 14-02 12:29

Pastinakel

Zwammen en kwazoedels

Topicstarter
Just for the record: het antwoord op vraag 2 heb ik gevonden.
Ik kan nu mbv iptables bepaald verkeer markeren en die markering gebruiken in tc filters. En dat werkt.

Pakketjes markeren die vanaf het interne netwerk naar de buitenwereld gaan en andersom:
code:
1
2
3
4
5
6
7
# Upload marking
$IPTABLES -t mangle -A FORWARD -s 192.168.0.0/24 \
-d ! 192.168.0.0/24 -j MARK --set-mark 4

# Download marking
$IPTABLES -t mangle -A POSTROUTING -s ! 192.168.0.0/24 \
-d 192.168.0.0/24 -j MARK --set-mark 5

Filteren op markering 4:
code:
1
2
tc filter add dev eth0 parent 1:0 protocol ip prio 10 \
handle 4 fw flowid 1:10

Ik kan je niet helpen. De frutsel is warrig en niet knopig. Bovendien heb ik maar één kant | Scrobblernakel

Pagina: 1