Quality of Service
Buch - Scripte

 

tcshape

#!/bin/sh

echo " Setze Variablen und lösche alte Klassen"

# zu überwachendes Gerät
DEV=ppp0

# Uplink Speed (90% von max 512 kbit/s)
UPLINK=460
# zurücksetzen vorhandener Ketten und Klassen

iptables -t mangle -F POSTROUTING
tc qdisc del dev $DEV root > /dev/null

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

echo " Erstelle Markierungsrichtlinien..."

# Hier erfolgt die Markierung der Pakete mit Hilfe von iptables.
# Anhand dieser Markierung werden diese Pakete in die entsprechenden
# Prioritätswarteschlangen einsortiert.

### Pakete mit höchster Priorität werden mit 1 markiert
# ICMP, SSH, SIP, RTP, TOS=Min-Delay

iptables -t mangle -o $DEV -A POSTROUTING -p ICMP -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
iptables -t mangle -o $DEV -A POSTROUTING -p TCP -m tos --tos Minimize-Delay -j MARK --set-mark 1

### Pakete mit zweit höchster Priorität 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

### Pakete mit geringster Priorität werden mit 4 markiert
# Peer-2-Peer Netze, TOS=Min-Throughput

iptables -t mangle -o $DEV -A POSTROUTING -p TCP -m tos --tos Minimize-Cost -j MARK --set-mark 4

####################################################################
echo " Erstelle Klassen ..."

# Installation einer HTB Warteschlange, (Hierarchy Token Bucket).
# Alle Pakete gehen in diese Warteschlange.
# Die HTP Warteschlange besitzt die Möglichkeit eine garantierte
# Bandbreite verschiedenen Klassen zuzuordnen.
# Pakete die nicht markiert worden sind gehen in die Klasse 30 (default 30)

tc qdisc add dev $DEV root handle 1:0 htb default 30

# Erstellen einer Hauptklasse mit der Bezeichnung 1:1,
# welche sich unterhalb der HTB Warteschlange befindet. (parent 1:0)

tc class add dev $DEV parent 1:0 classid 1:1 htb rate ${UPLINK}kbit

# Hier werden 4 verschiedene Prioritätsklassen erstellt,
# welche sich Unterhalb der Hauptklasse (parent 1:1) befinden.
# Jeder Klasse wird eine bestimmte Bandbreite vom maximalen Uplink
# garantiert ($[30*UPLINK/100]kbit ceil ${UPLINK}).

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

# Hier erfolgt die Weiterleitung der Pakete in die
# einzelnen Klassen anhand Ihrer Markierung (handle 1).

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)
# Dies ist hilfreich wenn mehrere Rechner im Netz Bandbreite einer Klasse benutzen
# und ein Rechner auf Grund seiner Hardware schneller Pakete empfangen und senden kann.

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