Linux – Bandbreitenmanagement von Netzwerkverbindungen

Durch die vielfältigen Möglichkeiten im Netzwerkbereich kann Linux sehr gut als Router eingesetzt werden. Nicht umsonst kommt Linux auch auf vielen Hardware-Routern, beispielsweise den Fritz!Boxen von AVM, zum Einsatz.

Steht ein PC mit zwei Netzwerkanschlüssel zur Verfügung, lässt sich daraus mit relativ wenig Aufwand ein Router für Testzwecke aufsetzen. Nachfolgend möchte ich euch zeigen, wie ihr unter Linux die Bandbreite beschränken könnt.

Token Bucket Filter (TBF)

TBF ist ein ein Queueing-Algorithmus der im Grunde nur Pakete weiterleitet. Dabei wird die festgelegte Geschwindigkeit nicht überschritten. TBF arbeitet sehr präzise und benötigt wenig Rechenpower. Um ein kompletten Interface zu verlangsamen sollte deshalb TBF gewählt werden. Weitere Infos zu TBF gibt es hier.

tc qdisc add dev eth0 root tbf rate 2mbit burst 10kb latency 70ms
tc qdisc change dev eth0 root tbf rate 500kbit burst 10kb latency 70ms

# Alle Settings löschen
tc qdisc del dev eth0 root

Mit der ersten Zeile wird die Geschwindigkeit an eth0 auf 2 Mbit/s beschränkt. Dabei ist zu beachten, dass nur ausgehender Traffic davon betroffen ist.
Die zweite Zeile ändert die Bandbreitenbeschränkung auf 500 Kbit/s.
Zum Löschen aller Beschränkungen wird die letzte Zeile angewendet.

Hierarchical Token Bucket (HTB)

HTB eignet sich sehr gut dazu, die verfügbare Bandbreite für verschiedene Verwendungszwecke aufzuteilen. Es arbeitet wie CBQ, hat aber einige Vorteile hinsichtlich Verständlichkeit und Zuverlässigkeit. Hier gibt es weitere Infos zu HTB.

tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil
1mbit burst 10kb
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 800kbit ceil
1mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 200kbit ceil
500kbit
# Zuweisung von Paketen
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
dst 192.168.10.2 flowid 1:10 ## Ziel-IP
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
sport 80 0xffff flowid 1:11 ## Quell-Port

# Weitere Beispiele für Zuweisung von Paketen
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
src 1.2.3.0/24 flowid 1:10 ## Quell-IP
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
dport 80 0xffff flowid 1:11 ## Ziel-Port
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
protocol 1 0xff flowid 1:11 ## ICMP-Protokoll
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
protocol 27 0xff flowid 1:10 ## RDP-Protokol

Die erste Zeile erstellt die “qdisc” für das Interface eth0. “default” gibt an, in welche Klasse der Traffic standardmässig einsortiert werden soll. Dies kann auch weggelassen werden.
Die zweite Zeile erstellt die “Root-Klasse”, welche die maximalen Bandbreite auf 1 Mbit/s limitiert. “ceil” ist das oberste Limit welches möglich ist. “burst” gibt an, dass Daten bis 10 KByte ohne Limitierung übertragen werden dürfen.
Zeile drei und vier legen Klassen fest. Dabei ist darauf zu achten, dass die Summe aller “rate”-Geschwindigkeiten nicht mehr als die “rate” der “Root-Klasse” ergibt. Wenn eine Klasse ihre Bandbreite nicht ausnutzt, wird die übrige Bandbreite unter den restlichen Klassen verteilt. Dabei greift aber wieder “ceil”, welches nicht überschritten werden kann.
Die restlichen Befehle legen fest, welcher Traffic in welche Klasse gehen soll. Im Beispiel werden alle Pakete mit der angegebenen Ziel-IP der Klasse 1:10 zugewiesen. Alle Pakete mit dem Quell-Port 80 werden der Klasse 1:11 zugewiesen. Die Pakete können aber auch nach Ports oder Protokolle (“/etc/protocols”) gefiltert werden, wie in den unteren Beispielen gezeigt wird.
Das Löschen der Settings erfolgt wie bei TBF.

Class Based Queueing (CBQ)

CBQ ist sehr komplex und deutlich schwieriger als TBF und HTB zu konfigurieren. Hier gibt es weitere Infos zu CBQ.

tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 100mbit
tc class add dev eth0 parent 1: classid 1:1 cbq rate 10mbit allot
1500 prio 5
bounded isolated
# Zuweisung von Paketen
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip
dst 192.168.10.2 flowid 1:1 ## Ziel-IP

Die erste Zeile erstellt die “qdisc” für das Interface eth0. Für Kalkulationszwecke gibt man hier die gesamte Bandbreite der Leitung an.
Die zweite Zeile erstellt die “Root-Klasse”, welche die maximalen Bandbreite auf 10 Mbit/s limitiert.
Die fünfte Zeile legt fest, welcher Traffic in die limitierte Klasse gehen soll. Im Beispiel werden alle Pakete mit der angegebenen Ziel-IP der Klasse zugewiesen. Wie bei HTB gezeigt, können die Pakete aber auch anders gefiltert werden.
Traffic, welcher nicht von der Regel betroffen ist, erhält die volle Bandbreite der Leitung.
Das Löschen aller Einstellungen erfolgt wie bei den beiden anderen Beispielen.

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

2 Antworten

  1. thomas_ sagt:

    hui, sehr schicker artikel

    danke :)

    mfg thomas

  2. enyko sagt:

    wie immer sehr infoemativ und kompetent…macht einfach Spaß

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert