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:
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:
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:
en dan pik je ze er zo weer uit:
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:
Waar laat ik hier dan die markeer-regel? Ik heb het vlak voor de laatste regel geprobeerd maar dat werkt niet:
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:
Of is er een efficientere manier? (even afgezien van de mogelijkheid dat je bij een HTB qdisc een default qdisc kan opgeven)
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:
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?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.
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