Linux Router: Traffic priorisieren

Root_GER

Cadet 4th Year
Registriert
Nov. 2015
Beiträge
121
Hallo :)

Ich nutze z.Z. einen Linux-Router (Debian).

Ich möchte nun die einzelnen verbundenen Clients priorisieren. Bestenfalls über die MAC, andernfalls über die lokale IP.

Wie stelle ich das am besten an? Der Router verfügt über zwei Netzwerkkarten:
• eth0 = Routing zum Internet (WAN)
• eth1 = lokales Netzwerk (LAN)

Der komplette Traffic geht über den Linux-Router, welcher dann alles zum Internet routet.

Ich möchte alle Clients in der Bandbreite priorisieren, nicht nur einzelne Ports!

Client1: limitiert auf 5 MBit, Prio2 (IP: 10.10.0.10, MAC: bb:bb:bb:bb:bb:bb)
restliche Clients: Unlimitiert, Prio1 (IP: 10.10.0.20 - .254)
...

Wie mache ich das am besten? 🙂

Ich google schon seit Stunden und finde nichts brauchbares ...
 
Root_GER schrieb:
Ich google schon seit Stunden und finde nichts brauchbares ...
Das liegt an den Suchbegriffen.
Probiers mal mit traffic shaping.

Üblicherweise wird das bei NetFilter so realisiert, dass Du verschiedene Queues anlegst wo Du dann bestimmte Parameter festlegen kannst (wie eben z.B. den Durchsatz) und Du dann die einkommenden/ausengenden IP-Pakete entsprechend auf die Queues verteilst.
 
  • Gefällt mir
Reaktionen: Raijin
Danke für die Info!

Ich habe nun ein Skript gefunden, das aber leider nicht funktioniert.

Das Skript habe ich von hier: https://gist.github.com/guddl/edc113cb08219f8b6a5f658d2781f822

Mein geändertes Skript (nur IP und Bandbreite geändert):

Code:
#!/bin/bash

NETCARD=eth0
MAXBANDWIDTH=100000

# reinit
tc qdisc del dev $NETCARD root handle 1
tc qdisc add dev $NETCARD root handle 1: htb default 9999

# create the default class
tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999

# control bandwidth per IP
declare -A ipctrl
# define list of IP and bandwidth (in kilo bits per seconds) below
ipctrl[10.10.0.10]="1000"
ipctrl[10.10.0.20]="500"

mark=0
for ip in "${!ipctrl[@]}"
do
    mark=$(( mark + 1 ))
    bandwidth=${ipctrl[$ip]}

    # traffic shaping rule
    tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark

    # netfilter packet marking rule
    iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark

    # filter that bind the two
    tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark

    echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps"
done

#propagate netfilter marks on connections
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark

Es kommt beim Ausführen des Skripts (habe es "limit.sh" genannt) folgende Meldung:

Code:
sudo ./limit.sh

Error: Invalid handle.
IP 10.10.0.10 is attached to mark 1 and limited to 1000 kbps
IP 10.10.0.20 is attached to mark 2 and limited to 500 kbps

Teste ich die Bandbreite am Client, ist alles so, als gäbe es kein Limit.
 
Ich weiß nicht, ob es hilfreich ist sich einfach fertige Skripte zu nehmen. Wichtig wäre eher, das Du weißt was Du tust. Dann kann man von mir aus auch ein fertiges Skript als Grundlage nehmen, um das entsprechend anzupassen.

Auf der nftables-Homepage findet man generell Informationen und Howtos:
https://wiki.nftables.org/wiki-nftables/index.php/Main_Page

