Forum

Traffic Shaping mit OS X
Januar 19, 2006, 18:08:56
Was ist Traffic Shaping?
Traffic-Shaping ist ein Verfahren, das die Verteilung der Bandbreite bei Netzwerkübertragungen nach bestimmten Regeln steuert. D.h. für unterschiedliche Anwendungen können unterschiedliche Prioritäten und Übertragungsraten festgelegt werden.

Wozu könnte Traffic-Shaping nützlich sein?
  • Es kann in bestimmten Situationen vorkommen, daß die komplette Bandbreite bei Netzwerkübertragungen belegt wird und dadurch andere parallel stattfindende Übertragungen gestört werden. Besonders auffällig wird dies meistens, wenn vom eigenen Rechner größere Uploads stattfinden (z.B. Verschicken einer großen Mail, ftp-Upload etc.). Durch die vollständige Ausnutzung der Upload-Rate werden auch andere Netzwerkanwendungen (z.B. Browser) stark behindert, denn die notwendigen ACK-Pakete (Bestätigung des korrekten Empfanges) für hereinkommende Daten, DNS-Abfragen und Anforderungen von Daten (z.B. Webseitenabruf) werden nur noch verzögert abgeschickt. Im schlimmsten Fall kommt es zu Time-outs, die eine parallele Arbeit verhindern. Abhilfe würde es schaffen, wenn die Bandbreite der zu verschickenden Daten so limitiert würde, daß immer noch etwas Reserve für andere Anwendungen da ist.
  • Manchmal möchte man testen, wie gut eine Netzanwendung (z.B. Webseite) auch von Nutzern mit langsamer Datenverbindung (z.B. Modem) genutzt werden kann. Anstatt sich nun selber per Modem einzuwählen und kostenintensiv zu testen, kann man die Bandbreite des eigenen Anschlußes kurzzeitig auf die eines langsameren limitieren.

Brauche ich dazu Extra-Software?
Jein. Der Paketfilter ipfw kann eigentlich zum Blocken von Datenpaketen, Traffic Shaping und Einstellen der Paketpriorität verwendet werden. OS X enthält aber nur eine abgespeckte Version von ipfw.
Bis einschließlich Panther (10.3) beinhaltet ipfw nur das Blocken von Datenpaketen. Es wird von der Apple eigenen Firewall (zu Firewalls hier mehr) verwendet. Um Traffic Shaping zu betreiben benötigt man zusätzlich das Freeware-Programm throttled, auf das ich hier aber nicht weiter eingehen möchte.
Ab Tiger (10.4) ist die Fähigkeit des Traffic Shaping im ipfw integriert. Die Priorität von Datenpaketen kann aber immer noch nicht gesteuert werden.

Grundsätzliche Funktionsweise
Normalerweise werden alle Datenpakete direkt mit der höchstmöglichen Geschwindigkeit verarbeitet. ipfw kann als Paketfilter dazwischengeschaltet werden und somit bestimmte Übertragungen verzögern.
Hierzu können neben dem normalen Weg für die Datenpakete bestimmte Kanäle (Pipes) angelegt werden, bei denen man eine Maximalgeschwindigkeit festlegen kann. Alle Datenpakete, die durch diesen Kanal geleitet werden, können zusammen nur noch die Maximalgeschwindigkeit erreichen. Ist diese geringer als die echte Maximalgeschwindigkeit bleibt also immer etwas Bandbreite für wichtigere Anwendungen übrig.
Trotzdem können sich zwei Anwendungen (z.B. Mail verschicken und abholen), die gemeinsam einen Kanal nutzen, immer noch gegenseitig blockieren. Daher kann die Verteilung der Bandbreite eines Kanals an mehrere Anwendungen auch noch gesteuert werden. Dies geschieht über queues.
Klarer wird das bei den Beispielen.

Benutzung
Alle folgenden Befehle müssen mit root-Rechten im Terminal eingegeben werden. Gibt man die Befehle einzeln ein, muß jeweils noch ein "sudo " ohne Anführungszeichen vorangestellt werden. Die Einstellungen sollten nach Möglichkeit nur lokal am einzustellenden Rechner erfolgen, denn wenn man etwas falsch macht, könnte man sich sonst aussperren.

Wenn mal etwas überhaupt nicht mehr funktioniert können durch folgende Anweisung alle Einstellungen wieder entfernt werden:
ipfw flush
Dies zeigt alle aktuellen Einstellungen an:
ipfw show
Syntax zur Erzeugung einer pipe (<pnr> ist die Nummer der Pipe, <speed> ist die maximale Geschwindigkeit):
ipfw pipe <pnr> config bw <speed>
Syntax zur Festlegung einer Queue (<qnr> ist die Nummer der Queue,<pnr> ist die Nummer der Pipe, <anteil> ist der Anteil bei konkurrierenden Übertragungen):
ipfw queue <qnr> config pipe <pnr> weight <anteil>
Syntax zum Festlegen einer Sorte von Datenpaketen zu einer Pipe oder einer Queue(<qnr> ist die Nummer der Queue,<pnr> ist die Nummer der Pipe, <port> ist der Zielport der betroffenen Datenpakete als Zahl oder per Name):
ipfw add pipe <pnr> dst-port <port>
ipfw add queue <qnr> dst-port <port>
Durch zusätzliche Angabe von "in" oder "out" hinter dem Befehl kann eine Beschränkung auf ein- oder ausgehende Pakete erfolgen.

Genug der Theorie, kommen wir mal zu Beispielen. Zwischen den Beispielen sollte man immer alle Regeln wieder löschen (s.o.)

Mail-Verkehr bremsen
Nehmen wir an, wir haben eine DSL-Leitung mit Upload 128KBit/s, dann könnte man das Versenden von Mails auf 90kBit/s begrenzen, um ein gleichzeitiges Surfen nicht zu behindern. Dazu wird eine Pipe 1 mit 90KBit/s festgelegt und die Datenpakete für SMTP dieser Pipe 1 zugeordnet:
ipfw pipe 1 config bw 90kbit/s
ipfw add pipe 1 dst-port smtp
Ist doch gar nicht so schwer, oder? Statt "smtp" im zweiten Befehl kann man auch die Portnummer selber angeben.

Mail und ftp bremsen
Nun soll dafür gesorgt werden, daß das Mail-Versenden und der ftp-Upload begrenzt sind. Dazu wird wieder eine Pipe 1 mit 90 KBit/s festgelegt. Würde mann nun aber wie oben einfach beide Paketsorten der Pipe 1 zuordnen, dann könnten sich immer noch ein Mail-Versenden und ein ftp-Upload in die Quere kommen. Also werden als zweiter Schritt 2 Queues angelegt und festgelegt, daß beide bei Konkurrenz einen Anteil von 50% bekommen, d.h. findet nur ein Vorgang statt, bekommt der 90KBit/s, findet beide gleichzeitig statt, bekommt jeder 45KBit/s. Danach werden die beiden Paketsorten den beiden Queues zugeordnet. Zu beachten ist, daß nur ausgehender ftp-Transfer (Upload) limitiert wird.
ipfw pipe 1 config bw 90kbit/s
ipfw queue 1 config pipe 1 weight 50
ipfw queue 2 config pipe 1 weight 50
ipfw add queue 1 dst-port smtp
ipfw add queue 2 dst-port ftp out

Simulation eines Modems
Es soll ein 56K-Modem simuliert werden. Dazu wird eine Pipe 1 mit 56KBit/s angelegt und aller Transfer zum Web-Browser durch diese Pipe geschickt. Ganz realistisch ist es nciht, denn ein 56K-Modem erreicht je nach Leitungsqualität unterschiedliche Geschwindigkeiten. Nach meinen Erfahrungen meistens 45-50KBit/s.
ipfw pipe 1 config bw 56kbit/s
ipfw add pipe 1 dst-port http

Zum Abschluß
Immer dran denken: Alle Befehle müssen mit root-Rechten (also evtl. mit sudo) eingegeben werden. Wenn man sich verzettelt hat, hilft folgender Befehl alles wieder rückgängig zu machen:
ipfw flushbzw.
Zitat
sudo ipfw flush

Vielen Dank auch an Vollpfosten für Anregungen und Verbesserungen.
« Letzte Änderung: Februar 02, 2006, 09:19:49 von MacFlieger »
_______
Was ist die Mehrheit? Mehrheit ist der Unsinn, Verstand ist stets bei wen´gen nur gewesen." -- Schiller