Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Traffic-Shaping hat die Fähigkeit, verschiedene Netzwerk-Verbindungen unterschiedlich zu behandeln und somit Datenpaketen im Netzwerk unterschiedliche Prioritäten einzuräumen. Der Nutzen besteht zum Beispiel darin, dass eine bestehende Netzwerkverbindung, welche die verfügbare Bandbreite des Netzwerks vollständig ausschöpft, eine weitere Netzwerkverbindung nicht zur Gänze ausbremsen kann. Es lässt eine spezifische Bandbreitenverteilung der unterschiedlichen Netzwerk-Protokolle zu. Falls man es in einem Router einsetzt, kann man damit auch die Netzwerk-Nutzung der angeschlossenen Rechner reglementieren. Insgesamt sorgt es für eine optimierte Abarbeitung der Datenpakete und stellt eine effiziente Ausnutzung der verfügbaren Bandbreite sicher.
Wer ein etwas einfacher zu verstehendes Programm bevorzugt, kann sich Trickle anschauen.
Die nötigen Programme und Pakete sind bei jeder Ubuntu-Installation bereits installiert. Man muss sie nur noch mittels eines Scripts, das man selbst anlegt [1], konfigurieren und aktivieren. Dazu bedient man sich der Programme /sbin/iptables und /sbin/tc.
Ein einfaches, aber sehr nützliches Einsatzszenario für Traffic-Shaping ist die Beeinflussung des Netzwerktraffics des DSL-Anschlusses. Da bei DSL der Upstream geringer als der Downstream ist, kann der Upstream schnell "verstopfen". Dies geschieht, weil bei TCP-Verbindungen jedes empfangene Paket mit einer "Empfangsbestätigung" beantwortet werden muss. Die Lage verschlimmert sich noch, wenn andere Netzwerkverbindungen den Upstream gleichfalls benutzen wollen. Genaueres dazu findet man bei TCP/IP. Um den Traffic zu beeinflussen, werden sogenannte "Regeln" angelegt, welche vom Kernel abgearbeitet werden.
Der DSL-Anschluss mittels Modem läuft in der Regel über das Netzwerkgerät ppp0
. Ist man über einen Router mit dem Internet verbunden, so ist heißt das zuständige Netzwerkgerät meistens eth0
. Das zuständige Netzwerkgerät wird mit dem Variablennamen DEV
in der ersten Zeile übergeben.
DEV=ppp0 IPT=/sbin/iptables TC=/sbin/tc $IPT -t mangle -F $TC qdisc del dev $DEV ingress > /dev/null 2>&1 $TC qdisc del dev $DEV root > /dev/null 2>&1 $TC qdisc del dev lo root > /dev/null 2>&1
Die letzten vier Zeilen säubern das System von eventuell zuvor angelegten Regeln.
Tatsächlich interessiert nur der verfügbare Upstream des DSL-Anschlusses. Die Datenpakete im Downstream kommen sowieso so schnell herein, wie sie eben ankommen. In diesem Beispiel gehen wir von einem Anschluss mit einem Upstream von 192kbit aus.
$TC qdisc add dev $DEV root handle 1:0 htb default 12 r2q 6 $TC class add dev $DEV parent 1:0 classid 1:1 htb rate 190kbit ceil 190kbit
In Zeile eins wird das Traffic-Shaping aktiviert. Mit dem Eintrag default 12
wird der Kanal 12
als derjenige festgelegt, der benutzt wird, wenn keine Regel zutrifft. In Zeile zwei wird die maximal verfügbare Bandbreite des Upstreams festgelegt. Hier wählt man sinnvollerweise einen Wert, der geringfügig unter dem tatsächlich höchstmöglichen Wert liegt, damit auf der Empfängerseite (beim Provider) kein Stau entsteht.
Nun werden die eigentlichen Regeln festgelegt, die den Kanälen verschiedene Bandbreiten und Prioritäten zuweisen:
$TC class add dev $DEV parent 1:1 classid 1:10 htb rate 30kbit ceil 190kbit prio 0 $TC class add dev $DEV parent 1:1 classid 1:11 htb rate 60kbit ceil 190kbit prio 1 $TC class add dev $DEV parent 1:1 classid 1:12 htb rate 100kbit ceil 190kbit prio 2
In Zeile eins wird der Kanal 10
definiert (classid 1:10
). Er bekommt immer mindestens 30kbit Bandbreite (rate 30kbit
) und darf maximal 190kbit nutzen (ceil 190kbit
). Zeile zwei und drei legen die Werte für Kanal 11
und 12
analog fest. Die Summe aller rate
-Werte darf die höchstmögliche Bandbreite nicht überschreiten.
Nun muss man den verschiedenen Datenpaketen ihre Kanäle zuweisen. Dazu werden sie markiert:
$IPT -A POSTROUTING -t mangle -o $DEV -p tcp -m length --length :64 -j MARK --set-mark 10 $IPT -A POSTROUTING -t mangle -o $DEV -p udp --dport 53 -j MARK --set-mark 10
In Zeile eins werden alle Pakete mit einer Länge bis zu 64 Byte mit dem Kanal 10
verknüpft. Dies ist ein einfacher Trick, um alle Pakete zu erfassen, die für einen schnellen Verbindungsaufbau nötig sind. Zeile zwei markiert alle Pakete, die für den DNS nötig sind.
Um auch bei großen Downloads per FTP noch schnell surfen zu können, werden nun die Pakete von HTTP-Verbindungen mit dem Kanal 11
verknüpft:
$IPT -A POSTROUTING -t mangle -o $DEV -p tcp --dport 80 -j MARK --set-mark 11
Die Regeln werden nacheinander durchlaufen. Das bedeutet, dass ein Paket auch mehrmals ummarkiert werden kann, falls mehrere Bedingungen zutreffen. Nicht markierte Pakete landen automatisch im default
-Kanal.
Nun muss dem Kernel noch mitgeteilt werden, wie er die verschiedenen Kanäle zu behandeln hat:
$TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11 $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10 $TC qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10
Wer wissen will, was hiermit festgelegt wird, der sehe in der Manpage zu tc nach.
Um das Script automatisch bei jedem Systemstart auszuführen, legt man es zum Beispiel unter dem Namen shaper im Verzeichnis /usr/local/bin/ ab, und lässt es mittels der Datei /etc/rc.local aufrufen.
Verbindungen für TCP-Antwortpakete, DNS, SSH (ein- und ausgehend) und HTTP werden bevorzugt.
#!/bin/sh DEV=ppp0 IPT=/sbin/iptables TC=/sbin/tc $IPT -t mangle -F $TC qdisc del dev $DEV ingress > /dev/null 2>&1 $TC qdisc del dev $DEV root > /dev/null 2>&1 $TC qdisc del dev lo root > /dev/null 2>&1 $TC qdisc add dev $DEV root handle 1:0 htb default 12 r2q 6 $TC class add dev $DEV parent 1:0 classid 1:1 htb rate 190kbit ceil 190kbit $TC class add dev $DEV parent 1:1 classid 1:10 htb rate 20kbit ceil 190kbit prio 0 $TC class add dev $DEV parent 1:1 classid 1:11 htb rate 20kbit ceil 190kbit prio 1 $TC class add dev $DEV parent 1:1 classid 1:12 htb rate 150kbit ceil 190kbit prio 2 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp -m length --length :64 -j MARK --set-mark 10 $IPT -A POSTROUTING -t mangle -o $DEV -p udp --dport 53 -j MARK --set-mark 10 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --dport 22 -j MARK --set-mark 11 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --sport 22 -j MARK --set-mark 11 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --dport 80 -j MARK --set-mark 11 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11 $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10 $TC qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10
Verbindungen für TCP-Antwortpakete, DNS und SSH (ein- und ausgehend) werden bevorzugt. Zudem werden Pakete zu den Ports 6881 bis 6889 (zum Beispiel für Bittorrent) auf einen maximalen Durchsatz von 250kbit beschränkt.
#!/bin/sh DEV=ppp0 IPT=/sbin/iptables TC=/sbin/tc $IPT -t mangle -F $TC qdisc del dev $DEV ingress > /dev/null 2>&1 $TC qdisc del dev $DEV root > /dev/null 2>&1 $TC qdisc del dev lo root > /dev/null 2>&1 $TC qdisc add dev $DEV root handle 1:0 htb default 12 r2q 6 $TC class add dev $DEV parent 1:0 classid 1:1 htb rate 635kbit ceil 635kbit $TC class add dev $DEV parent 1:1 classid 1:10 htb rate 40kbit ceil 635kbit prio 0 $TC class add dev $DEV parent 1:1 classid 1:11 htb rate 60kbit ceil 635kbit prio 1 $TC class add dev $DEV parent 1:1 classid 1:12 htb rate 500kbit ceil 635kbit prio 2 $TC class add dev $DEV parent 1:1 classid 1:13 htb rate 35kbit ceil 250kbit prio 3 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp -m length --length :64 -j MARK --set-mark 10 $IPT -A POSTROUTING -t mangle -o $DEV -p udp --dport 53 -j MARK --set-mark 10 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --dport 22 -j MARK --set-mark 11 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --sport 22 -j MARK --set-mark 11 $IPT -A POSTROUTING -t mangle -o $DEV -p tcp --dport 6881:6889 -j MARK --set-mark 13 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 13 fw flowid 1:13 $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10 $TC qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10 $TC qdisc add dev $DEV parent 1:13 handle 13: sfq perturb 10
Alternatives Wiki Traffic Control , umfassend und allgemein. Unter CC Attribution-Noncommercial-Share Alike 3.0 Unported-Lizenz. Deutsche Übersetzung möglich/erwünscht.
Linux Advanced Routing & Traffic Control HOWTO , immer noch der beste Gesamtüberblick zur Thematik. Pflichtlektüre für jeden, der sich tiefgehender mit Traffic Shaping befassen will.
Dokumentation von Stef Coene Docum.org , viele nützliche Tipps, insbesondere hervorzuheben das Kernel Packet Traveling Diagram.
HSFC Scheduling mit Linux , mächtigere Alternative zum HTB Scheduler
Diese Revision wurde am 8. Oktober 2012 21:50 von UbuntuFlo erstellt.