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