Linux.tc

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen

Das Script

 #
 # Konfigurationsscript eines Bandbreitenmanagment mit Hilfe von TC
 #
 #
 # Gestartet wird diese Datei mit Hilfe der /etc/rc.d/init.d/tcshape
 #
 # Description:   Script zum  Konfigurieren eines Bandbreitenmanagment
 # Autor:         Sven Neukirchner <sven@konabi.de>
 #                mit Hilfe von Newsgroups und Beispielen aus dem Internet
 #				 http://www.naxan.de/Linux/MiniQoS.html  Dank an Frank Nodes
 #				 http://www.robert-peter.de/yats/        Dank an Robert Peter
 #
 # Date           26.05.2005
 # Version:       1.0 ohne L7 Filter  (http://l7-filter.sourceforge.net)
 # Lizenz:        GPL
 # benoetigt:     iptable, tc/iproute2
 #
 # Loeschen der Warteschlangen und Klssen geschieht im Script /etc/init.d/tcshape
 #
 # mit "tc -s -d class show dev ppp0" kann man sich die einezelnen Klassen anschauen
 # oder man verwendet ein schoens Perlscipt /usr/local/bin/tcshape.pl
 # das Script sammelt die Daten und erzeugt eine HTML Datei
 # Autor des Scriptes ist mir unbekannt Download unter www.konabi.de/download/download.php
 #
 #

 echo "    Erstelle Markierungsrichtlinien..."


 # zu ueberwachendes Geraet
 DEV=dsl0


 # Uplink Speed (90% von Fullspeed, damit der Modembuffer nicht ueberlaeuft)
 UPLINK=460

 #### Prioritaetsmarke fuer ausgehende Packete setzen ########################################

 iptables -A PREROUTING -t mangle -s 192.168.115.191 -j MARK --set-mark 4

 ### - Prioritaet 1 - Packete die hoechste Prio bekommen sollen werden mit 1 markiert (--set-mark 1) ###
 #SSH, SIP, RTP, TOS=Minimize Delay
 iptables -t mangle -o $DEV -A POSTROUTING -p ICMP -j MARK --set-mark 1
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP --dport 22 -j MARK --set-mark 1
 iptables -t mangle -o $DEV -A POSTROUTING -p UDP --dport 5060 -j MARK --set-mark 1
 iptables -t mangle -o $DEV -A POSTROUTING -p UDP --sport 10000:10010 -j MARK --set-mark 1


 ###  Prioritaet 2  Packete die zweithoechste Prio bekommen sollen werden mit 2 markiert  ###
 # TCP ACKs, TOS= Max Throughput
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP -m length --length :64 -j MARK --set-mark 2
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP -m tos --tos Maximize-Throughput -j MARK --set-mark 2


 ###  Prioritaet 3 - Standard ###


 ## Prioritaet 4 - Packete die geringste Prio bekommen sollen werden mit 4 markiert ###
 #  EMULE, TOS=Min Throughput
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP --dport 4661 -j MARK --set-mark 4
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP --dport 4662 -j MARK --set-mark 4
 iptables -t mangle -o $DEV -A POSTROUTING -p UDP --dport 4672 -j MARK --set-mark 4
 iptables -t mangle -o $DEV -A POSTROUTING -p TCP -m tos --tos Minimize-Cost -j MARK --set-mark 4

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

 tc qdisc del dev $DEV root

 echo "    Erstelle Klassen ..."

 # Installation einer HTB Warteschlange, (Hierarchy  Token  Bucket)
 # alle Packete gehen in diese Warteschlange
 # die HTP Warteschlange besitzt die Moeglichkeit garanierte Bandbreite
 # verschiedenen Klassen zuzuordnen
 # Packete die nicht markiert worden sind gehen in die Klasse 30 (default 30)
 tc qdisc add dev $DEV root handle 1: htb default 30

 # Erstellen einer Hauptklasse in der alle Packete gelangen
 tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit

 # Erstellen von Unterklassen und Zuordnung von garanierten min Bandbreiten bis max Bandbreite
 #    $[50*UPLINK/100]  miniumum garantierter Durchsatz 50% vom Uplink
 #    ${UPLINK}         maximaler Durchsatz entspricht Interface
 #    classid           ist name der Klasse
 #    parent 1:1        Unterklasse (classid) ist an uebergeordnete Klasse parent 1:1 angeschlossen
 #    prio              ist dafür zustaendig in welcher Reihenfolge freie Bandbreite
 #                      an die einzelnen Klassen vergeben wird
 #					   (die hoehere Klasse bekommt zuerst Bandbreite wenn Bandbreite verfuegbar ist)

 tc class add dev $DEV parent 1:1 classid 1:10 htb rate $[50*UPLINK/100]kbit ceil ${UPLINK}kbit prio 1
 tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[30*UPLINK/100]kbit ceil ${UPLINK}kbit prio 2
 tc class add dev $DEV parent 1:1 classid 1:30 htb rate $[20*UPLINK/100]kbit ceil ${UPLINK}kbit prio 3
 tc class add dev $DEV parent 1:1 classid 1:40 htb rate $[10*UPLINK/100]kbit ceil ${UPLINK}kbit prio 4


 # Packete die von Firewall mit 1 markiert worden sind (handle 1) werden an Klasse 1:10 weitergeleitet usw...

 tc filter add dev $DEV protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10
 tc filter add dev $DEV protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:20
 tc filter add dev $DEV protocol ip parent 1:0 prio 3 handle 3 fw flowid 1:30
 tc filter add dev $DEV protocol ip parent 1:0 prio 4 handle 4 fw flowid 1:40

 # alle Hosts einer Klasse werden gleich behandelt (SFQ  Stochastic FAIRNESS QUEUE)
 #      kommt zum Einsatz wenn z.B. meherer Rechner im Netz Bandbreite einer Klasse benutzen
 #      und ein Rechner auf Grund seiner Hardware schneller Packete empfanggen und senden kann
 #      hierdurch wird verhindert dass dieser Rechner den anderen rechnern die Bandbreite enzieht

 tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
 tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
 tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10
 tc qdisc add dev $DEV parent 1:40 handle 40: sfq perturb 10

Statistik ausgeben, an welchen Stellen die Filter greifen

tc -s class ls dev dsl0