Auf ubuntuusers.de findet sich auch ein Artikel explizit zu Traffic Shaping. Das ist zwar noch alter iptables-Kram, funktioniert aber im Grunde auch. Da gibts auch ein Traffic-Shaping-Skript. Du musst lediglich die Selection der Pakete anpassen. Dort wirds nach Source- und Destinationports gemacht. Das wirfst Du raus und selektierst nach Source- und Destination-Adressbereich (also Optionen --src bzw --dst ; siehe dazu auch die Manpage von iptables: https://linux.die.net/man/8/iptables ).
https://wiki.ubuntuusers.de/Skripte/Traffic-Shaping/
 
  • Gefällt mir
Reaktionen: netzgestaltung und snaxilian
Ich habe jetzt eine fertige (einfache) Software gefunden, mit der ich die Daten drosseln kann: "Evillimiter".

Leider ist es so, wenn ich ein Limit setze, dass dies nur für den Upload gilt.

Ich setze limit 0 800kbit (0 ist der betroffene Client), dann habe ich weiterhin offenen Download, aber im Upload nur noch 800 KBit. Wie kann ich jetzt den Download noch drosseln?

Selbst wenn ich limit 800kbit --download angebe, wird der Download nicht gedrosselt.
 
Ich vermute mal, das ist so ein Tool was letztlich im Hintergrund auch nur entsprechende tc-Queue-Definitionen und iptables-Einträge macht.
Das bedeutet dann, das man sich mal die erzeugten Regeln angucken kann (iptables --list usw.) und dann möglicherweise schon das Problem sieht.
Ich weiß aber nicht, ob diese Vorgehensweise an der Stelle sinnvoll ist.

Es nützt Dir auch nix einfach nur irgendwie ein Skript oder sowas auf Deinen Debian-Server zu kippen. Wenn der irgendwie den Zugang zum Internet regelt und Routing macht und dann ggf. noch NAT usw. dann sind da eh schon genau dafür viele NetFilter-Regeln. Es nützt nix wenn Du da noch einfach aus nem anderen Kontext stumpf ein paar Regeln hinzufügst. Weil die werden nicht beachtet und/oder sind im Konflikt zu bestehenden Regeln oder sonstwas.

Die zweite Frage ist auch, welches Problem Du lösen willst. Du willst ja nicht ohne Grund einzelne Rechner priorisieren. Meist hat man so ein Setting im heimischen LAN das sich halt alle eine Internetverbindung teilen. Weil aber der kleine Bruder sich ständig irgendwelche TikTok-Videos reinzieht ist die Leitung ständig dicht und man selbst kann gar nicht mehr seine Online-Games zocken oder weiß der Geier was.

Die naheliegende Idee ist halt, das man die ungeliebten Breitbandfresser runterlimitiert. Meist ist das aber gar nicht nötig. Denn die Automatismen sorgen eigentlich schon dafür das das Netz sich relativ gut selbst regelt.
Das Problem liegt häufig darin, Traffic in Puffern zwischengespeichert wird und der jeweilige Netzwerkteilnehmer in wirklichkeit halt mit diesem Zwischpuffer redet und der sagt (Congestion Control): "ja gib mal weiter IP-Pakete" obwohl er die gar nicht schnell genug weiterleiten kann. Aber er speichert sie halt im Puffer zwischen und solange der nicht voll ist, ist es aus seiner Sicht ok weiter in ungehinderter Geschwindigkeit Daten anzunehmen (Bufferbloat - Phänomen).

Eine einfache und effektive Maßnahme kann sein einfach ein globales Traffic-Shaping vorzunehmen. Man sagt also nicht für einzelne Rechner oder Ports, das ne bestimmte Bandbreite zur Verfügung steht, sondern man begrenzt halt sämtlichen Traffic.
Das Gute ist, das ist halt sehr einfach umzusetzen. Selbst Plastikrouter die man so zuhause stehen hat haben oftmals sowas schon.
Und ich weiß jetzt nicht, wie Du das bei Deinem Debian-Router machst, aber wenn Du da für Routing/NAT auch irgendwie was Fertiges verwendest, dann ist durchaus ne gute Chance da, das es da auch ne Einstellung für gibt. Evtl. mindest es Dein Problem schon deutlich ab und Du ersparst Dir da umständlich Traffic-Shaping-Rules bei Dir reinzuoperieren. Weil wie gesagt: Das ist mit irgendwie nen Skript ausführen meist nicht getan.
 
  • Gefällt mir
Reaktionen: netzgestaltung
Die Frage ist, was man erreichen will. Ein reines "Hardcap" (oder Hardlimit), was nicht zwangsläufig eine verbesserte Routingqualität bedeutet oder tatsächlich QoS (quality of service). Gerade letzteres ist eine Wissenschaft für sich und ein heiliger Gral scheinen nach wie vor SQM + DSCP marks zu sein. SQM benutze ich selbst, und ja, es ist durchaus ein erhebendes Gefühl bei "dslreports" ein A+ Ranking zu bekommen. Mit priorisieren verschiedener Clients hat das aber erst mal nicht viel zu tun.

Vielleicht solltest Du mal genauer erläutern, warum Du speziell MAC Adressen priorisieren willst und nicht deren Traffic-/Routingqualität. Oder vielleicht meinst Du das ja sogar und es ist lediglich nur nicht so formuliert worden.
 
Zuletzt bearbeitet:
Ich möchte sowas wie QoS realisieren (Gerät 1 hat Prio1, alles andere Prio2) bzw alle anderen Geräte, außer "Gerät 1", in der Geschwindigkeit drosseln.

Letzteres wäre eine Option, falls man QoS nicht leicht realisieren könnte.

Ich habe ja "Evillimiter" ausprobiert, aber leider drosselt es nur den Upload, aber nicht wie versprochen, den Download.

An was kann es liegen? Der Entwickler verspricht zumindest, dass der Download auch begrenzt werden kann, nur es funktioniert nicht wirklich 🙄

Priorisieren bzw drosseln möchte ich, dass die "Leitung" (es ist eine LTE-Funkverbindung für Zuhause) nicht dicht ist und der Ping auch nicht immens steigt
 
Root_GER schrieb:
Ich habe ja "Evillimiter" ausprobiert, aber leider drosselt es nur den Upload, aber nicht wie versprochen, den Download.
Das liegt in der Natur der Sache. Wie Du IP-Pakete rausschickst kannst Du halt direkt beeinflussen. Wie IP-Pakete ankommen eher nicht. Die kommen halt rein wie sie reinkommen. Und es nützt Dir ja auch nix da Prio2-Pakete zu verwerfen und auf Prio1-Pakete zu warten. Dann sinkt lediglich die Downloadrate von Prio2-Geräten ohne das Dein Kram schneller ankommt.
Das bedeutet nicht, das man keinen Einfluss nehmen kann (z.B. kann man bei TCP durch den Congestion-Control-Mechanismus einen gewissen Einfluss nehmen). Aber unmittelbar ist das halt eher schwierig. Und Kenntnisse von Vorteil.

Root_GER schrieb:
Der Entwickler verspricht zumindest, dass der Download auch begrenzt werden kann, nur es funktioniert nicht wirklich 🙄
Ich hab ja schon mal angeboten, das du die erzeugten iptables-Regeln und erzeugte Queue-Konfig. hier postest, das man da mal drüber gucken kann. Wenn Du dem nicht nachkommst, dann sind auch dem engagiertesten Hilfeversuchen Grenzen gesetzt.
 
andy_m4 schrieb:
Ich hab ja schon mal angeboten, das du die erzeugten iptables-Regeln und erzeugte Queue-Konfig. hier postest, das man da mal drüber gucken kann

Hier einmal die ganzen iptables-Regeln:

Code:
 $ sudo iptables-save
# Generated by xtables-save v1.8.2 on Wed Apr  7 10:16:34 2021
*nat
:PREROUTING ACCEPT [1985:302138]
:INPUT ACCEPT [352:37997]
:POSTROUTING ACCEPT [2:158]
:OUTPUT ACCEPT [43:3097]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Wed Apr  7 10:16:34 2021
# Generated by xtables-save v1.8.2 on Wed Apr  7 10:16:34 2021
*filter
:INPUT ACCEPT [4930:538145]
:FORWARD ACCEPT [161132:172132722]
:OUTPUT ACCEPT [1157:134837]
COMMIT
# Completed on Wed Apr  7 10:16:34 2021
# Generated by xtables-save v1.8.2 on Wed Apr  7 10:16:34 2021
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Apr  7 10:16:34 2021

Wo finde ich diese "Queue Config"? Via Google habe ich nichts zu dem Begriff gefunden :(
 
Root_GER schrieb:
Hier einmal die ganzen iptables-Regeln:
Da ist gar nix großartig konfiguriert. Das ist im wesentlichen nur Default-Handling und die einzige Regel die was macht ist das Masquerading in Zeile 8.

Was auch immer Du gemacht hast ist nicht wirksam geworden. Vielleicht weil ein nichtexistentes Netzwerkdevice angegeben wurde. Oder weil ein Programm/Skript schon mal gemachte Einstellungen überschrieben haben.

Root_GER schrieb:
Wo finde ich diese "Queue Config"?
Das macht man über das Kommando tc.
tc class show dev netdev
kriegst Du die derzeitigen Einstellungen. Wobei Du netdev mit dem Netzwerk-Gerät ersetzen musst auf dem Deine TrafficControl läuft (also eth0 oder wie auch immer die bei Dir heißt; die verfügbaren Netzwerkdevices kannst Du Dir mit ip link auflisten lassen).
 
andy_m4 schrieb:
Da ist gar nix großartig konfiguriert. Das ist im wesentlichen nur Default-Handling und die einzige Regel die was macht ist das Masquerading in Zeile 8.
Das Ding ist aber, der Upload wird auf meinen angegebenen Wert gedrosselt, wenn ich in "Evillimiter" limit 0 500kbit eingebe (0 ist der zu drosselnde Client).

Der Download wird, auch wenn ich nur den Upload drossel, nur minimal langsamer:
bei 500 kbit Upload kommen im Download nur noch ~30MBit von ~50MBit an, bei 200kbit Upload kommen nur noch ~15Mbit Download an. Der Download selber lässt sich aber noch nicht auf meinen Wert reduzieren...


Dieser Befehl sollte Down- und Upload gleichermaßen reduzieren:

Code:
(Main) >>> limit 0 500kbit
OK   10.10.0.10 upload / download limited to 500kbit.


Hier noch die gewünschte Konfig:

Code:
$ sudo tc class show dev eth0
class mq :1 root
class mq :2 root
class mq :3 root
class mq :4 root
class mq :5 root


andy_m4 schrieb:
Was auch immer Du gemacht hast ist nicht wirksam geworden. Vielleicht weil ein nichtexistentes Netzwerkdevice angegeben wurde.
Ich habe zwei Netzwerkkarten zur Verfügung: eth0 (WAN-Seite) und eth1 (LAN-Seite).
Konfiguriere ich "Evillimiter" auf eth1, wird gar nichts gedrosselt. Nur auf eth0 zeigt es wenigstens beim Upload Wirkung.
 
Root_GER schrieb:
Der Download selber lässt sich aber noch nicht auf meinen Wert reduzieren...
Wie schon im Thread gesagt: Der Download lässt sich nicht direkt regeln. Die IP-Pakete kommen eben rein wie sie reinkommen. Da hast Du keinen (direkten) Einfluss drauf. Klar könntest Du dann im LAN die Pakete via FIFO-Buffer verzögert weitersenden und da dann Traffic-Shaping machen. Würde Dir aber nichts nützen, weil der Flaschenhals ist der Uplink zum Internetprovider.

Wo Du überhaupt nur direkt Einfluss nehmen kannst ist der Upload. Damit kannst Du dann auch mittelbar auf die Download-Rate Einfluss nehmen. Und zwar bei TCP/IP (kommt beim surfen zum Einsatz; üblicherweise auch bei Downloads; aber nicht z.B. bei Videotelefonie; da nimmt man eher UDP/IP).
Wie funktioniert die mittelbare Einflussnahme? Bei TCP muss Datenempfang bestätigt werden. Wenn A nach B also ein TCP-Paket schickt, muss B nach A ein Bestätigungspaket (TCP-ACK) schicken. Dadurch weiß A ob ein Paket auch angekommen ist. Damit kann er auch feststellen, ob er vielleicht in zu kurzer Zeit zuviele Pakete schickt.
Über diese ACK-Pakete ins Internet (die für Dich ja Dein Upload sind) hast Du dann eben indirekte Einflussmöglichkeit auf die Downloadrate.
Deshalb tut sich bei der Download-Rate auch was, wenn Du an der Upload-Geschwindigkeit etwas änderst.

Root_GER schrieb:
Hier noch die gewünschte Konfig:
Auch das sieht nicht danach aus, als ob da großartig was konfiguriert wurde.

Ich würde an Deiner Stelle noch mal versuchen sozusagen zu Fuß eine eigene Konfiguration zu erstellen (die Links dazu wurden ja schon genannt).
Generell darf man das aber wie gesagt nicht so vorstellen, das Traffic-Control so funktioniert das man irgendwo feste Dowloadraten einträgt und das dann stumpf so zugeteilt wird (also kann man im Prinzip schon machen, fängt sich dann aber andere Probleme ein).

Es geschieht halt auch viel durch automatische Regelungen die dann auch dynamisch reagieren, wenn Du an einer Stelle was änderst.
Die Vorgehensweise ist eher so, das man genau guckt welcher Traffic im LAN so passiert (um auch Ursachen für Staus exakt auszumachen), dann an einer Stellschraube dreht die möglicherweise ganz woanders ist (wie hier halt via Upload-Steuerung den Download beeinflussen). Und dann schaut man wie sich das auswirkt und reguliert dann nach, bis man halt ein möglichst passendes Setup gefunden hat.
Das ist schon ein bissl Fummelei und es ist durchaus von Vorteil, wenn man weiß wie IP und die Datenübertragung mit IP funktioniert.
 
Man könnte das vielleicht mit FireQOS realisieren, ob das allerdings auch ohne Firehol läuft weiß ich nicht. Firehol steuert die Firewallregeln und könnte daher mit deinem bestehenden Setup kollidieren.
 
Zurück
Oben