Open Source im professionellen Einsatz

Traffic Shaping im Userspace mit Trickle

Tropfen für Tropfen

Verstopfen zu viele Anwendungen die eigene Internetleitung, stellt sich schnell der Wunsch ein, den Netzwerkverkehr besser zu steuern. Dem steht oft die komplizierte Konfiguration entgegen. Trickle ermöglicht einfaches Traffic Shaping ohne Netzwerk-Diplom.

Dass die um eine Leitung konkurrierenden Applikationen aufeinander keine Rücksicht nehmen, haben die anderen Artikel in diesem Schwerpunkt schon erläutert. Was der Administrator dagegen tun kann, auch: Er muss eine feine Steuerung aus- und eingehender Pakete organisieren. Dafür bietet Linux ein ausgefeiltes System, das Traffic Shaping in allen Varianten mit unterschiedlichsten Algorithmen ermöglicht. Wem das alles zu groß, zu aufwändig und zu systemnah ist, der greift zu Trickle (träufeln).

Shaping im Userspace

Trickle [1] verspricht die Traffic-Probleme im Userspace zu lösen. Nicht mal Administratorrechte sind dazu nötig, zum Kompilieren allerdings die Libevent [2]. Im Gegensatz zu anderen Ansätzen braucht Trickle keine Kernelmodule und muss nicht aufwändig konfiguriert werden, einige Parameter genügen.

Trickle bedient sich eines bekannten Mechanismus, um sich zwischen Applikationen und den Netzwerk-Stack zu schieben: »LD_PRELOAD«, eine Umgebungsvariable, die den dynamischen Linker dazu anweist, eine bestimmte Bibliothek zu laden, bevor er auf die Glibc zurückgreift. Damit lassen sich gezielt einzelne Funktionen der Standardlibraries durch eigene überschreiben.

Im Normalfall stellt die Glibc die Netzwerkfunktionen und damit die Schnittstelle zur entsprechenden Kernelfunktionalität bereit. Trickle aber lädt beim Start über »LD_ PRELOAD« eine eigene dynamische Bibliothek, die entsprechende Netzwerkfunktionen enthält, jedoch nur TCP-Funktionen wie »socket()«, (Abbildung 1). Statt auf Funktionen der Glibc greifen Anwendungen nun erst auf die Trickle-Versionen zu, die schließlich die Bandbreitenanpassung vornehmen. Die Trickle-Funktionen ihrerseits rufen die Glibc-Verwandten auf, wenn sie ihre Buchführung erledigt haben. Um an die Originalfunktionen zu kommen, verwendet Trickle die Bibliotheksfunktion »dlopen()«.

Abbildung 1: Die Trickle-Bibliothek ersetzt über »LD_PRELOAD« einige Netzwerkfunktionen der Glibc durch eigene Versionen, die den Datendurchsatz überwachen und regeln.

Abbildung 1: Die Trickle-Bibliothek ersetzt über »LD_PRELOAD« einige Netzwerkfunktionen der Glibc durch eigene Versionen, die den Datendurchsatz überwachen und regeln.

Weil der beschriebene Mechanismus dynamische Bibliotheken nutzt, funktioniert Trickle nicht mit statischen Binaries. Genauso versagt Trickle bei SUID-Programmen, denn bei denen ist aus Sicherheitsgründen der »LD_PRELOAD«-Mechanismus ausgeschaltet.

Natürlich können auch die restlichen Anwendungen - in der Regel wohl Clients - selbst diesen Mechanismus nicht ohne weiteres benutzen. Deshalb ist es nötig, sie mit dem Programm »trickle« aufzurufen, das das Preloading übernimmt. Ein Limit nur für die Download-Rate des gestarteten Programms anzugeben ist Aufgabe des Trickle-Schalters »-d«:

trickle -d 50 ftp ftp.host.domain


Damit überwacht Trickle, dass die mit »ftp« aufgebaute FTP-Verbindung in Download-Richtung im Durchschnitt unter 50 KBytes/s bleibt. Für den Upload kennt Trickle die Option »-u«. Abbildung 2 zeigt den Verlauf eines Web-Downloads unter Trickles Kontrolle.

Abbildung 2: Trickle reguliert einen Web-Download auf eine durchschnittliche Rate von 50 KBytes/s. Zu Beginn ist die Abweichung vom eingestellten Wert am größten, da sich das System erst einschwingen muss.

Abbildung 2: Trickle reguliert einen Web-Download auf eine durchschnittliche Rate von 50 KBytes/s. Zu Beginn ist die Abweichung vom eingestellten Wert am größten, da sich das System erst einschwingen muss.

Daemon steuert zentral

Andere, gleichzeitig laufende FTP-Programme bleiben von Trickles Eingriffen unberührt. Um den Netzwerkverkehr umfassend zu regulieren, müssen also alle relevanten Programme unter Trickles Kontrolle gestellt werden. Der Daemon »trickled« führt über alle Trickle-Verbindungen Buch und regelt so die Gesamtbandbreite. Auch der Daemon kennt die Parameter »-d« und »-u«:

trickled -d 50 -u 5 -f -N 5


In diesem Fall stehen die Parameter aber für die Gesamtbandbreite der beteiligten Programme. Der obige Befehl setzt also die gesamte Download-Rate auf 50 und die Upload-Rate auf 5 KByte/s fest. Der Parameter »-f« sorgt dafür, dass der Daemon im Vordergrund läuft, »-N 5« lässt ihn alle fünf Sekunden eine Statistik ausgeben. Ohne den Parameter »-d« setzt Trickle Upload- und Downloadrate auf 10 KByte/s. Für dauerhafte Einstellungen liest der Daemon die Konfigurationsdatei »/etc/trickled.conf« (Default) oder die hinter »-c« angegebene.

Läuft der Daemon, nehmen die »trickle«-Instanzen bei ihrem Start mit ihm Kontakt auf (normalerweise über den Unix-Socket »/tmp/.trickled.sock«) und regeln nach seinen Vorgaben ihre jeweiligen Clientprogramme. Bricht die Verbindung zum Server ab, arbeitet »trickle« weiter, vergisst aber die ursprünglichen Vorgaben. Läuft der Server zum Beispiel mit einem Download-Limit von 10 KByte/s, hält ein anschließend gestartetes »trickle wget http://www.server.domain/datei« diese Vorgabe ein. Bricht der Benutzer den Server während des Downloads ab, geht die Rate nach oben.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook