# Bandbreiten Begrenzung

## LaMagra

Hallo

Bandbreitenbegrenzung ist momentan noch Neuland für mich und ich weiss nicht so recht was ich da nehmen kann/soll.

Also ich habe hier in einem Netzwerk einen kleinen Samba Server laufen und ich möchte ihn so einstellen, dass ein Client mit z.B. maximal 1 MB pro Sekunde runterladen kann jedoch mit voller Geschwindigkeit auf meinen Server hochladen kann.

Server: 172.23.143.2

Clients: 172.23.xxx.xxx

Gibt es eine Software mit der ich die Bandbreite zuteilen kann? Zum Beispiel dass der Client 172.23.143.1 die volle Bandbreite zur Verfügung hat und die Clients aus dem Bereich 172.23.111.1 - 172.23.111.254 jeweils mit maximal 1 MB pro Sekunde herunterladen können? Am besten wäre noch wenn diese Software einfach mit emerge ... zu installieren ist.

Ich habe schonmal vorsorglich den ganzen QoS kram in meinen 2.6 Kernel kompiliert da ich mal vermute dass ich diese Sachen dafür brauche.

Weiss da jemand weiter?

----------

## schachti

Evtl. hilft Dir dieses Howto: http://gentoo-wiki.com/HOWTO_Packet_Shaping. Aber Achtung: Das ist keine einfache Aufgabe...

----------

## LaMagra

Danke für den Link aber ich glaube das ist nicht ganz das was ich brauche.

```
Well you don't need much. A computer running gentoo/linux, which has two network interfaces should suffice. I have been running this on a 200 MHz machine, and I believe even smaller machines can handle it.
```

Ich habe ja nur einen Samba Server mit einer Netzwerkarte von der ich den ausgehenden Traffic IP basierend begrenzen will.

----------

## schachti

Das Prinzip ist aber das selbe.

----------

## NightDragon

Ich würde das gern mal hier erklärt bekommen im groben wie das abgeht weil ichs auch noch nicht (verwende HTB oder möchts gern verweden) zum laufen bekommen habe...

Wie geht das genau?

Ich erstelle die HTB-Regeln oder?

dann erstelle ich iptables-Regeln?

dann markiere ich die gewünschten packete?

und dann?

Ich würd gern auch so ein wirklich voll keines praktisches beispiel sehen.

z. bsp. die begrenzung a) einmal von einem protokoll (z. bsp. http)

und dann von einer ip und dann kombiniert...

Kann mir da wer was schnell hinschreiben oder so?

Nur zur veranschaulichung - ich bekomms trotz der ganzen howtos nicht hin.

----------

## schachti

Die Idee ist die folgende: Zunächst erstellst Du die qdiscs. Jede qdiscs hat eine bestimmte maximale Transferrate, Du kannst Dir also jede qdisc als ein künstliches Nadelöhr vorstellen.

Dann überlegst Du Dir, welche Art von Traffic (z. B. nach bestimmten Ports, nach Quelle oder Ziel oder sonstwas) Du drosseln möchtest, und schickst die entsprechenden Pakete mit Hilfe geeigneter iptables Regeln in eine der qdiscs. Alle Pakete, die in die gleiche qdiscs gehen, teilen sich die maximale Transferrate, die für diese qdisc festgelegt wurde.

Wenn Du zum Beispiel verschiedene Rechner hinter einem Router hast, könntest Du für jede IP eine eigene qdisc anlegen, so daß Du für jeden Rechner hinter dem Router eine maximale Transferrate angeben kannst. Oder Du kannst allen p2p-Traffic in eine stark eingeschräbkte qdisc schicken und dadurch dafür sorgen, daß für den anderen Traffic auf jeden Fall genug Bandbreite übrig ist (nämlich gesamte Bandbreite minus Bandbreite der qdisc).

----------

## NightDragon

Okay Dnake für die Info - so in etwa hatte ich es auch verstanden.

Ich habe auch einige qdiscs erstellt

Markiere quasi schon die Packete mit iptables (geht ja auch einfach) und laut ht usw... kommen auch daten an.

NUR... irgendwie ignoriert er die Daten. Ich habe es so getestet das ich mir ein video via wget runterlade aus dem netz und habe einfach http auf 10 kb/sec gedrosselt - es wird aber vollkommen ignoriert.

Also aufbau ist so: Internet - HW-Router - Class A/16  netz1 - gentoorouter mit qdiscs usw... - client

Und wie muss ich vorgehn?

Bei ausgehenden Traffic muss ich die packete die empfangen werden LAN-seitig makiert werden und beim eingehenden muss ich die empfangenen pakcete WAN-seitig markieren oder?

Ich hab das nicht ganz Verstanden welche packete ich maskieren muss.

Also -i WAN bei downstream 

und -i LAN bei upstream

----------

## TheSmallOne

 *NightDragon wrote:*   

> Ich habe auch einige qdiscs erstellt
> 
> Markiere quasi schon die Packete mit iptables (geht ja auch einfach) und laut ht usw... kommen auch daten an.
> 
> NUR... irgendwie ignoriert er die Daten. 

 

Also, wenn die Beschreibung oben alles ist, dann it das kein Wunder...

Du brauchst die Qdiscs... das ist schonmal richtig.

Als nächstes brauchst du jedoch einen Filter, der die Pakete in die Qdisc einsortiert. iptables markiert die Pakete nur, du musst dann noch nch diesen markierten Paketen filtern.

Nebenbei: Irgendwie verstehe ich nicht wirklich, wieso eigentlich fast immer die Kombination:

"iptables markiert die Pakete, gefiltert wird nach Markierungen" verwendet wird, obwohl die Filter, die mit tc gesetzt werden können doch mindestens genauso mächtig sind, wie es iptables ist, und sogar noch mehr können... da lediglich nach Markierungen zu suchen ist doch totale Unterforderung.

----------

## NightDragon

Naja... wahrscheinlich weil die sache mit iptables etwas einfacher ist wie mit tc.

Hm. Kannst du mir mal das anhand eines beispieles hier zeigen? Also einfache regel  - usw...?

Das ichs mal als befehl sehe...

----------

## think4urs11

Hi NightDragon,

hast du Lartc schon gelesen? Eine ziemlich erschöpfende Erklärung zum Thema advanced Routing und Traffic control.

HTH

T.

----------

## slick

 *NightDragon wrote:*   

> Naja... wahrscheinlich weil die sache mit iptables etwas einfacher ist wie mit tc. 
> 
> Hm. Kannst du mir mal das anhand eines beispieles hier zeigen? Also einfache regel - usw...? 
> 
> Das ichs mal als befehl sehe...

 Beispiele findet man u.a. hier und hier und ganz viele hier...

----------

## LaMagra

Ich habs nun einigermaßen hinbekommen den ausgehenden Traffic zu begrenzen. Nun habe ich vor die Geschwindigkeit für jedes Subnetz zu begrenzen. Das soll ungefähr so aussehen:

172.23.10.xxx : 10 mbit

172.23.11.xxx : 10 mbit

172.23.13.xxx : 10 mbit

172.23.14.xxx : 10 mbit

172.23.15.xxx : 10 mbit

172.23.16.xxx : 10 mbit

172.23.17.xxx : 10 mbit

172.23.18.xxx : 25 mbit

172.23.19.xxx : 25 mbit

172.23.20.xxx : 50 mbit

Wenn z.B. einer etwas herunterlädt soll er 10mbit zur Verfügung haben. Wenn zwei etwas herunterladen, soll jeder jeweils 10 mbit zur Verfügung haben. 

Ist das jetzt so dass ich für jedes Subnetz eine class erstellen muss?

Wenn ich zwei Subnetze auf eine class verweise, teilen sich diese dann z.B. die 10 mbit?

Ich habe schon zu Testzwecken was kleines vorbereitet was auch funktioniert. Ich hoffe mal es enthält keine Fehler.

```
#!/bin/sh

#

# Shell-Skript für Bandbreitenbegrenzung

# bestehenden Einstellungen löschen

tc qdisc del dev eth0 root

# Neue Einstellungen

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 100mbit allot 1500 prio 1 bounded isolated

tc class add dev eth0 parent 1: classid 1:2 cbq rate 50mbit allot 1500 prio 5 bounded isolated

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.143.0/24 flowid 1:1

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.98.0/24 flowid 1:1

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.0.0/16 flowid 1:2
```

Was ich noch nicht verstanden habe sind die prioritäten im filter und in der class. Wie wende ich sie an um z.B. einem bestimmten Subnetz den vorzug zu geben falls eth0 voll ausgelastet ist?

Bitte nicht lachen falls ihr dumme Fehler findet  :Wink: 

----------

## LaMagra

Moin 

Ich bekomme nen Haufen Kernel Nachrichten

```
Apr 26 23:00:28 [kernel] CBQ: class 00010074 has bad quantum==0, repaired.

Apr 26 23:00:28 [kernel] CBQ: class 00010047 has bad quantum==0, repaired.

Apr 26 23:00:28 [kernel] CBQ: class 00010115 has bad quantum==0, repaired.

Apr 26 23:00:28 [kernel] CBQ: class 00010050 has bad quantum==0, repaired.

Apr 26 23:00:28 [kernel] CBQ: class 00010135 has bad quantum==0, repaired.
```

Wie behebe ich das? bzw. hat jemand ne Idee wie ich das optimieren kann?

Mein shaper script sieht so aus:

```
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 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:2 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:3 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:4 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:5 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:6 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:7 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:8 cbq rate 15mbit allot 1500 prio 5 bounded isolated

tc class add dev eth0 parent 1: classid 1:9 cbq rate 15mbit allot 1500 prio 5 bounded isolated

... geht weiter bis 254

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.1.0/24 flowid 1:1

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.2.0/24 flowid 1:2

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.3.0/24 flowid 1:3

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.4.0/24 flowid 1:4

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.5.0/24 flowid 1:5

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.6.0/24 flowid 1:6

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.7.0/24 flowid 1:7

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.8.0/24 flowid 1:8

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 172.23.9.0/24 flowid 1:9

geht auch weiter bis 254
```

----------

## return13

Also so oft wie das Thema hier aufgetaucht ist finde ich wird es höchste Zeit maln übsichtliches, nachvollziehbares tutorial zu schreiben...

Na, fühlt sich vielleicht irgend jemand angesprochen???

----------

## think4urs11

Gibts doch schon, halt nur in englisch: HowTo: Bandwidth Limiting

HTH

T.

----------

