Ich habe eine ADSL Standleitung ins Internet. Da ich auf meinem Server eine Website und einen FTP Server hoste, hatte ich Probleme mit dem Traffic. Wenn nun ein Internetuser einige Downloads von meinem Webserver machte, dann blieb nicht mal genügend Upstream übrig um zu Surfen.
Deshalb habe ich mit QOS und Traffic Shaping unter Linux auseinandergesetzt. Nach endlosen Stunden am Computer beim lesen von langweiligen und schwierigen Dokus habe ich es geschafft ein Traffic Shaping nach meinen Wünschen einzurichten :o)
Die Funktionen zur Kontrolle des Traffic's werden mit mit dem "TC" (Traffic Control) Kommando gemacht. Eigentlich kann man sagen, dass mit den QDisc (Queuing Disciplines) einfach ein weiterer Queue (Warteschlange) erstellt wird. Mit Parametern kann man dann auf die Eigenschaften dieses Queues einwirken.
Es gibt verschiedene QDisciplines:
#Ist bereits ein QDisc vorhanden?
tc qdisc show dev eth1
#Ausgabe
qdisc tbf 1: rate 128Kbit burst 6399b lat 762.6s
#Es ist also ein QDISC mit dem TBF vorhanden, welcher den Traffic auf 128Kbit/s = 16KB/s begrenzt
#Root QDisc löschen
tc qdisc del dev eth1
#Die Abfrage sollte jetzt keine QDisc mehr finden
tc qdisc show dev eth1
Mit dem TBF (Token Bucket Filter) kann man ein ganz einfaches begrenzen des Netzwerkverkehrs erreichen. In unserem Beispiel werden wir den Traffic auf 1 MBit/s (=128MB/s) begrenzen.
#Root QDisc TBF setzen
tc qdisc add dev eth1 root handle 1:0 tbf limit 100Mbit burst 50Kbit rate 1Mbit
#Die Abfrage sollte jetzt ungefähr so aussehen
tc qdisc show dev eth1
qdisc tbf 1: rate 1Mbit burst 6399b lat 762.6s
Mit dem CBQ (Class Based Queuing) wird der Verkehr in verschiedene Klassen eingeteilt. Jede dieser Klassen kann unterschiedlich behandelt werden. Es kann zum Beispiel dem FTP Verkehr die ganze Bandbreite zugeteilt werden, sofern kein Webtraffic herscht usw.
# Die Queues und die Klassen bilden
So, und nun werden wir das obengenannte Beispiel in die Praxis umsetzen...
# Die Queues und die Klassen bilden
# ROOT QDisc auf dem Interface setzen (1:0)
tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
#Klasse 1:1 mit 4096Kbit/s = 512KB/s setzen
tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 128Kbit weight 12.8Kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
#Unterklasse 1:3 mit 1024Kbit/s = 128KB/s setzen
tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 112Kbit weight 11.2Kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 sharing borrow
#FIFO setzen
tc qdisc add dev eth1 parent 1:3 handle 30: pfifo
#Unterklasse 1:4 mit 3072Kbit/s = 384KB/s setzen
tc class add dev eth1 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 16Kbit weight 1.6Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 sharing borrow
#FIFO setzen
tc qdisc add dev eth1 parent 1:4 handle 30: pfifo
# Die Filter für die Klassen einrichten
# Filter mit Handle-ID 103 der Klasse 1:3 zuteilen
tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 103 fw flowid 1:3
# Filter mit Handle-ID 104 der Klasse 1:4 zuteilen
tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 104 fw flowid 1:4
# Mit den Iptables dem Traffic die Handle-ID zuteilen
# WWW Verkehr mit der Handle-ID 103 versehen
iptables -t mangle -A POSTROUTING -p tcp -s $EXT_IP --sport 80 -j MARK --set-mark 103
# FTP Verkehr mit der Handle-ID 104 versehen
iptables -t mangle -A POSTROUTING -p tcp -s $EXT_IP --sport 20 -j MARK --set-mark 104
Untenstehend findet Ihr einige Links zum Thema, bzw. einige Sites, welche mir geholfen haben QOS und Traffic Shaping zu realisieren...
Zur Linux Startseite home.icewolf.ch/linux/ | Copyright © 2003 - Andres Bohren Icewolf Software